diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java
index 5c246de..223cfec 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionManager.java
@@ -49,7 +49,7 @@
     private final List<PartitionId> sortedPartitions;
     private final AsyncConsistentMap<TransactionId, Transaction.State> transactions;
     private final int cacheSize;
-    private final Map<PartitionId, Cache<String, AsyncConsistentMap>> partitionCache = Maps.newConcurrentMap();
+    private final Map<PartitionId, Cache<String, CachedMap>> partitionCache = Maps.newConcurrentMap();
 
     public TransactionManager(StorageService storageService, PartitionService partitionService) {
         this(storageService, partitionService, DEFAULT_CACHE_SIZE);
@@ -113,18 +113,17 @@
             PartitionId partitionId,
             Serializer serializer,
             TransactionCoordinator transactionCoordinator) {
-        Cache<String, AsyncConsistentMap> mapCache = partitionCache.computeIfAbsent(partitionId, p ->
+        Cache<String, CachedMap> mapCache = partitionCache.computeIfAbsent(partitionId, p ->
                 CacheBuilder.newBuilder().maximumSize(cacheSize / partitionService.getNumberOfPartitions()).build());
         try {
-            AsyncConsistentMap<K, V> baseMap = partitionService.getDistributedPrimitiveCreator(partitionId)
-                            .newAsyncConsistentMap(mapName, serializer);
-            AsyncConsistentMap<K, V> asyncMap = mapCache.get(mapName, () ->
-                    DistributedPrimitives.newCachingMap(baseMap));
+            CachedMap<K, V> cachedMap = mapCache.get(mapName,
+                    () -> new CachedMap<>(partitionService.getDistributedPrimitiveCreator(partitionId)
+                            .newAsyncConsistentMap(mapName, serializer)));
 
             Transaction<MapUpdate<K, V>> transaction = new Transaction<>(
                     transactionCoordinator.transactionId,
-                    baseMap);
-            return new DefaultTransactionalMapParticipant<>(asyncMap.asConsistentMap(), transaction);
+                    cachedMap.baseMap);
+            return new DefaultTransactionalMapParticipant<>(cachedMap.cachedMap.asConsistentMap(), transaction);
         } catch (ExecutionException e) {
             throw new TransactionException(e);
         }
@@ -150,4 +149,14 @@
     CompletableFuture<Void> remove(TransactionId transactionId) {
         return transactions.remove(transactionId).thenApply(v -> null);
     }
+
+    private static class CachedMap<K, V> {
+        private final AsyncConsistentMap<K, V> baseMap;
+        private final AsyncConsistentMap<K, V> cachedMap;
+
+        public CachedMap(AsyncConsistentMap<K, V> baseMap) {
+            this.baseMap = baseMap;
+            this.cachedMap = DistributedPrimitives.newCachingMap(baseMap);
+        }
+    }
 }
\ No newline at end of file
