diff --git a/README.md b/README.md
index 799fe26d..3c01a21a 100644
--- a/README.md
+++ b/README.md
@@ -66,8 +66,8 @@ The default configurations are read from [appsetting.json](src/Blockcore.Indexer
       // Syncing parameters
       "SyncBlockchain": true,
       "SyncMemoryPool": true,
-      "MongoBatchSize": 10000000,
-      "MongoBatchCount" : 10000,
+      "DbBatchSize": 10000000,
+      "DbBatchCount" : 10000,
       "ParallelRequestsToTransactionRpc": 50,
       "DetailedTrace": 0,
       "MaxItemsInQueue": 10,
@@ -226,4 +226,4 @@ Blockcore.Indexer.Client.BitcoinCommunicationException: Daemon Failed Url = 'htt
  ---> System.Net.Sockets.SocketException (111): Connection refused
 ```
 
-Issue: This happens when the DNS name is not accessible.
\ No newline at end of file
+Issue: This happens when the DNS name is not accessible.
diff --git a/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs b/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs
index d82d9ca8..23e44732 100644
--- a/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs
+++ b/src/Blockcore.Indexer.Angor/Storage/Mongo/Types/Investment.cs
@@ -1,4 +1,4 @@
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 
 namespace Blockcore.Indexer.Angor.Storage.Mongo.Types;
 
diff --git a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs
index 68f8233b..4b6a864d 100644
--- a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs
+++ b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectTransactionsSyncRunner.cs
@@ -3,6 +3,7 @@
 using Blockcore.Indexer.Angor.Storage.Mongo.Types;
 using Blockcore.Indexer.Core.Settings;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using Blockcore.Indexer.Core.Sync.SyncTasks;
 using Blockcore.NBitcoin.DataEncoders;
 using Microsoft.Extensions.Options;
diff --git a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs
index 3cd749b8..6becda85 100644
--- a/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs
+++ b/src/Blockcore.Indexer.Angor/Sync/SyncTasks/ProjectsSyncRunner.cs
@@ -6,6 +6,7 @@
 using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using Blockcore.Indexer.Core.Sync.SyncTasks;
 using Blockcore.NBitcoin;
 using Blockcore.NBitcoin.BIP32;
diff --git a/src/Blockcore.Indexer.Angor/appsettings.json b/src/Blockcore.Indexer.Angor/appsettings.json
index 41b5bdd5..7ff113db 100644
--- a/src/Blockcore.Indexer.Angor/appsettings.json
+++ b/src/Blockcore.Indexer.Angor/appsettings.json
@@ -18,6 +18,7 @@
       }
    },
    "Indexer": {
+      "DbType": "MongoDb",
       "ConnectionString": "mongodb://{Symbol}-mongo",
       "DatabaseNameSubfix": true,
 
@@ -34,8 +35,8 @@
       // Syncing parameters
       "SyncBlockchain": true,
       "SyncMemoryPool": true,
-      "MongoBatchSize": 10000000,
-      "MongoBatchCount" : 10000,
+      "DbBatchSize": 10000000,
+      "DbBatchCount" : 10000,
       "ParallelRequestsToTransactionRpc": 50,
       "DetailedTrace": 0,
       "MaxItemsInQueue": 10,
diff --git a/src/Blockcore.Indexer.Cirrus/CirrusStartup.cs b/src/Blockcore.Indexer.Cirrus/CirrusStartup.cs
index 099ec747..c10ed857 100644
--- a/src/Blockcore.Indexer.Cirrus/CirrusStartup.cs
+++ b/src/Blockcore.Indexer.Cirrus/CirrusStartup.cs
@@ -61,6 +61,7 @@ public void ConfigureServices(IServiceCollection services)
 
          services.AddSingleton<ICirrusStorage, CirrusMongoData>();
          services.AddSingleton<ICirrusMongoDb, CirrusMongoDb>();
+         services.Replace(new ServiceDescriptor(typeof(IStorageBatchFactory), typeof(CirrusStorageBatchFactory),ServiceLifetime.Singleton));
 
          services.AddControllers()
             .AddApplicationPart(typeof(Startup).Assembly)
diff --git a/src/Blockcore.Indexer.Cirrus/Operations/Types/CirrusStorageBatch.cs b/src/Blockcore.Indexer.Cirrus/Operations/Types/CirrusStorageBatch.cs
index b249d72a..607e54a4 100644
--- a/src/Blockcore.Indexer.Cirrus/Operations/Types/CirrusStorageBatch.cs
+++ b/src/Blockcore.Indexer.Cirrus/Operations/Types/CirrusStorageBatch.cs
@@ -4,11 +4,10 @@
 
 namespace Blockcore.Indexer.Cirrus.Operations.Types
 {
-   public class CirrusStorageBatch
+   public class CirrusStorageBatch : MongoStorageBatch
    {
-      public List<CirrusContractTable> CirrusContractTable { get; set; } = new List<CirrusContractTable>();
-
-      public List<CirrusContractCodeTable> CirrusContractCodeTable { get; set; } = new List<CirrusContractCodeTable>();
+      public List<CirrusContractTable> CirrusContractTable { get; set; } = new ();
 
+      public List<CirrusContractCodeTable> CirrusContractCodeTable { get; set; } = new ();
    }
 }
diff --git a/src/Blockcore.Indexer.Cirrus/Storage/CirrusBlockMapping.cs b/src/Blockcore.Indexer.Cirrus/Storage/CirrusBlockMapping.cs
index aaed4980..dd1430aa 100644
--- a/src/Blockcore.Indexer.Cirrus/Storage/CirrusBlockMapping.cs
+++ b/src/Blockcore.Indexer.Cirrus/Storage/CirrusBlockMapping.cs
@@ -4,7 +4,7 @@
 using Blockcore.Indexer.Cirrus.Storage.Mongo.Types;
 using Blockcore.Indexer.Cirrus.Storage.Types;
 using Blockcore.Indexer.Core.Client.Types;
-using Blockcore.Indexer.Core.Storage;
+using Blockcore.Indexer.Core.Storage.Mongo;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
 using Blockcore.Indexer.Core.Storage.Types;
 using Blockcore.NBitcoin;
diff --git a/src/Blockcore.Indexer.Cirrus/Storage/Mongo/CirrusMongoStorageOperations.cs b/src/Blockcore.Indexer.Cirrus/Storage/Mongo/CirrusMongoStorageOperations.cs
index bab42737..1ad3faf7 100644
--- a/src/Blockcore.Indexer.Cirrus/Storage/Mongo/CirrusMongoStorageOperations.cs
+++ b/src/Blockcore.Indexer.Cirrus/Storage/Mongo/CirrusMongoStorageOperations.cs
@@ -28,7 +28,6 @@ public class CirrusMongoStorageOperations : MongoStorageOperations
       public CirrusMongoStorageOperations(
          SyncConnection syncConnection,
          IStorage storage,
-         IUtxoCache utxoCache,
          IOptions<IndexerSettings> configuration,
          GlobalState globalState,
          IMapMongoBlockToStorageBlock mongoBlockToStorageBlock,
@@ -38,7 +37,6 @@ public CirrusMongoStorageOperations(
          base(
              syncConnection,
              db,
-             utxoCache,
              configuration,
              globalState,
              mongoBlockToStorageBlock,
@@ -52,12 +50,7 @@ public CirrusMongoStorageOperations(
 
       protected override void OnAddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOperation item)
       {
-         storageBatch.ExtraData ??= new CirrusStorageBatch();
-
-         if (!(storageBatch.ExtraData is CirrusStorageBatch cirrusStorageBatch))
-         {
-            throw new ArgumentNullException(nameof(cirrusStorageBatch));
-         }
+         CirrusStorageBatch cirrusStorageBatch = storageBatch as CirrusStorageBatch;
 
          foreach (Transaction transaction in item.Transactions)
          {
@@ -125,10 +118,7 @@ protected override void OnAddToStorageBatch(StorageBatch storageBatch, SyncBlock
 
       protected override void OnPushStorageBatch(StorageBatch storageBatch)
       {
-         if (!(storageBatch.ExtraData is CirrusStorageBatch cirrusStorageBatch))
-         {
-            throw new ArgumentNullException(nameof(cirrusStorageBatch));
-         }
+         CirrusStorageBatch cirrusStorageBatch = storageBatch as CirrusStorageBatch;
 
          var t1 = Task.Run(() =>
          {
diff --git a/src/Blockcore.Indexer.Cirrus/Storage/Mongo/CirrusStorageBatchFactory.cs b/src/Blockcore.Indexer.Cirrus/Storage/Mongo/CirrusStorageBatchFactory.cs
new file mode 100644
index 00000000..15cc8869
--- /dev/null
+++ b/src/Blockcore.Indexer.Cirrus/Storage/Mongo/CirrusStorageBatchFactory.cs
@@ -0,0 +1,10 @@
+using Blockcore.Indexer.Cirrus.Operations.Types;
+using Blockcore.Indexer.Core.Operations.Types;
+using Blockcore.Indexer.Core.Storage;
+
+namespace Blockcore.Indexer.Cirrus.Storage.Mongo;
+
+public class CirrusStorageBatchFactory : IStorageBatchFactory
+{
+   public StorageBatch GetStorageBatch() => new CirrusStorageBatch();
+}
diff --git a/src/Blockcore.Indexer.Cirrus/appsettings.json b/src/Blockcore.Indexer.Cirrus/appsettings.json
index 7e6e450b..be7b749c 100644
--- a/src/Blockcore.Indexer.Cirrus/appsettings.json
+++ b/src/Blockcore.Indexer.Cirrus/appsettings.json
@@ -18,7 +18,7 @@
       }
    },
    "Indexer": {
-      // "ConnectionString": "mongodb://localhost",
+      "DbType": "MongoDb",
       "ConnectionString": "mongodb://{Symbol}-mongo",
       "DatabaseNameSubfix": true,
 
@@ -34,8 +34,8 @@
       // Syncing parameters
       "SyncBlockchain": true,
       "SyncMemoryPool": true,
-      "MongoBatchSize": 10000000,
-      "MongoBatchCount" : 10000,
+      "DbBatchSize": 10000000,
+      "DbBatchCount" : 10000,
       "ParallelRequestsToTransactionRpc": 50,
       "DetailedTrace": 0,
       "MaxItemsInQueue": 10,
diff --git a/src/Blockcore.Indexer.Core/Client/Types/PeerInfo.cs b/src/Blockcore.Indexer.Core/Client/Types/PeerInfo.cs
index dadd19a8..09954cc7 100644
--- a/src/Blockcore.Indexer.Core/Client/Types/PeerInfo.cs
+++ b/src/Blockcore.Indexer.Core/Client/Types/PeerInfo.cs
@@ -1,11 +1,9 @@
 using System;
 using System.Collections.Generic;
-using MongoDB.Bson.Serialization.Attributes;
 using Newtonsoft.Json;
 
 namespace Blockcore.Indexer.Core.Client.Types
 {
-   [BsonIgnoreExtraElements]
    public class PeerInfo
    {
       public string Addr { get; set; }
diff --git a/src/Blockcore.Indexer.Core/Controllers/InsightController.cs b/src/Blockcore.Indexer.Core/Controllers/InsightController.cs
index 4eaf7872..aa224ae8 100644
--- a/src/Blockcore.Indexer.Core/Controllers/InsightController.cs
+++ b/src/Blockcore.Indexer.Core/Controllers/InsightController.cs
@@ -172,7 +172,7 @@ private Supply CalculateSupply()
       /// <returns></returns>
       private List<Wallet> RetrieveWallets()
       {
-         // TODO: Funds should be stored in MongoDB, and be editable by individual chains and not hard-coded.
+         // TODO: Funds should be stored in the DB, and be editable by individual chains and not hard-coded.
          var funds = new List<Wallet>();
 
          List<Wallet> wallets = insightConfiguration.Wallets;
@@ -181,7 +181,7 @@ private List<Wallet> RetrieveWallets()
          {
             if (wallet.Address != null && wallet.Address.Length > 0)
             {
-               List<Storage.Mongo.Types.RichlistTable> balances = storage.AddressBalances(wallet.Address);
+               var balances = storage.AddressBalances(wallet.Address);
                long balance = balances.Sum(b => b.Balance);
                wallet.Balance = balance;
             }
@@ -207,7 +207,7 @@ private decimal CalculateCirculatingSupply()
             }
          }
 
-         List<Storage.Mongo.Types.RichlistTable> balances = storage.AddressBalances(listOfAddress);
+         var balances = storage.AddressBalances(listOfAddress);
          long walletBalances = balances.Sum(b => b.Balance);
 
          long circulatingSupply = totalBalance - walletBalances;
diff --git a/src/Blockcore.Indexer.Core/Controllers/QueryController.cs b/src/Blockcore.Indexer.Core/Controllers/QueryController.cs
index 44ceabf3..64f7a3fe 100644
--- a/src/Blockcore.Indexer.Core/Controllers/QueryController.cs
+++ b/src/Blockcore.Indexer.Core/Controllers/QueryController.cs
@@ -79,7 +79,7 @@ public IActionResult GetAddressTransactions([MinLength(4)][MaxLength(100)] strin
       [Route("address/{address}/transactions/unspent")]
       public async Task<IActionResult> GetAddressTransactionsUnspent([MinLength(30)][MaxLength(100)] string address, long confirmations = 0, [Range(0, int.MaxValue)] int offset = 0, [Range(1, 50)] int limit = 10)
       {
-         QueryResult<Storage.Mongo.Types.OutputTable> result = await storage.GetUnspentTransactionsByAddressAsync(address, confirmations, offset, limit);
+         var result = await storage.GetUnspentTransactionsByAddressAsync(address, confirmations, offset, limit);
 
          return OkPaging(result);
       }
diff --git a/src/Blockcore.Indexer.Core/Controllers/StatsController.cs b/src/Blockcore.Indexer.Core/Controllers/StatsController.cs
index 4b5b2b13..43813688 100644
--- a/src/Blockcore.Indexer.Core/Controllers/StatsController.cs
+++ b/src/Blockcore.Indexer.Core/Controllers/StatsController.cs
@@ -1,10 +1,11 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading.Tasks;
+using Blockcore.Indexer.Core.Client.Types;
 using Blockcore.Indexer.Core.Handlers;
 using Blockcore.Indexer.Core.Models;
 using Blockcore.Indexer.Core.Storage;
-using Blockcore.Indexer.Core.Storage.Mongo;
 using Microsoft.AspNetCore.Mvc;
 
 namespace Blockcore.Indexer.Core.Controllers
@@ -18,7 +19,7 @@ public class StatsController : ControllerBase
    {
       private readonly StatsHandler statsHandler;
 
-      private readonly MongoData storage;
+      private readonly IStorage storage;
 
       /// <summary>
       /// Initializes a new instance of the <see cref="StatsController"/> class.
@@ -26,7 +27,7 @@ public class StatsController : ControllerBase
       public StatsController(StatsHandler statsHandler, IStorage storage)
       {
          this.statsHandler = statsHandler;
-         this.storage = storage as MongoData;
+         this.storage = storage;
       }
 
       [HttpGet]
@@ -83,7 +84,9 @@ public async Task<IActionResult> Peers()
       [Route("peers/{date}")]
       public IActionResult Peers(DateTime date)
       {
-         List<Client.Types.PeerInfo> list = storage.GetPeerFromDate(date);
+         List<PeerInfo> list = storage.GetPeerFromDate(date)
+            .Select(x => x as PeerInfo)
+            .ToList();
          return Ok(list);
       }
 
diff --git a/src/Blockcore.Indexer.Core/Models/BalanceForAddress.cs b/src/Blockcore.Indexer.Core/Models/BalanceForAddress.cs
new file mode 100644
index 00000000..53191459
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Models/BalanceForAddress.cs
@@ -0,0 +1,7 @@
+namespace Blockcore.Indexer.Core.Models;
+
+public class BalanceForAddress
+{
+   public string Address { get; set; }
+   public long Balance { get; set; }
+}
diff --git a/src/Blockcore.Indexer.Core/Models/QueryBlock.cs b/src/Blockcore.Indexer.Core/Models/QueryBlock.cs
index 8c50a81d..b48136d5 100644
--- a/src/Blockcore.Indexer.Core/Models/QueryBlock.cs
+++ b/src/Blockcore.Indexer.Core/Models/QueryBlock.cs
@@ -1,16 +1,9 @@
-using System.Collections.Generic;
 
 namespace Blockcore.Indexer.Core.Models
 {
-   public class QueryBlockResults
-   {
-      public IEnumerable<QueryBlock> Blocks { get; set; }
-
-      public int Total { get; set; }
-   }
-
    public class QueryBlock
    {
+
       /// <summary>
       /// Gets or sets the Symbol.
       /// </summary>
@@ -60,16 +53,16 @@ public class QueryBlock
 
       public string Bits { get; set; }
 
+      public double Difficulty { get; set; }
+
+      public string ChainWork { get; set; }
+
       public string Merkleroot { get; set; }
 
       public long Nonce { get; set; }
 
       public long Version { get; set; }
 
-      public double Difficulty { get; set; }
-
-      public string ChainWork { get; set; }
-
       public string PosBlockSignature { get; set; }
 
       public string PosModifierv2 { get; set; }
@@ -81,10 +74,5 @@ public class QueryBlock
       public string PosBlockTrust { get; set; }
 
       public string PosChainTrust { get; set; }
-
-      /// <summary>
-      /// Gets or sets the transactions.
-      /// </summary>
-      public IEnumerable<QueryTransaction> Transactions { get; set; }
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Models/QueryBlockResults.cs b/src/Blockcore.Indexer.Core/Models/QueryBlockResults.cs
new file mode 100644
index 00000000..2935610f
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Models/QueryBlockResults.cs
@@ -0,0 +1,10 @@
+using System.Collections.Generic;
+
+namespace Blockcore.Indexer.Core.Models;
+
+public class QueryBlockResults
+{
+   public IEnumerable<QueryBlock> Blocks { get; set; }
+
+   public int Total { get; set; }
+}
diff --git a/src/Blockcore.Indexer.Core/Models/QueryOrphanBlock.cs b/src/Blockcore.Indexer.Core/Models/QueryOrphanBlock.cs
index 502986fe..dc8019b1 100644
--- a/src/Blockcore.Indexer.Core/Models/QueryOrphanBlock.cs
+++ b/src/Blockcore.Indexer.Core/Models/QueryOrphanBlock.cs
@@ -1,6 +1,5 @@
 using System;
-using System.Collections.Generic;
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 
 namespace Blockcore.Indexer.Core.Models
 {
@@ -9,6 +8,6 @@ public class QueryOrphanBlock
       public DateTime Created { get; set; }
       public uint BlockIndex { get; set; }
       public string BlockHash { get; set; }
-      public BlockTable Block { get; set; }
+      public QueryBlock Block { get; set; }
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Operations/IStorageOperations.cs b/src/Blockcore.Indexer.Core/Operations/IStorageOperations.cs
index ad437454..01a4c055 100644
--- a/src/Blockcore.Indexer.Core/Operations/IStorageOperations.cs
+++ b/src/Blockcore.Indexer.Core/Operations/IStorageOperations.cs
@@ -13,6 +13,6 @@ public interface IStorageOperations
 
       SyncBlockInfo PushStorageBatch(StorageBatch storageBatch);
 
-      InsertStats InsertMempoolTransactions(SyncBlockTransactionsOperation item);
+      void InsertMempoolTransactions(SyncBlockTransactionsOperation item);
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Operations/IUtxoCache.cs b/src/Blockcore.Indexer.Core/Operations/IUtxoCache.cs
deleted file mode 100644
index 57a5089f..00000000
--- a/src/Blockcore.Indexer.Core/Operations/IUtxoCache.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System.Collections.Generic;
-using Blockcore.Indexer.Core.Operations.Types;
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
-
-namespace Blockcore.Indexer.Core.Operations
-{
-   /// <summary>
-   /// Maintain a cache of unspent outputs
-   /// </summary>
-   public interface IUtxoCache
-   {
-      int CacheSize { get; }
-
-      UtxoCacheItem GetOne(string outpoint);
-      void AddToCache(IEnumerable<OutputTable> outputs);
-
-      void RemoveFromCache(IEnumerable<InputTable> inputs);
-   }
-}
diff --git a/src/Blockcore.Indexer.Core/Operations/Types/InsertStats.cs b/src/Blockcore.Indexer.Core/Operations/Types/InsertStats.cs
index 0631a30b..ad148d41 100644
--- a/src/Blockcore.Indexer.Core/Operations/Types/InsertStats.cs
+++ b/src/Blockcore.Indexer.Core/Operations/Types/InsertStats.cs
@@ -1,6 +1,3 @@
-using System.Collections.Generic;
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
-
 namespace Blockcore.Indexer.Core.Operations.Types
 {
    #region Using Directives
@@ -23,10 +20,5 @@ public class InsertStats
       /// Gets or sets the outputs.
       /// </summary>
       public int InputsOutputs { get; set; }
-
-      /// <summary>
-      /// Gets or sets the items.
-      /// </summary>
-      public List<MempoolTable> Items { get; set; }
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Operations/Types/StorageBatch.cs b/src/Blockcore.Indexer.Core/Operations/Types/StorageBatch.cs
index f6a5084e..057866d4 100644
--- a/src/Blockcore.Indexer.Core/Operations/Types/StorageBatch.cs
+++ b/src/Blockcore.Indexer.Core/Operations/Types/StorageBatch.cs
@@ -1,5 +1,4 @@
 using System.Collections.Generic;
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
 
 namespace Blockcore.Indexer.Core.Operations.Types
 {
@@ -7,15 +6,15 @@ namespace Blockcore.Indexer.Core.Operations.Types
 
    #endregion Using Directives
 
-   public class StorageBatch
+   public abstract class StorageBatch
    {
-      public long TotalSize { get; set; }
-      public List<TransactionBlockTable> TransactionBlockTable { get; set; } = new();
-      public Dictionary<long, BlockTable> BlockTable { get; set; } = new();
-      public List<TransactionTable> TransactionTable { get; set; } = new();
-      public Dictionary<string,OutputTable> OutputTable { get; set; } = new();
-      public List<InputTable> InputTable { get; set; } = new();
+      public abstract int GetBlockCount();
+      public abstract int GetOutputCount();
+      public abstract int GetInputCount();
+      public abstract int GetTransactionCount();
+      public abstract long GetBatchSize();
 
-      public object ExtraData { get; set; }
+      public abstract IEnumerable<long> GetBlockSizes();
+      public abstract bool ValidateBatch(string prevBlockHash);
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Operations/Types/UtxoCache.cs b/src/Blockcore.Indexer.Core/Operations/Types/UtxoCache.cs
deleted file mode 100644
index f4636bc6..00000000
--- a/src/Blockcore.Indexer.Core/Operations/Types/UtxoCache.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Linq;
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
-using Microsoft.Extensions.Logging;
-
-namespace Blockcore.Indexer.Core.Operations.Types
-{
-   public class UtxoCacheItem
-   {
-      public string Address { get; set; }
-      public long Value { get; set; }
-   }
-
-   public class UtxoCache : IUtxoCache
-   {
-      private readonly ILogger<UtxoCache> logger;
-      private readonly ConcurrentDictionary<string, UtxoCacheItem> cache;
-
-      private readonly int maxItemInCache = 0;
-
-      public UtxoCache(ILogger<UtxoCache> logger)
-      {
-         this.logger = logger;
-         cache = new ConcurrentDictionary<string, UtxoCacheItem>();
-      }
-
-      public int CacheSize { get { return cache.Count; } }
-
-      public UtxoCacheItem GetOne(string outpoint)
-      {
-         if (cache.TryGetValue(outpoint, out UtxoCacheItem utxo))
-         {
-            return new UtxoCacheItem { Value = utxo.Value, Address = utxo.Address };
-         }
-
-         return null;
-      }
-
-      public void AddToCache(IEnumerable<OutputTable> outputs)
-      {
-         int maxToAdd = maxItemInCache - cache.Count;
-         foreach (OutputTable output in outputs.Take(maxToAdd))
-         {
-            cache.TryAdd($"{output.Outpoint.TransactionId}-{output.Outpoint.OutputIndex}", new UtxoCacheItem { Value = output.Value, Address = output.Address });
-         }
-      }
-
-      public void RemoveFromCache(IEnumerable<InputTable> inputs)
-      {
-         foreach (InputTable output in inputs)
-         {
-            cache.TryRemove($"{output.Outpoint.TransactionId}-{output.Outpoint.OutputIndex}", out _);
-         }
-      }
-   }
-}
diff --git a/src/Blockcore.Indexer.Core/Settings/IndexerSettings.cs b/src/Blockcore.Indexer.Core/Settings/IndexerSettings.cs
index 6d4eea37..e511f1ad 100644
--- a/src/Blockcore.Indexer.Core/Settings/IndexerSettings.cs
+++ b/src/Blockcore.Indexer.Core/Settings/IndexerSettings.cs
@@ -32,8 +32,8 @@ public class IndexerSettings
 
       public int NotifyBatchCount { get; set; }
 
-      public int MongoBatchSize { get; set; }
-      public int MongoBatchCount { get; set; }
+      public int DbBatchSize { get; set; }
+      public int DbBatchCount { get; set; }
 
       public int AverageInterval { get; set; }
 
@@ -44,5 +44,7 @@ public class IndexerSettings
       public int MaxItemsInHistoryQueue { get; set; }
 
       public int IndexCountForBlockIndexProperty { get;set; }
+
+      public string DbType { get; set; }
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Startup.cs b/src/Blockcore.Indexer.Core/Startup.cs
index 2e58db94..3fcc0a8c 100644
--- a/src/Blockcore.Indexer.Core/Startup.cs
+++ b/src/Blockcore.Indexer.Core/Startup.cs
@@ -15,17 +15,13 @@
 using Blockcore.Indexer.Core.Storage.Mongo;
 using Blockcore.Indexer.Core.Sync;
 using Blockcore.Indexer.Core.Sync.SyncTasks;
-using Blockcore.Utilities;
-using ConcurrentCollections;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Mvc.ApplicationModels;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Options;
 using Microsoft.Extensions.PlatformAbstractions;
 using Microsoft.OpenApi.Models;
-using MongoDB.Driver;
 using Newtonsoft.Json;
 
 namespace Blockcore.Indexer.Core
@@ -39,30 +35,22 @@ public static void AddIndexerServices(IServiceCollection services, IConfiguratio
          services.Configure<IndexerSettings>(configuration.GetSection("Indexer"));
          services.Configure<InsightSettings>(configuration.GetSection("Insight"));
 
+         IndexerSettings indexer = new IndexerSettings();
 
-         services.AddSingleton(_ =>
-         {
-            var indexerConfiguration = _.GetService(typeof(IOptions<IndexerSettings>))as IOptions<IndexerSettings> ;// configuration.GetSection("Indexer") as IndexerSettings;
-            var chainConfiguration  = _.GetService(typeof(IOptions<ChainSettings>)) as IOptions<ChainSettings>;//  configuration.GetSection("Chain") as ChainSettings;
-
-            var mongoClient = new MongoClient(indexerConfiguration.Value.ConnectionString.Replace("{Symbol}",
-               chainConfiguration.Value.Symbol.ToLower()));
-
-            string dbName = indexerConfiguration.Value.DatabaseNameSubfix
-               ? $"Blockchain{chainConfiguration.Value.Symbol}"
-               : "Blockchain";
+         configuration.GetSection("Indexer").Bind(indexer);
 
-            return mongoClient.GetDatabase(dbName);
-         });
+         switch (indexer.DbType)
+         {
+            case "MongoDb":
+               services.AddMongoDatabase();
+               break;
+            default: throw new InvalidOperationException();
+         }
 
          // services.AddSingleton<QueryHandler>();
          services.AddSingleton<StatsHandler>();
          services.AddSingleton<CommandHandler>();
-         services.AddSingleton<IStorage, MongoData>();
-         services.AddSingleton<IMongoDb, MongoDb>();
-         services.AddSingleton<IUtxoCache, UtxoCache>();
-         services.AddSingleton<IStorageOperations, MongoStorageOperations>();
-         services.AddSingleton<TaskStarter, MongoBuilder>();
+
          services.AddTransient<SyncServer>();
          services.AddSingleton<SyncConnection>();
          services.AddSingleton<ISyncOperations, SyncOperations>();
@@ -81,9 +69,6 @@ public static void AddIndexerServices(IServiceCollection services, IConfiguratio
          services.AddScoped<TaskRunner, BlockStore>();
          services.AddScoped<TaskStarter, BlockStartup>();
 
-         services.AddScoped<TaskRunner, BlockIndexer>();
-         services.AddScoped<TaskRunner, RichListSync>();
-
          // TODO: Verify that it is OK we add this to shared Startup for Blockcore and Cirrus.
          services.AddScoped<TaskRunner, HistoryComputer>();
          services.AddSingleton<IComputeHistoryQueue, ComputeHistoryQueue>();
@@ -142,7 +127,7 @@ public static void AddIndexerServices(IServiceCollection services, IConfiguratio
                .AllowAnyHeader();
          }));
 
-         services.AddTransient<IMapMongoBlockToStorageBlock, MapMongoBlockToStorageBlock>();
+
          services.AddSingleton<ICryptoClientFactory, CryptoClientFactory>();
          services.AddSingleton<ISyncBlockTransactionOperationBuilder, SyncBlockTransactionOperationBuilder>();
 
diff --git a/src/Blockcore.Indexer.Core/Storage/DatabaseRegistration.cs b/src/Blockcore.Indexer.Core/Storage/DatabaseRegistration.cs
new file mode 100644
index 00000000..d9337fc0
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Storage/DatabaseRegistration.cs
@@ -0,0 +1,43 @@
+using Blockcore.Indexer.Core.Operations;
+using Blockcore.Indexer.Core.Settings;
+using Blockcore.Indexer.Core.Storage.Mongo;
+using Blockcore.Indexer.Core.Storage.Mongo.SyncTasks;
+using Blockcore.Indexer.Core.Sync.SyncTasks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using MongoDB.Driver;
+
+namespace Blockcore.Indexer.Core.Storage;
+
+public static class DatabaseRegistration
+{
+   public static IServiceCollection AddMongoDatabase( this IServiceCollection services)
+   {
+      services.AddSingleton<TaskStarter, MongoBuilder>();
+      services.AddSingleton<IMongoDb, MongoDb>();
+      services.AddSingleton<IStorage, MongoData>();
+      services.AddSingleton<IStorageOperations, MongoStorageOperations>();
+      services.AddTransient<IMapMongoBlockToStorageBlock, MapMongoBlockToStorageBlock>();
+      services.AddScoped<TaskRunner, MongoDbBlockIndexer>();
+      services.AddSingleton<IStorageBatchFactory, MongoStorageBatchFactory>();
+      //TODO add this for address driven blockchains
+      //services.AddScoped<TaskRunner, RichListScanning>();
+
+      services.AddSingleton(_ =>
+      {
+         var indexerConfiguration = _.GetService(typeof(IOptions<IndexerSettings>))as IOptions<IndexerSettings> ;// configuration.GetSection("Indexer") as IndexerSettings;
+         var chainConfiguration  = _.GetService(typeof(IOptions<ChainSettings>)) as IOptions<ChainSettings>;//  configuration.GetSection("Chain") as ChainSettings;
+
+         var mongoClient = new MongoClient(indexerConfiguration.Value.ConnectionString.Replace("{Symbol}",
+            chainConfiguration.Value.Symbol.ToLower()));
+
+         string dbName = indexerConfiguration.Value.DatabaseNameSubfix
+            ? $"Blockchain{chainConfiguration.Value.Symbol}"
+            : "Blockchain";
+
+         return mongoClient.GetDatabase(dbName);
+      });
+
+      return services;
+   }
+}
diff --git a/src/Blockcore.Indexer.Core/Storage/IStorage.cs b/src/Blockcore.Indexer.Core/Storage/IStorage.cs
index 3f21e375..319a3b9f 100644
--- a/src/Blockcore.Indexer.Core/Storage/IStorage.cs
+++ b/src/Blockcore.Indexer.Core/Storage/IStorage.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using Blockcore.Indexer.Core.Models;
@@ -43,11 +44,9 @@ Task<List<QueryAddressBalance>> QuickBalancesLookupForAddressesWithHistoryCheckA
 
       ReorgBlockTable OrphanBlockByHash(string blockHash);
 
-      QueryResult<RichlistTable> Richlist(int offset, int limit);
+      QueryResult<BalanceForAddress> Richlist(int offset, int limit);
 
-      RichlistTable RichlistBalance(string address);
-
-      List<RichlistTable> AddressBalances(IEnumerable<string> addresses);
+      List<BalanceForAddress> AddressBalances(IEnumerable<string> addresses);
 
       long TotalBalance();
 
@@ -58,5 +57,12 @@ Task<List<QueryAddressBalance>> QuickBalancesLookupForAddressesWithHistoryCheckA
       public List<IndexView> GetIndexesBuildProgress();
 
       public List<string> GetBlockIndexIndexes();
+
+      public List<string> GetMempoolTransactionIds();
+
+      public bool DeleteTransactionsFromMempool(List<string> transactionIds);
+
+      List<PeerDetails> GetPeerFromDate(DateTime date);
+      Task<long> InsertPeer(PeerDetails info);
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Storage/IStorageBatchFactory.cs b/src/Blockcore.Indexer.Core/Storage/IStorageBatchFactory.cs
new file mode 100644
index 00000000..106aed35
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Storage/IStorageBatchFactory.cs
@@ -0,0 +1,8 @@
+using Blockcore.Indexer.Core.Operations.Types;
+
+namespace Blockcore.Indexer.Core.Storage;
+
+public interface IStorageBatchFactory
+{
+   StorageBatch GetStorageBatch();
+}
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/BlockRewindOperation.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/BlockRewindOperation.cs
index a3636188..74fe76c4 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/BlockRewindOperation.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/BlockRewindOperation.cs
@@ -4,6 +4,7 @@
 using System.Linq.Expressions;
 using System.Threading.Tasks;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using MongoDB.Bson;
 using MongoDB.Driver;
 
diff --git a/src/Blockcore.Indexer.Core/Storage/IMapMongoBlockToStorageBlock.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/IMapMongoBlockToStorageBlock.cs
similarity index 85%
rename from src/Blockcore.Indexer.Core/Storage/IMapMongoBlockToStorageBlock.cs
rename to src/Blockcore.Indexer.Core/Storage/Mongo/IMapMongoBlockToStorageBlock.cs
index 8d93a850..b1060a39 100644
--- a/src/Blockcore.Indexer.Core/Storage/IMapMongoBlockToStorageBlock.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/IMapMongoBlockToStorageBlock.cs
@@ -2,7 +2,7 @@
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
 using Blockcore.Indexer.Core.Storage.Types;
 
-namespace Blockcore.Indexer.Core.Storage
+namespace Blockcore.Indexer.Core.Storage.Mongo
 {
    public interface IMapMongoBlockToStorageBlock
    {
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/IMongoDb.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/IMongoDb.cs
index feb49a64..b11dfc92 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/IMongoDb.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/IMongoDb.cs
@@ -1,5 +1,6 @@
 using Blockcore.Indexer.Core.Client.Types;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using MongoDB.Driver;
 
 namespace Blockcore.Indexer.Core.Storage.Mongo;
@@ -15,7 +16,7 @@ public interface IMongoDb
    IMongoCollection<TransactionTable> TransactionTable { get; }
    IMongoCollection<BlockTable> BlockTable { get; }
    IMongoCollection<RichlistTable> RichlistTable { get; }
-   IMongoCollection<PeerInfo> Peer { get; }
+   IMongoCollection<PeerDetails> Peer { get; }
    IMongoCollection<MempoolTable> Mempool { get; }
    IMongoCollection<ReorgBlockTable> ReorgBlock { get; }
 }
diff --git a/src/Blockcore.Indexer.Core/Storage/MapMongoBlockToStorageBlock.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/MapMongoBlockToStorageBlock.cs
similarity index 97%
rename from src/Blockcore.Indexer.Core/Storage/MapMongoBlockToStorageBlock.cs
rename to src/Blockcore.Indexer.Core/Storage/Mongo/MapMongoBlockToStorageBlock.cs
index a4604ada..6a4b2b6f 100644
--- a/src/Blockcore.Indexer.Core/Storage/MapMongoBlockToStorageBlock.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/MapMongoBlockToStorageBlock.cs
@@ -3,7 +3,7 @@
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
 using Blockcore.Indexer.Core.Storage.Types;
 
-namespace Blockcore.Indexer.Core.Storage
+namespace Blockcore.Indexer.Core.Storage.Mongo
 {
    public class MapMongoBlockToStorageBlock : IMapMongoBlockToStorageBlock
    {
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoBuilder.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoBuilder.cs
index 286777de..32f89829 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoBuilder.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoBuilder.cs
@@ -1,6 +1,7 @@
 using System.Threading.Tasks;
 using Blockcore.Indexer.Core.Settings;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using Blockcore.Indexer.Core.Sync.SyncTasks;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
@@ -143,6 +144,15 @@ public override Task OnExecute()
             });
          }
 
+         if (!MongoDB.Bson.Serialization.BsonClassMap.IsClassMapRegistered(typeof(PeerDetails)))
+         {
+            MongoDB.Bson.Serialization.BsonClassMap.RegisterClassMap<PeerDetails>(cm =>
+            {
+               cm.AutoMap();
+               cm.SetIgnoreExtraElements(true);
+            });
+         }
+
          mongoDb.UnspentOutputTable.Indexes
             .CreateOne(new CreateIndexModel<UnspentOutputTable>(Builders<UnspentOutputTable>
                .IndexKeys.Hashed(trxBlk => trxBlk.Outpoint)));
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs
index 4fd8c3e7..165189f3 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoData.cs
@@ -5,9 +5,7 @@
 using Blockcore.Consensus.ScriptInfo;
 using Blockcore.Consensus.TransactionInfo;
 using Blockcore.Indexer.Core.Client;
-using Blockcore.Indexer.Core.Client.Types;
 using Blockcore.Indexer.Core.Crypto;
-using Blockcore.Indexer.Core.Extensions;
 using Blockcore.Indexer.Core.Models;
 using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
@@ -19,7 +17,6 @@
 using MongoDB.Bson;
 using MongoDB.Driver;
 using Blockcore.NBitcoin.DataEncoders;
-using Blockcore.Utilities;
 
 namespace Blockcore.Indexer.Core.Storage.Mongo
 {
@@ -83,6 +80,18 @@ public List<string> GetBlockIndexIndexes()
          return indexNames.Where(w => w.Contains("BlockIndex")).ToList();
       }
 
+      public List<string> GetMempoolTransactionIds() => mongoDb.Mempool.AsQueryable().Select(x => x.TransactionId).ToList();
+
+      public bool DeleteTransactionsFromMempool(List<string> transactionIds)
+      {
+         FilterDefinitionBuilder<MempoolTable> builder = Builders<MempoolTable>.Filter;
+         FilterDefinition<MempoolTable> filter = builder.In(mempoolItem => mempoolItem.TransactionId, transactionIds);
+
+         var result = mongoDb.Mempool.DeleteMany(filter);
+
+         return result.IsAcknowledged; //TODO should we change this to count == count of transaction ids?
+      }
+
       public List<IndexView> GetIndexesBuildProgress()
       {
             IMongoDatabase db = mongoDatabase.Client.GetDatabase("admin");
@@ -272,7 +281,7 @@ public QueryResult<QueryOrphanBlock> OrphanBlocks(int? offset, int limit)
                BlockHash = s.BlockHash,
                BlockIndex = s.BlockIndex,
                Created = s.Created,
-               Block = s.Block
+               Block = MapQueryBlock(s.Block)
             }),
             Total = total,
             Offset = itemsToSkip,
@@ -280,6 +289,34 @@ public QueryResult<QueryOrphanBlock> OrphanBlocks(int? offset, int limit)
          };
       }
 
+      private static QueryBlock MapQueryBlock(BlockTable blockTable)
+      {
+         return new QueryBlock()
+         {
+            BlockHash = blockTable.BlockHash,
+            BlockIndex = blockTable.BlockIndex,
+            BlockSize = blockTable.BlockSize,
+            BlockTime = blockTable.BlockTime,
+            NextBlockHash = blockTable.NextBlockHash,
+            PreviousBlockHash = blockTable.PreviousBlockHash,
+            Confirmations = blockTable.Confirmations,
+            Bits = blockTable.Bits,
+            Difficulty = blockTable.Difficulty,
+            ChainWork = blockTable.ChainWork,
+            Merkleroot = blockTable.Merkleroot,
+            Nonce = blockTable.Nonce,
+            Version = blockTable.Version,
+            Synced = blockTable.SyncComplete,
+            TransactionCount = blockTable.TransactionCount,
+            PosBlockSignature = blockTable.PosBlockSignature,
+            PosModifierv2 = blockTable.PosModifierv2,
+            PosFlags = blockTable.PosFlags,
+            PosHashProof = blockTable.PosHashProof,
+            PosBlockTrust = blockTable.PosBlockTrust,
+            PosChainTrust = blockTable.PosChainTrust,
+         };
+      }
+
       public ReorgBlockTable OrphanBlockByHash(string blockHash)
       {
          FilterDefinition<ReorgBlockTable> filter = Builders<ReorgBlockTable>.Filter.Eq(info => info.BlockHash, blockHash);
@@ -292,7 +329,7 @@ public ReorgBlockTable OrphanBlockByHash(string blockHash)
       /// </summary>
       /// <param name="info"></param>
       /// <returns></returns>
-      public async Task<long> InsertPeer(PeerInfo info)
+      public async Task<long> InsertPeer(PeerDetails info)
       {
          // Always update the LastSeen.
          info.LastSeen = DateTime.UtcNow;
@@ -302,9 +339,9 @@ public async Task<long> InsertPeer(PeerInfo info)
          return replaceOneResult.ModifiedCount;
       }
 
-      public List<PeerInfo> GetPeerFromDate(DateTime date)
+      public List<PeerDetails> GetPeerFromDate(DateTime date)
       {
-         FilterDefinition<PeerInfo> filter = Builders<PeerInfo>.Filter.Gt(addr => addr.LastSeen, date);
+         FilterDefinition<PeerDetails> filter = Builders<PeerDetails>.Filter.Gt(addr => addr.LastSeen, date);
          return mongoDb.Peer.Find(filter).ToList();
       }
 
@@ -474,7 +511,7 @@ public SyncTransactionItems TransactionItemsGet(string transactionId, Transactio
          return ret;
       }
 
-      public QueryResult<RichlistTable> Richlist(int offset, int limit)
+      public QueryResult<BalanceForAddress> Richlist(int offset, int limit)
       {
          FilterDefinitionBuilder<RichlistTable> filterBuilder = Builders<RichlistTable>.Filter;
          FilterDefinition<RichlistTable> filter = filterBuilder.Empty;
@@ -502,27 +539,19 @@ public QueryResult<RichlistTable> Richlist(int offset, int limit)
                    .Limit(limit)
                    .ToList();
 
-         return new QueryResult<RichlistTable> { Items = list, Total = total, Offset = offset, Limit = limit };
-      }
-
-      public RichlistTable RichlistBalance(string address)
-      {
-         FilterDefinitionBuilder<RichlistTable> filterBuilder = Builders<RichlistTable>.Filter;
-         FilterDefinition<RichlistTable> filter = filterBuilder.Eq(m => m.Address, address);
-
-         RichlistTable table = mongoDb.RichlistTable.Find(filter).SingleOrDefault();
-
-         return table;
+         return new QueryResult<BalanceForAddress> { Items = list.Select(x => new BalanceForAddress
+         { Address = x.Address,Balance = x.Balance }), Total = total, Offset = offset, Limit = limit };
       }
 
-      public List<RichlistTable> AddressBalances(IEnumerable<string> addresses)
+      public List<BalanceForAddress> AddressBalances(IEnumerable<string> addresses)
       {
          FilterDefinitionBuilder<RichlistTable> filterBuilder = Builders<RichlistTable>.Filter;
          FilterDefinition<RichlistTable> filter = filterBuilder.Where(s => addresses.Contains(s.Address));
 
-         List<RichlistTable> document = mongoDb.RichlistTable.Find(filter).ToList();
-
-         return document;
+         return  mongoDb.RichlistTable.Find(filter)
+            .ToList()
+            .Select(x => new BalanceForAddress { Balance = x.Balance, Address = x.Address })
+            .ToList();
       }
 
       public long TotalBalance()
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoDb.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoDb.cs
index c7e02fda..a27d5d5b 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoDb.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoDb.cs
@@ -1,9 +1,7 @@
 using Blockcore.Indexer.Core.Client.Types;
-using Blockcore.Indexer.Core.Operations.Types;
-using Blockcore.Indexer.Core.Settings;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
 using MongoDB.Driver;
 
 namespace Blockcore.Indexer.Core.Storage.Mongo
@@ -93,11 +91,11 @@ public IMongoCollection<RichlistTable> RichlistTable
          }
       }
 
-      public IMongoCollection<PeerInfo> Peer
+      public IMongoCollection<PeerDetails> Peer
       {
          get
          {
-            return mongoDatabase.GetCollection<PeerInfo>("Peer");
+            return mongoDatabase.GetCollection<PeerDetails>("Peer");
          }
       }
 
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoStorageBatchFactory.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoStorageBatchFactory.cs
new file mode 100644
index 00000000..27046920
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoStorageBatchFactory.cs
@@ -0,0 +1,9 @@
+using Blockcore.Indexer.Core.Operations.Types;
+using Blockcore.Indexer.Core.Storage.Mongo.Types;
+
+namespace Blockcore.Indexer.Core.Storage.Mongo;
+
+public class MongoStorageBatchFactory : IStorageBatchFactory
+{
+   public StorageBatch GetStorageBatch() => new MongoStorageBatch();
+}
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoStorageOperations.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoStorageOperations.cs
index 0891f3da..2c758c9a 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/MongoStorageOperations.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/MongoStorageOperations.cs
@@ -30,7 +30,6 @@ public class MongoStorageOperations : IStorageOperations
       public MongoStorageOperations(
          SyncConnection syncConnection,
          IMongoDb storage,
-         IUtxoCache utxoCache,
          IOptions<IndexerSettings> configuration,
          GlobalState globalState,
          IMapMongoBlockToStorageBlock mongoBlockToStorageBlock,
@@ -48,15 +47,17 @@ public MongoStorageOperations(
 
       public void AddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOperation item)
       {
-         storageBatch.TotalSize += item.BlockInfo.Size;
-         storageBatch.BlockTable.Add(item.BlockInfo.Height, mongoBlockToStorageBlock.Map(item.BlockInfo));
+         var mongoStorageBatch = storageBatch as MongoStorageBatch;
+
+         mongoStorageBatch.TotalSize += item.BlockInfo.Size;
+         mongoStorageBatch.BlockTable.Add(item.BlockInfo.Height, mongoBlockToStorageBlock.Map(item.BlockInfo));
 
          int transactionIndex = 0;
          foreach (Transaction trx in item.Transactions)
          {
             string trxHash = trx.GetHash().ToString();
 
-            storageBatch.TransactionBlockTable.Add(
+            mongoStorageBatch.TransactionBlockTable.Add(
                new TransactionBlockTable
                {
                   BlockIndex = item.BlockInfo.HeightAsUint32,
@@ -67,7 +68,7 @@ public void AddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOp
 
             if (configuration.StoreRawTransactions)
             {
-               storageBatch.TransactionTable.Add(new TransactionTable
+               mongoStorageBatch.TransactionTable.Add(new TransactionTable
                {
                   TransactionId = trxHash,
                   RawTransaction = trx.ToBytes(syncConnection.Network.Consensus.ConsensusFactory)
@@ -84,7 +85,7 @@ public void AddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOp
 
                var outpoint = new Outpoint { TransactionId = trxHash, OutputIndex = outputIndex++ };
 
-               storageBatch.OutputTable.Add(outpoint.ToString(), new OutputTable
+               mongoStorageBatch.OutputTable.Add(outpoint.ToString(), new OutputTable
                {
                   Address = addr,
                   Outpoint = outpoint,
@@ -106,9 +107,9 @@ public void AddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOp
                   TransactionId = input.PrevOut.Hash.ToString(), OutputIndex = (int)input.PrevOut.N
                };
 
-               storageBatch.OutputTable.TryGetValue(outpoint.ToString(), out OutputTable output);
+               mongoStorageBatch.OutputTable.TryGetValue(outpoint.ToString(), out OutputTable output);
 
-               storageBatch.InputTable.Add(new InputTable()
+               mongoStorageBatch.InputTable.Add(new InputTable()
                {
                   Outpoint = outpoint,
                   TrxHash = trxHash,
@@ -126,13 +127,15 @@ public void AddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOp
 
       public SyncBlockInfo PushStorageBatch(StorageBatch storageBatch)
       {
+         var mongoStorageBatch = storageBatch as MongoStorageBatch;
+
          if (globalState.IndexModeCompleted)
          {
             if (globalState.IbdMode() == false)
             {
                if (globalState.LocalMempoolView.Any())
                {
-                  var toRemoveFromMempool = storageBatch.TransactionBlockTable.Select(s => s.TransactionId).ToList();
+                  var toRemoveFromMempool = mongoStorageBatch.TransactionBlockTable.Select(s => s.TransactionId).ToList();
 
                   FilterDefinitionBuilder<MempoolTable> builder = Builders<MempoolTable>.Filter;
                   FilterDefinition<MempoolTable> filter = builder.In(mempoolItem => mempoolItem.TransactionId,
@@ -146,24 +149,24 @@ public SyncBlockInfo PushStorageBatch(StorageBatch storageBatch)
             }
          }
 
-         var blockTableTask = storageBatch.BlockTable.Values.Any()
-            ? db.BlockTable.InsertManyAsync(storageBatch.BlockTable.Values, new InsertManyOptions { IsOrdered = false })
+         var blockTableTask = mongoStorageBatch.BlockTable.Values.Any()
+            ? db.BlockTable.InsertManyAsync(mongoStorageBatch.BlockTable.Values, new InsertManyOptions { IsOrdered = false })
             : Task.CompletedTask;
 
-         var transactionBlockTableTask = storageBatch.TransactionBlockTable.Any()
-            ? db.TransactionBlockTable.InsertManyAsync(storageBatch.TransactionBlockTable, new InsertManyOptions { IsOrdered = false })
+         var transactionBlockTableTask = mongoStorageBatch.TransactionBlockTable.Any()
+            ? db.TransactionBlockTable.InsertManyAsync(mongoStorageBatch.TransactionBlockTable, new InsertManyOptions { IsOrdered = false })
             : Task.CompletedTask;
 
-         var outputTableTask = storageBatch.OutputTable.Any()
-            ? db.OutputTable.InsertManyAsync(storageBatch.OutputTable.Values, new InsertManyOptions { IsOrdered = false })
+         var outputTableTask = mongoStorageBatch.OutputTable.Any()
+            ? db.OutputTable.InsertManyAsync(mongoStorageBatch.OutputTable.Values, new InsertManyOptions { IsOrdered = false })
             : Task.CompletedTask;
 
          Task transactionTableTask = Task.Run(() =>
          {
             try
             {
-               if (storageBatch.TransactionTable.Any())
-                  db.TransactionTable.InsertMany(storageBatch.TransactionTable, new InsertManyOptions {IsOrdered = false});
+               if (mongoStorageBatch.TransactionTable.Any())
+                  db.TransactionTable.InsertMany(mongoStorageBatch.TransactionTable, new InsertManyOptions {IsOrdered = false});
             }
             catch (MongoBulkWriteException mbwex)
             {
@@ -176,9 +179,9 @@ public SyncBlockInfo PushStorageBatch(StorageBatch storageBatch)
             }
          });
 
-         var utxos = new List<UnspentOutputTable>(storageBatch.OutputTable.Values.Count);
+         var utxos = new List<UnspentOutputTable>(mongoStorageBatch.OutputTable.Values.Count);
 
-         foreach (OutputTable outputTable in storageBatch.OutputTable.Values)
+         foreach (OutputTable outputTable in mongoStorageBatch.OutputTable.Values)
          {
             if (outputTable.Address.Equals(OpReturnAddress))
                continue;
@@ -201,14 +204,14 @@ public SyncBlockInfo PushStorageBatch(StorageBatch storageBatch)
             : Task.CompletedTask;
 
          var inputTableTask = Task.CompletedTask;
-         if (storageBatch.InputTable.Any())
+         if (mongoStorageBatch.InputTable.Any())
          {
             var utxosLookups = FetchUtxos(
-               storageBatch.InputTable
+               mongoStorageBatch.InputTable
                   .Where(_ => _.Address == null)
                   .Select(_ => _.Outpoint));
 
-            foreach (InputTable input in storageBatch.InputTable)
+            foreach (InputTable input in mongoStorageBatch.InputTable)
             {
                if (input.Address != null) continue;
 
@@ -217,17 +220,17 @@ public SyncBlockInfo PushStorageBatch(StorageBatch storageBatch)
                input.Value = utxosLookups[key].Value;
             }
 
-            inputTableTask = db.InputTable.InsertManyAsync(storageBatch.InputTable, new InsertManyOptions { IsOrdered = false });
+            inputTableTask = db.InputTable.InsertManyAsync(mongoStorageBatch.InputTable, new InsertManyOptions { IsOrdered = false });
          }
 
          Task.WaitAll(blockTableTask, transactionBlockTableTask, outputTableTask, inputTableTask, transactionTableTask, unspentOutputTableTask);
 
-         if (storageBatch.InputTable.Any())
+         if (mongoStorageBatch.InputTable.Any())
          {
             // TODO: if earlier we filtered out outputs that are already spent and not pushed to the utxo table
             // now we do not need to try and delete such outputs becuase they where never pushed to the store.
 
-            var outpointsFromNewInput = storageBatch.InputTable
+            var outpointsFromNewInput = mongoStorageBatch.InputTable
             .Select(_ => _.Outpoint)
             .ToList();
 
@@ -246,7 +249,7 @@ public SyncBlockInfo PushStorageBatch(StorageBatch storageBatch)
          string lastBlockHash = null;
          long blockIndex = 0;
          var markBlocksAsComplete = new List<UpdateOneModel<BlockTable>>();
-         foreach (BlockTable mapBlock in storageBatch.BlockTable.Values.OrderBy(b => b.BlockIndex))
+         foreach (BlockTable mapBlock in mongoStorageBatch.BlockTable.Values.OrderBy(b => b.BlockIndex))
          {
             FilterDefinition<BlockTable> filter =
                Builders<BlockTable>.Filter.Eq(block => block.BlockIndex, mapBlock.BlockIndex);
@@ -271,7 +274,7 @@ public SyncBlockInfo PushStorageBatch(StorageBatch storageBatch)
          return block;
       }
 
-      public InsertStats InsertMempoolTransactions(SyncBlockTransactionsOperation item)
+      public void InsertMempoolTransactions(SyncBlockTransactionsOperation item)
       {
          var mempool = new List<MempoolTable>();
          var inputs = new Dictionary<string, (MempoolInput mempoolInput, MempoolTable mempool)>();
@@ -349,8 +352,6 @@ public InsertStats InsertMempoolTransactions(SyncBlockTransactionsOperation item
 
          foreach (MempoolTable mempooltrx in mempool)
             globalState.LocalMempoolView.TryAdd(mempooltrx.TransactionId, string.Empty);
-
-         return new InsertStats { Items = mempool };
       }
 
       protected virtual void OnAddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOperation item)
diff --git a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockIndexer.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/SyncTasks/MongoDbBlockIndexer.cs
similarity index 96%
rename from src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockIndexer.cs
rename to src/Blockcore.Indexer.Core/Storage/Mongo/SyncTasks/MongoDbBlockIndexer.cs
index 80051f76..c393ca3f 100644
--- a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockIndexer.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/SyncTasks/MongoDbBlockIndexer.cs
@@ -4,23 +4,19 @@
 using System.Text;
 using System.Threading.Tasks;
 using Blockcore.Indexer.Core.Extensions;
-using Blockcore.Indexer.Core.Operations;
-using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
-using Blockcore.Indexer.Core.Storage;
-using Blockcore.Indexer.Core.Storage.Mongo;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Sync.SyncTasks;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
-using MongoDB.Bson;
 using MongoDB.Driver;
 
-namespace Blockcore.Indexer.Core.Sync.SyncTasks
+namespace Blockcore.Indexer.Core.Storage.Mongo.SyncTasks
 {
-   public class BlockIndexer : TaskRunner
+   public class MongoDbBlockIndexer : TaskRunner
    {
       private readonly IndexerSettings config;
-      private readonly ILogger<BlockIndexer> log;
+      private readonly ILogger<MongoDbBlockIndexer> log;
       readonly IStorage data;
 
       private readonly System.Diagnostics.Stopwatch watch;
@@ -31,9 +27,9 @@ public class BlockIndexer : TaskRunner
       Task indexingCompletTask;
       bool initialized;
 
-      public BlockIndexer(
+      public MongoDbBlockIndexer(
          IOptions<IndexerSettings> configuration,
-         ILogger<BlockIndexer> logger,
+         ILogger<MongoDbBlockIndexer> logger,
          IStorage data, IMongoDb db)
           : base(configuration, logger)
       {
diff --git a/src/Blockcore.Indexer.Core/Sync/SyncTasks/RichListSync.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/SyncTasks/RichListScanning.cs
similarity index 95%
rename from src/Blockcore.Indexer.Core/Sync/SyncTasks/RichListSync.cs
rename to src/Blockcore.Indexer.Core/Storage/Mongo/SyncTasks/RichListScanning.cs
index cf800103..b0730f06 100644
--- a/src/Blockcore.Indexer.Core/Sync/SyncTasks/RichListSync.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/SyncTasks/RichListScanning.cs
@@ -4,21 +4,19 @@
 using System.Linq;
 using System.Threading.Tasks;
 using Blockcore.Indexer.Core.Settings;
-using Blockcore.Indexer.Core.Storage;
-using Blockcore.Indexer.Core.Storage.Mongo;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Sync.SyncTasks;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 using MongoDB.Bson;
 using MongoDB.Driver;
-using MongoDB.Driver.Core.Operations;
 
-namespace Blockcore.Indexer.Core.Sync.SyncTasks
+namespace Blockcore.Indexer.Core.Storage.Mongo.SyncTasks
 {
-   public class RichListSync : TaskRunner
+   public class RichListScanning : TaskRunner
    {
       private readonly IMongoDb db;
-      private readonly ILogger<RichListSync> log;
+      private readonly ILogger<RichListScanning> log;
       private readonly IndexerSettings indexerSettings;
 
       private readonly Stopwatch watch;
@@ -26,7 +24,7 @@ public class RichListSync : TaskRunner
       private bool syncInProgress;
       DateTime lastSync;
 
-      public RichListSync(IOptions<IndexerSettings> configuration, ILogger<RichListSync> logger,IMongoDb data)
+      public RichListScanning(IOptions<IndexerSettings> configuration, ILogger<RichListScanning> logger,IMongoDb data)
          : base(configuration, logger)
       {
          db = data;
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/AddressUtxoComputedTable.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/AddressUtxoComputedTable.cs
index b3a3d5d8..e3278b1d 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/AddressUtxoComputedTable.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/AddressUtxoComputedTable.cs
@@ -1,3 +1,5 @@
+using Blockcore.Indexer.Core.Storage.Types;
+
 namespace Blockcore.Indexer.Core.Storage.Mongo.Types
 {
    /// <summary>
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/InputTable.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/InputTable.cs
index d65bbc60..a8ccfb04 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/InputTable.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/InputTable.cs
@@ -1,3 +1,5 @@
+using Blockcore.Indexer.Core.Storage.Types;
+
 namespace Blockcore.Indexer.Core.Storage.Mongo.Types
 {
    public class InputTable
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/MempoolTable.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/MempoolTable.cs
index 72e45f1b..768b7888 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/MempoolTable.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/MempoolTable.cs
@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using Blockcore.Indexer.Core.Storage.Types;
 
 namespace Blockcore.Indexer.Core.Storage.Mongo.Types
 {
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/MongoStorageBatch.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/MongoStorageBatch.cs
new file mode 100644
index 00000000..255f8011
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/MongoStorageBatch.cs
@@ -0,0 +1,43 @@
+using System.Collections.Generic;
+using System.Linq;
+using Blockcore.Indexer.Core.Operations.Types;
+
+namespace Blockcore.Indexer.Core.Storage.Mongo.Types;
+
+public class MongoStorageBatch : StorageBatch
+{
+   public long TotalSize { get; set; }
+   public List<TransactionBlockTable> TransactionBlockTable { get; set; } = new();
+   public Dictionary<long, BlockTable> BlockTable { get; set; } = new();
+   public List<TransactionTable> TransactionTable { get; set; } = new();
+   public Dictionary<string,OutputTable> OutputTable { get; set; } = new();
+   public List<InputTable> InputTable { get; set; } = new();
+
+   public override int GetBlockCount() => BlockTable.Count;
+
+   public override int GetOutputCount() => OutputTable.Count;
+
+   public override int GetInputCount() => InputTable.Count;
+
+   public override int GetTransactionCount() => TransactionBlockTable.Count;
+
+   public override long GetBatchSize() => TotalSize;
+
+   public override IEnumerable<long> GetBlockSizes() => BlockTable.Values.Select(x => x.BlockSize).ToList();
+
+   public override bool ValidateBatch(string prevBlockHash)
+   {
+      string prevHash = prevBlockHash;
+      foreach (var mapBlock in BlockTable.Values.OrderBy(b => b.BlockIndex))
+      {
+         if (mapBlock.PreviousBlockHash != prevHash)
+         {
+            return false;
+         }
+
+         prevHash = mapBlock.BlockHash;
+      }
+
+      return true;
+   }
+}
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/OutputTable.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/OutputTable.cs
index f4fac3fc..03829feb 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/OutputTable.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/OutputTable.cs
@@ -1,15 +1,9 @@
+using Blockcore.Indexer.Core.Storage.Types;
+
 namespace Blockcore.Indexer.Core.Storage.Mongo.Types
 {
-   public class OutputTable
+   public class OutputTable : Output
    {
-      public Outpoint Outpoint { get; set; }
-
-      public string Address { get; set; }
 
-      public string ScriptHex { get; set; }
-      public long Value { get; set; }
-      public uint BlockIndex { get; set; }
-      public bool CoinBase { get; set; }
-      public bool CoinStake { get; set; }
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/UnspentOutputTable.cs b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/UnspentOutputTable.cs
index 973c8302..b532027c 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/UnspentOutputTable.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Mongo/Types/UnspentOutputTable.cs
@@ -1,3 +1,5 @@
+using Blockcore.Indexer.Core.Storage.Types;
+
 namespace Blockcore.Indexer.Core.Storage.Mongo.Types;
 
 public class UnspentOutputTable
diff --git a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/Outpoint.cs b/src/Blockcore.Indexer.Core/Storage/Types/Outpoint.cs
similarity index 81%
rename from src/Blockcore.Indexer.Core/Storage/Mongo/Types/Outpoint.cs
rename to src/Blockcore.Indexer.Core/Storage/Types/Outpoint.cs
index 8ae6ff15..1bf86263 100644
--- a/src/Blockcore.Indexer.Core/Storage/Mongo/Types/Outpoint.cs
+++ b/src/Blockcore.Indexer.Core/Storage/Types/Outpoint.cs
@@ -1,4 +1,4 @@
-namespace Blockcore.Indexer.Core.Storage.Mongo.Types
+namespace Blockcore.Indexer.Core.Storage.Types
 {
    public class Outpoint
    {
diff --git a/src/Blockcore.Indexer.Core/Storage/Types/Output.cs b/src/Blockcore.Indexer.Core/Storage/Types/Output.cs
new file mode 100644
index 00000000..d313766b
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Storage/Types/Output.cs
@@ -0,0 +1,14 @@
+namespace Blockcore.Indexer.Core.Storage.Types;
+
+public class Output
+{
+   public Outpoint Outpoint { get; set; }
+
+   public string Address { get; set; }
+
+   public string ScriptHex { get; set; }
+   public long Value { get; set; }
+   public uint BlockIndex { get; set; }
+   public bool CoinBase { get; set; }
+   public bool CoinStake { get; set; }
+}
diff --git a/src/Blockcore.Indexer.Core/Storage/Types/PeerDetails.cs b/src/Blockcore.Indexer.Core/Storage/Types/PeerDetails.cs
new file mode 100644
index 00000000..0e4e79ec
--- /dev/null
+++ b/src/Blockcore.Indexer.Core/Storage/Types/PeerDetails.cs
@@ -0,0 +1,8 @@
+using Blockcore.Indexer.Core.Client.Types;
+
+namespace Blockcore.Indexer.Core.Storage.Types;
+
+public class PeerDetails : PeerInfo
+{
+
+}
diff --git a/src/Blockcore.Indexer.Core/Sync/SyncOperations.cs b/src/Blockcore.Indexer.Core/Sync/SyncOperations.cs
index 19038a39..98838c9b 100644
--- a/src/Blockcore.Indexer.Core/Sync/SyncOperations.cs
+++ b/src/Blockcore.Indexer.Core/Sync/SyncOperations.cs
@@ -1,7 +1,6 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using Blockcore.Consensus.BlockInfo;
 using Blockcore.Consensus.ScriptInfo;
 using Blockcore.Consensus.TransactionInfo;
 using Blockcore.Indexer.Core.Client;
@@ -10,13 +9,10 @@
 using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
 using Blockcore.Indexer.Core.Storage;
-using Blockcore.Indexer.Core.Storage.Mongo;
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
 using Blockcore.Indexer.Core.Storage.Types;
 using Microsoft.Extensions.Caching.Memory;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
-using MongoDB.Driver;
 
 namespace Blockcore.Indexer.Core.Sync
 {
@@ -26,7 +22,6 @@ namespace Blockcore.Indexer.Core.Sync
    public class SyncOperations : ISyncOperations
    {
       private readonly IStorage storage;
-      private readonly IMongoDb db;
 
       private readonly ILogger<SyncOperations> log;
 
@@ -50,7 +45,7 @@ public SyncOperations(
          IOptions<IndexerSettings> configuration,
          IMemoryCache cache,
          GlobalState globalState, ICryptoClientFactory clientFactory,
-         ISyncBlockTransactionOperationBuilder blockInfoEnrichment, IMongoDb db)
+         ISyncBlockTransactionOperationBuilder blockInfoEnrichment)
       {
          this.configuration = configuration.Value;
          log = logger;
@@ -59,7 +54,6 @@ public SyncOperations(
          this.globalState = globalState;
          this.clientFactory = clientFactory;
          transactionOperationBuilder = blockInfoEnrichment;
-         this.db = db;
 
          // Register the cold staking template.
          StandardScripts.RegisterStandardScriptTemplate(ColdStakingScriptTemplate.Instance);
@@ -69,11 +63,11 @@ public SyncOperations(
 
       public void InitializeMmpool()
       {
-         var allitems = db.Mempool.AsQueryable().ToList();
+         var mempoolTransactionIds = storage.GetMempoolTransactionIds();
 
-         foreach (MempoolTable allitem in allitems)
+         foreach (var transactionId in mempoolTransactionIds)
          {
-            globalState.LocalMempoolView.TryAdd(allitem.TransactionId, string.Empty);
+            globalState.LocalMempoolView.TryAdd(transactionId, string.Empty);
          }
       }
 
@@ -169,10 +163,7 @@ private SyncPoolTransactions FindPoolInternal(SyncConnection connection)
          {
             List<string> toRemoveFromMempool = deleteTransaction;
 
-            FilterDefinitionBuilder<MempoolTable> builder = Builders<MempoolTable>.Filter;
-            FilterDefinition<MempoolTable> filter = builder.In(mempoolItem => mempoolItem.TransactionId, toRemoveFromMempool);
-
-            db.Mempool.DeleteMany(filter);
+            storage.DeleteTransactionsFromMempool(toRemoveFromMempool);
 
             foreach (string mempooltrx in toRemoveFromMempool)
                globalState.LocalMempoolView.Remove(mempooltrx, out _);
@@ -236,7 +227,7 @@ private SyncBlockTransactionsOperation SyncBlockInternal(SyncConnection connecti
 
          string hex = client.GetBlockHex(block.Hash);
 
-         var blockItem = Block.Parse(hex, connection.Network.Consensus.ConsensusFactory);
+         var blockItem = Consensus.BlockInfo.Block.Parse(hex, connection.Network.Consensus.ConsensusFactory);
 
          foreach (Transaction blockItemTransaction in blockItem.Transactions)
          {
diff --git a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockPuller.cs b/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockPuller.cs
index ccdbf2f5..fe0b32e2 100644
--- a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockPuller.cs
+++ b/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockPuller.cs
@@ -9,6 +9,7 @@
 using Blockcore.Indexer.Core.Operations;
 using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
+using Blockcore.Indexer.Core.Storage;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 
@@ -35,6 +36,8 @@ public class BlockPuller : TaskRunner
 
       readonly ICryptoClientFactory clientFactory;
 
+      readonly IStorageBatchFactory StorageBatchFactory;
+
       private readonly IEnumerable<long> bip30Blocks = new List<long> {91842 , 91880 };
 
       private readonly BlockingCollection<SyncBlockTransactionsOperation> pendingBlocksToAddToStorage = new();
@@ -52,12 +55,14 @@ public BlockPuller(
          SyncConnection syncConnection,
          ILogger<BlockPuller> logger,
          IStorageOperations storageOperations,
-         ICryptoClientFactory clientFactory)
+         ICryptoClientFactory clientFactory,
+         IStorageBatchFactory storageBatchFactory)
           : base(configuration, logger)
       {
          log = logger;
          this.storageOperations = storageOperations;
          this.clientFactory = clientFactory;
+         StorageBatchFactory = storageBatchFactory;
          this.syncConnection = syncConnection;
          this.syncOperations = syncOperations;
          config = configuration.Value;
@@ -108,7 +113,7 @@ public override async Task<bool> OnExecute()
          {
             // start pulling blocks form this tip
             Runner.GlobalState.PullingTip = await clientFactory.Create(syncConnection).GetBlockAsync(Runner.GlobalState.StoreTip.BlockHash);
-            currentStorageBatch = new StorageBatch();
+            currentStorageBatch = StorageBatchFactory.GetStorageBatch();
 
             log.LogInformation($"Fetching block started at block {Runner.GlobalState.PullingTip.Height}({Runner.GlobalState.PullingTip.Hash})");
          }
@@ -211,21 +216,21 @@ private void ProcessFromBlockingCollection()
             bool bip30Issue = bip30Blocks.Contains(block.BlockInfo.Height + 1);
 
             if (ibd && !bip30Issue &&
-                currentStorageBatch.BlockTable.Count < config.MongoBatchCount &&
-                currentStorageBatch.TotalSize <= config.MongoBatchSize)
+                currentStorageBatch.GetBlockCount() < config.DbBatchCount &&
+                currentStorageBatch.GetBatchSize() <= config.DbBatchSize)
             {
                continue;
             }
 
-            long totalBlocks = currentStorageBatch.BlockTable.Count;
+            long totalBlocks = currentStorageBatch.GetBlockCount();
             double totalSeconds = watchBatch.Elapsed.TotalSeconds;
             double blocksPerSecond = totalBlocks / totalSeconds;
             double secondsPerBlock = totalSeconds / totalBlocks;
 
-            log.LogInformation($"Puller - blocks={currentStorageBatch.BlockTable.Count}, height = {block.BlockInfo.Height}, batch size = {((decimal)currentStorageBatch.TotalSize / 1000000):0.00}mb, Seconds = {watchBatch.Elapsed.TotalSeconds}, fetchs = {blocksPerSecond:0.00}b/s ({secondsPerBlock:0.00}s/b). ({pendingBlocksToAddToStorage.Count})");
+            log.LogInformation($"Puller - blocks={currentStorageBatch.GetBlockCount()}, height = {block.BlockInfo.Height}, batch size = {((decimal)currentStorageBatch.GetBatchSize() / 1000000):0.00}mb, Seconds = {watchBatch.Elapsed.TotalSeconds}, fetchs = {blocksPerSecond:0.00}b/s ({secondsPerBlock:0.00}s/b). ({pendingBlocksToAddToStorage.Count})");
 
             Runner.Get<BlockStore>().Enqueue(currentStorageBatch);
-            currentStorageBatch = new StorageBatch();
+            currentStorageBatch = StorageBatchFactory.GetStorageBatch();
 
             watchBatch.Restart();
          }
diff --git a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStartup.cs b/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStartup.cs
index 44befc85..f2b818cc 100644
--- a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStartup.cs
+++ b/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStartup.cs
@@ -7,7 +7,6 @@
 using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
 using Blockcore.Indexer.Core.Storage;
-using Blockcore.Indexer.Core.Storage.Mongo;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 
@@ -25,8 +24,9 @@ public class BlockStartup : TaskStarter
       private readonly SyncConnection connection;
       private readonly IStorageOperations storageOperations;
       readonly ICryptoClientFactory clientFactory;
-      private readonly MongoData mongoData;
+      private readonly IStorage storageData;
       readonly IOptions<IndexerSettings> indexerSettings;
+      readonly IStorageBatchFactory StorageBatchFactory;
 
       /// <summary>
       /// Initializes a new instance of the <see cref="BlockStartup"/> class.
@@ -38,17 +38,19 @@ public BlockStartup(
          IStorageOperations storageOperations,
          ICryptoClientFactory clientFactory,
          IStorage data,
-         IOptions<IndexerSettings> indexerSettings)
+         IOptions<IndexerSettings> indexerSettings,
+         IStorageBatchFactory storageBatchFactory)
           : base(logger)
       {
          connection = syncConnection;
          this.storageOperations = storageOperations;
          this.clientFactory = clientFactory;
          this.indexerSettings = indexerSettings;
+         StorageBatchFactory = storageBatchFactory;
          this.syncOperations = syncOperations;
          log = logger;
 
-         mongoData = (MongoData)data;
+         storageData = data;
 
       }
 
@@ -67,7 +69,7 @@ public override async Task OnExecute()
       {
          IBlockchainClient client = clientFactory.Create(connection);
 
-         List<string> allIndexes = mongoData.GetBlockIndexIndexes();
+         List<string> allIndexes = storageData.GetBlockIndexIndexes();
 
          if (allIndexes.Count == indexerSettings.Value.IndexCountForBlockIndexProperty)
          {
@@ -92,7 +94,7 @@ public override async Task OnExecute()
             BlockInfo genesisBlock = await client.GetBlockAsync(genesisHash);
             SyncBlockTransactionsOperation block = syncOperations.FetchFullBlock(connection, genesisBlock);
 
-            StorageBatch genesisBatch = new StorageBatch();
+            StorageBatch genesisBatch = StorageBatchFactory.GetStorageBatch();
             storageOperations.AddToStorageBatch(genesisBatch, block);
             Runner.GlobalState.StoreTip = storageOperations.PushStorageBatch(genesisBatch);
          }
diff --git a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStore.cs b/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStore.cs
index 3446dc2c..36f38d02 100644
--- a/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStore.cs
+++ b/src/Blockcore.Indexer.Core/Sync/SyncTasks/BlockStore.cs
@@ -6,7 +6,6 @@
 using Blockcore.Indexer.Core.Operations;
 using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
-using Blockcore.Indexer.Core.Storage.Mongo.Types;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 
@@ -23,7 +22,6 @@ public class BlockStore : TaskRunner<StorageBatch>
       private readonly ISyncOperations syncOperations;
 
       private readonly SyncConnection syncConnection;
-      readonly IUtxoCache utxoCache;
 
       private readonly System.Diagnostics.Stopwatch watch;
 
@@ -35,14 +33,12 @@ public BlockStore(
          ILogger<BlockStore> logger,
          IStorageOperations storageOperations,
          ISyncOperations syncOperations,
-         SyncConnection syncConnection,
-         IUtxoCache utxoCache)
+         SyncConnection syncConnection)
           : base(configuration, logger)
       {
          this.storageOperations = storageOperations;
          this.syncOperations = syncOperations;
          this.syncConnection = syncConnection;
-         this.utxoCache = utxoCache;
          log = logger;
          watch = Stopwatch.Start();
       }
@@ -50,7 +46,7 @@ public BlockStore(
       /// <inheritdoc />
       public override async Task<bool> OnExecute()
       {
-         if (Runner.GlobalState.ReorgMode == true)
+         if (Runner.GlobalState.ReorgMode)
          {
             // null the store tip so the document count will be taken form disk
             Runner.GlobalState.StoreTip = null;
@@ -71,7 +67,8 @@ public override async Task<bool> OnExecute()
          if (!TryDequeue(out StorageBatch batch))
             return await Task.FromResult(false);
 
-         ValidateBatch(batch);
+         if (batch.ValidateBatch(Runner.GlobalState.StoreTip.BlockHash) == false)
+            throw new ApplicationException("None consecutive block received");
 
          watch.Restart();
 
@@ -82,15 +79,15 @@ public override async Task<bool> OnExecute()
          if (Runner.GlobalState.StoreTip == null)
             throw new ApplicationException("Store tip was not persisted");
 
-         long totalBlocks = batch.BlockTable.Count;// insertStats.Sum((tuple => tuple.count));
+         long totalBlocks = batch.GetBlockCount();// insertStats.Sum((tuple => tuple.count));
          double totalSeconds = watch.Elapsed.TotalSeconds;// insertStats.Sum((tuple => tuple.seconds));
          double blocksPerSecond = totalBlocks / totalSeconds;
          double secondsPerBlock = totalSeconds / totalBlocks;
 
-         log.LogInformation($"Store - blocks={batch.BlockTable.Count}, outputs={batch.OutputTable.Count}, inputs={batch.InputTable.Count}, trx={batch.TransactionBlockTable.Count}, total Size = {((decimal)batch.TotalSize / 1000000):0.00}mb, tip={Runner.GlobalState.StoreTip.BlockIndex}, Seconds = {watch.Elapsed.TotalSeconds}, inserts = {blocksPerSecond:0.00}b/s ({secondsPerBlock:0.00}s/b)");
+         log.LogInformation($"Store - blocks={batch.GetBlockCount()}, outputs={batch.GetOutputCount()}, inputs={batch.GetInputCount()}, trx={batch.GetTransactionCount()}, total Size = {((decimal)batch.GetBatchSize() / 1000000):0.00}mb, tip={Runner.GlobalState.StoreTip.BlockIndex}, Seconds = {watch.Elapsed.TotalSeconds}, inserts = {blocksPerSecond:0.00}b/s ({secondsPerBlock:0.00}s/b)");
 
-         foreach (BlockTable mapBlocksValue in batch.BlockTable.Values)
-            syncConnection.RecentItems.Add((DateTime.UtcNow, TimeSpan.FromSeconds(blocksPerSecond), mapBlocksValue.BlockSize));
+         foreach (var blockSiz in batch.GetBlockSizes())
+            syncConnection.RecentItems.Add((DateTime.UtcNow, TimeSpan.FromSeconds(blocksPerSecond), blockSiz));
 
          var notifications = new AddressNotifications { Addresses = new List<string>() };// count.Items.Where(ad => ad.Addresses != null).SelectMany(s => s.Addresses).Distinct().ToList() };
          Runner.Get<Notifier>().Enqueue(notifications);
@@ -98,20 +95,5 @@ public override async Task<bool> OnExecute()
          return await Task.FromResult(true);
 
       }
-
-      void ValidateBatch(StorageBatch item)
-      {
-         // check all blocks are consecutive and start from the last block in store.
-         string prevHash = Runner.GlobalState.StoreTip.BlockHash;
-         foreach (BlockTable mapBlock in item.BlockTable.Values.OrderBy(b => b.BlockIndex))
-         {
-            if (mapBlock.PreviousBlockHash != prevHash)
-            {
-               throw new ApplicationException("None consecutive block received");
-            }
-
-            prevHash = mapBlock.BlockHash;
-         }
-      }
    }
 }
diff --git a/src/Blockcore.Indexer.Core/Sync/SyncTasks/StatsSyncer.cs b/src/Blockcore.Indexer.Core/Sync/SyncTasks/StatsSyncer.cs
index f3b89689..1aa00581 100644
--- a/src/Blockcore.Indexer.Core/Sync/SyncTasks/StatsSyncer.cs
+++ b/src/Blockcore.Indexer.Core/Sync/SyncTasks/StatsSyncer.cs
@@ -8,7 +8,7 @@
 using Blockcore.Indexer.Core.Operations.Types;
 using Blockcore.Indexer.Core.Settings;
 using Blockcore.Indexer.Core.Storage;
-using Blockcore.Indexer.Core.Storage.Mongo;
+using Blockcore.Indexer.Core.Storage.Types;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 
@@ -25,7 +25,7 @@ public class StatsSyncer : TaskRunner
 
       private readonly IStorageOperations storageOperations;
 
-      private readonly MongoData data;
+      private readonly IStorage data;
 
       private readonly System.Diagnostics.Stopwatch watch;
 
@@ -43,7 +43,7 @@ public StatsSyncer(
       {
          log = logger;
 
-         data = (MongoData)storage;
+         data = storage;
          this.statsHandler = statsHandler;
          this.storageOperations = storageOperations;
 
@@ -67,7 +67,28 @@ public override async Task<bool> OnExecute()
          // TODO: Look into potential optimization on updates, not replacing the whole document for all connected nodes all the time.
          foreach (PeerInfo peer in peers)
          {
-            await data.InsertPeer(peer);
+            await data.InsertPeer(new PeerDetails
+            {
+               Addr = peer.Addr,
+               AddrLocal = peer.AddrLocal,
+               Version = peer.Version,
+               Inbound = peer.Inbound,
+               Services = peer.Services,
+               BanScore = peer.BanScore,
+               BytesRecv = peer.BytesRecv,
+               BytesSent = peer.BytesSent,
+               ConnTime = peer.ConnTime,
+               PingTime = peer.PingTime,
+               InFlight = peer.InFlight,
+               LastRecv = peer.LastRecv,
+               LastSeen = peer.LastSeen,
+               LastSend = peer.LastSend,
+               StartingHeight = peer.StartingHeight,
+               SubVer = peer.SubVer,
+               SyncedBlocks = peer.SyncedBlocks,
+               SyncedHeaders = peer.SyncedHeaders,
+               WhiteListed = peer.WhiteListed
+            });
          }
 
          log.LogInformation($"Time taken to update peers in database: {watch.Elapsed.TotalSeconds}.");
diff --git a/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoDataTests.cs b/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoDataTests.cs
index 81ed5aef..cf9fdb75 100644
--- a/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoDataTests.cs
+++ b/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoDataTests.cs
@@ -11,6 +11,7 @@
 using Blockcore.Indexer.Core.Storage;
 using Blockcore.Indexer.Core.Storage.Mongo;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using Blockcore.Networks;
 using Microsoft.Extensions.Options;
 using Moq;
diff --git a/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoStorageOperationsTests.cs b/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoStorageOperationsTests.cs
index 99b7c37c..70522640 100644
--- a/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoStorageOperationsTests.cs
+++ b/src/Blockcore.Indexer.Tests/Storage/Mongo/MongoStorageOperationsTests.cs
@@ -14,6 +14,7 @@
 using Blockcore.Indexer.Core.Storage;
 using Blockcore.Indexer.Core.Storage.Mongo;
 using Blockcore.Indexer.Core.Storage.Mongo.Types;
+using Blockcore.Indexer.Core.Storage.Types;
 using Blockcore.NBitcoin;
 using Blockcore.Networks;
 using FluentAssertions;
@@ -86,7 +87,6 @@ public MongoStorageOperationsTests()
 
       sut = new MongoStorageOperations(syncConnection,
          mongodbMock.MongoDbObject,
-         new UtxoCache(null),
          indexSettingsMock.Object,
          globalState,
          new MapMongoBlockToStorageBlock(),
@@ -154,9 +154,9 @@ static SyncBlockTransactionsOperation WithRandomSyncBlockTransactionsOperation()
       return item;
    }
 
-   StorageBatch WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully()
+   MongoStorageBatch WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
 
       var block = NewRandomBlockTable;
       batch.BlockTable.Add(block.BlockIndex, block);
@@ -167,7 +167,7 @@ StorageBatch WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully()
       return batch;
    }
 
-   void WithASuccessfulDeleteManyOnUnspentOutputTable(StorageBatch batch)
+   void WithASuccessfulDeleteManyOnUnspentOutputTable(MongoStorageBatch batch)
    {
       var utxo = batch.InputTable.Select(_ => _.Outpoint).ToList();
 
@@ -181,7 +181,7 @@ void WithASuccessfulDeleteManyOnUnspentOutputTable(StorageBatch batch)
    [Fact]
    public void AddToStorageBatchSetsTheTotalSizeFromBlockInfo()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
 
       var item = WithRandomSyncBlockTransactionsOperation();
 
@@ -193,7 +193,7 @@ public void AddToStorageBatchSetsTheTotalSizeFromBlockInfo()
    [Fact]
    public void AddToStorageBatchSetsTheBlockTableFromBlockInfo()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
 
       var item = WithRandomSyncBlockTransactionsOperation();
 
@@ -215,7 +215,7 @@ public void AddToStorageBatchSetsTheBlockTableFromBlockInfo()
    [Fact]
    public void AddToStorageBatchSetsTheTransactionBlockTableFromTransactions()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
 
       var item = WithRandomSyncBlockTransactionsOperation();
 
@@ -232,7 +232,7 @@ public void AddToStorageBatchSetsTheTransactionBlockTableFromTransactions()
    [Fact]
    public void AddToStorageBatchWithStoreRawTransactionsTrueSetsTransactionTable()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
 
       var item = WithRandomSyncBlockTransactionsOperation();
 
@@ -253,7 +253,7 @@ public void AddToStorageBatchWithStoreRawTransactionsTrueSetsTransactionTable()
    [Fact]
    public void AddToStorageBatchSetsTheOutputsInTheTransactionToTheOutputTable()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
       var valueMoney = new Money(NewRandomInt32);
       var script = new Script(NewRandomString.Replace('-','1'));
       var item = WithRandomSyncBlockTransactionsOperation();
@@ -299,7 +299,7 @@ public void AddToStorageBatchSetsTheOutputsInTheTransactionToTheOutputTable()
    [Fact]
    public void AddToStorageBatchSetsTheInputsInInputTableWithoutAddress()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
       var hash = new uint256($"{NewRandomInt64}{NewRandomInt64}{NewRandomInt64}{NewRandomInt64}".Substring(0,64));
       int n = NewRandomInt32;
       var expectedOutpoint = new OutPoint
@@ -339,7 +339,7 @@ public void AddToStorageBatchSetsTheInputsInInputTableWithoutAddress()
    [Fact]
    public void AddToStorageBatchSetsTheInputsInInputTableWithAddressAndValue()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
       var valueMoney = new Money(NewRandomInt32);
       var script = new Script(NewRandomString.Replace('-','1'));
       var transaction = new Transaction { Outputs = { { new TxOut { Value = valueMoney, ScriptPubKey = script } } } };
@@ -370,7 +370,7 @@ public void AddToStorageBatchSetsTheInputsInInputTableWithAddressAndValue()
    [Fact]
    public void PushStorageBatchAddsBlockTableFromBatchToMongoDb()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
 
       var block = NewRandomBlockTable;
       batch.BlockTable.Add(block.BlockIndex, block);
@@ -387,7 +387,7 @@ public void PushStorageBatchAddsBlockTableFromBatchToMongoDb()
    [Fact]
    public void PushStorageBatchAddsTransactionBlockTableFromBatchToMongoDb()
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       var blockTable = new TransactionBlockTable
       {
@@ -406,7 +406,7 @@ public void PushStorageBatchAddsTransactionBlockTableFromBatchToMongoDb()
    [Fact]
    public void PushStorageBatchAddsOutputTableFromBatchToMongoDb()
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       var outputTable = new OutputTable()
       {
@@ -430,7 +430,7 @@ public void PushStorageBatchAddsOutputTableFromBatchToMongoDb()
    [Fact]
    public void PushStorageBatchAddsInputTableAddsToMongodb()
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       //We must have an unspent output for an input that is being processed
       var outpoint = new Outpoint { OutputIndex = NewRandomInt32, TransactionId = NewRandomString };
@@ -466,7 +466,7 @@ public void PushStorageBatchAddsInputTableAddsToMongodb()
    [Fact]
    public void PushStorageBatchAddsTransactionTableDataToMongodb()
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       var transactionTable = new TransactionTable()
          {
@@ -486,7 +486,7 @@ public void PushStorageBatchAddsTransactionTableDataToMongodb()
    public void PushStorageBatchIgnoresDuplicatsOnInputTableForDuplicateKeyException()
 #pragma warning restore xUnit1013 // Public method should be marked as test
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       var transactionTable = new TransactionTable()
       {
@@ -513,7 +513,7 @@ public void PushStorageBatchIgnoresDuplicatsOnInputTableForDuplicateKeyException
    [Fact]
    public void PushStorageBatchAddsUnspendOutputToMongodbForEachOutputTableItem()
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       var outputTable = new OutputTable
       {
@@ -541,7 +541,7 @@ public void PushStorageBatchAddsUnspendOutputToMongodbForEachOutputTableItem()
    [Fact]
    public void PushStorageBatchAddsDeletsFromUnspentOutputTableOnMongoDbForAllInputTableItems()
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       //We must have an unspent output for an input that is being processed
       var outpoint = new Outpoint { OutputIndex = NewRandomInt32, TransactionId = NewRandomString };
@@ -578,7 +578,7 @@ public void PushStorageBatchAddsDeletsFromUnspentOutputTableOnMongoDbForAllInput
    [Fact]
    public void PushStorageBatchUpdatesBlockTableItemsWithSyncCompleteTrueInMongodb()
    {
-      StorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
+      MongoStorageBatch batch = WithBatchThatHasABlockToPushAndUpdatesToSyncCompleteSuccessfully();
 
       sut.PushStorageBatch(batch);
 
@@ -602,7 +602,7 @@ public void PushStorageBatchUpdatesBlockTableItemsWithSyncCompleteTrueInMongodb(
    [Fact]
    public void PushStorageBatchThrowsWhenTheBlockInertedIsNotTheSameHashAsTopBlockInMongodb()
    {
-      var batch = new StorageBatch();
+      var batch = new MongoStorageBatch();
 
       var dbBlock = NewRandomBlockTable;
       var storageBlock = NewRandomBlockTable;
diff --git a/src/Blockcore.Indexer/appsettings.json b/src/Blockcore.Indexer/appsettings.json
index c67bc07e..b646ac7a 100644
--- a/src/Blockcore.Indexer/appsettings.json
+++ b/src/Blockcore.Indexer/appsettings.json
@@ -18,6 +18,7 @@
       }
    },
    "Indexer": {
+      "DbType": "MongoDb",
       "ConnectionString": "mongodb://{Symbol}-mongo",
       "DatabaseNameSubfix": true,
 
@@ -33,8 +34,8 @@
       // Syncing parameters
       "SyncBlockchain": true,
       "SyncMemoryPool": true,
-      "MongoBatchSize": 10000000,
-      "MongoBatchCount" : 10000,
+      "DbBatchSize": 10000000,
+      "DbBatchCount" : 10000,
       "ParallelRequestsToTransactionRpc": 50,
       "DetailedTrace": 0,
       "MaxItemsInQueue": 10,