diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CatalystSerializers.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CatalystSerializers.java
index f8e111b..cb78e27 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CatalystSerializers.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/CatalystSerializers.java
@@ -32,6 +32,7 @@
 import org.onlab.util.Match;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.event.Change;
+import org.onosproject.store.primitives.TransactionId;
 import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapCommands;
 import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapState;
 import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorCommands;
@@ -40,8 +41,6 @@
 import org.onosproject.store.primitives.resources.impl.MapUpdate;
 import org.onosproject.store.primitives.resources.impl.PrepareResult;
 import org.onosproject.store.primitives.resources.impl.RollbackResult;
-import org.onosproject.store.primitives.resources.impl.TransactionId;
-import org.onosproject.store.primitives.resources.impl.TransactionalMapUpdate;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.Versioned;
@@ -66,7 +65,8 @@
                                 MapEntryUpdateResult.Status.class,
                                 MapUpdate.class,
                                 MapUpdate.Type.class,
-                                TransactionalMapUpdate.class,
+                                Transaction.class,
+                                Transaction.State.class,
                                 TransactionId.class,
                                 PrepareResult.class,
                                 CommitResult.class,
@@ -99,7 +99,8 @@
         serializer.register(Match.class, factory);
         serializer.register(MapEntryUpdateResult.class, factory);
         serializer.register(MapEntryUpdateResult.Status.class, factory);
-        serializer.register(TransactionalMapUpdate.class, factory);
+        serializer.register(Transaction.class, factory);
+        serializer.register(Transaction.State.class, factory);
         serializer.register(PrepareResult.class, factory);
         serializer.register(CommitResult.class, factory);
         serializer.register(RollbackResult.class, factory);
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseManager.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseManager.java
index 587778c..d5cce9b2 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseManager.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseManager.java
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
@@ -46,7 +47,6 @@
 import net.kuujo.copycat.protocol.Protocol;
 import net.kuujo.copycat.util.concurrent.NamedThreadFactory;
 
-import org.apache.commons.lang.math.RandomUtils;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -63,10 +63,12 @@
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cluster.PartitionId;
 import org.onosproject.core.ApplicationId;
-import org.onosproject.core.IdGenerator;
 import org.onosproject.persistence.PersistenceService;
 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.MapUpdate;
 import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.AsyncConsistentMap;
 import org.onosproject.store.service.AtomicCounterBuilder;
 import org.onosproject.store.service.AtomicValueBuilder;
 import org.onosproject.store.service.ConsistentMapBuilder;
@@ -79,7 +81,6 @@
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.StorageAdminService;
 import org.onosproject.store.service.StorageService;
-import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.TransactionContextBuilder;
 import org.slf4j.Logger;
 
@@ -112,7 +113,8 @@
     protected NodeId localNodeId;
 
     private TransactionManager transactionManager;
-    private final IdGenerator transactionIdGenerator = () -> RandomUtils.nextLong();
+    private final Supplier<TransactionId> transactionIdGenerator =
+            () -> TransactionId.from(UUID.randomUUID().toString());
 
     private ApplicationListener appListener = new InternalApplicationListener();
 
@@ -212,7 +214,17 @@
 
         Futures.getUnchecked(status);
 
-        transactionManager = new TransactionManager(partitionedDatabase, consistentMapBuilder());
+        AsyncConsistentMap<TransactionId, Transaction> transactions =
+                this.<TransactionId, Transaction>consistentMapBuilder()
+                    .withName("onos-transactions")
+                    .withSerializer(Serializer.using(KryoNamespaces.API,
+                            MapUpdate.class,
+                            MapUpdate.Type.class,
+                            Transaction.class,
+                            Transaction.State.class))
+                    .buildAsyncMap();
+
+        transactionManager = new TransactionManager(partitionedDatabase, transactions);
         partitionedDatabase.setTransactionManager(transactionManager);
 
         log.info("Started");
@@ -238,7 +250,9 @@
 
     @Override
     public TransactionContextBuilder transactionContextBuilder() {
-        return new DefaultTransactionContextBuilder(this, transactionIdGenerator.getNewId());
+        return new DefaultTransactionContextBuilder(this::consistentMapBuilder,
+                transactionManager::execute,
+                transactionIdGenerator.get());
     }
 
     @Override
@@ -385,8 +399,8 @@
     }
 
     @Override
-    public Collection<Transaction> getTransactions() {
-        return complete(transactionManager.getTransactions());
+    public Collection<TransactionId> getPendingTransactions() {
+        return complete(transactionManager.getPendingTransactionIds());
     }
 
     private static <T> T complete(CompletableFuture<T> future) {
@@ -402,11 +416,6 @@
         }
     }
 
-    @Override
-    public void redriveTransactions() {
-        getTransactions().stream().forEach(transactionManager::execute);
-    }
-
     protected <K, V> DefaultAsyncConsistentMap<K, V> registerMap(DefaultAsyncConsistentMap<K, V> map) {
         maps.put(map.name(), map);
         if (map.applicationId() != null) {
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseProxy.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseProxy.java
index 5c675eb..8352528 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseProxy.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseProxy.java
@@ -17,7 +17,6 @@
 package org.onosproject.store.primitives.impl;
 
 import org.onlab.util.Match;
-import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
 import java.util.Collection;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseSerializer.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseSerializer.java
index 872bbeb..b91f4c9 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseSerializer.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseSerializer.java
@@ -21,10 +21,10 @@
 import org.onlab.util.KryoNamespace;
 import org.onlab.util.Match;
 import org.onosproject.cluster.NodeId;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.MapUpdate;
 import org.onosproject.store.serializers.KryoNamespaces;
 import org.onosproject.store.serializers.KryoSerializer;
-import org.onosproject.store.service.DatabaseUpdate;
-import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
 import net.kuujo.copycat.cluster.internal.MemberInfo;
@@ -69,13 +69,14 @@
     private static final KryoNamespace ONOS_STORE = KryoNamespace.newBuilder()
             .nextId(KryoNamespace.FLOATING_ID)
             .register(Versioned.class)
-            .register(DatabaseUpdate.class)
-            .register(DatabaseUpdate.Type.class)
+            .register(MapUpdate.class)
+            .register(MapUpdate.Type.class)
             .register(Result.class)
             .register(UpdateResult.class)
             .register(Result.Status.class)
-            .register(DefaultTransaction.class)
+            .register(Transaction.class)
             .register(Transaction.State.class)
+            .register(TransactionId.class)
             .register(org.onosproject.store.primitives.impl.CommitResponse.class)
             .register(Match.class)
             .register(NodeId.class)
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseState.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseState.java
index de308f5..58801e8 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseState.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DatabaseState.java
@@ -22,7 +22,6 @@
 import net.kuujo.copycat.state.StateContext;
 
 import org.onlab.util.Match;
-import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
 import java.util.Collection;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabase.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabase.java
index 53edcbf..e4de296 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabase.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabase.java
@@ -26,7 +26,6 @@
 import net.kuujo.copycat.util.function.TriConsumer;
 
 import org.onlab.util.Match;
-import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
 import java.util.Collection;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabaseState.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabaseState.java
index 45869ff..d6d4ab4 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabaseState.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultDatabaseState.java
@@ -26,8 +26,8 @@
 import net.kuujo.copycat.state.StateContext;
 
 import org.onlab.util.Match;
-import org.onosproject.store.service.DatabaseUpdate;
-import org.onosproject.store.service.Transaction;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.MapUpdate;
 import org.onosproject.store.service.Versioned;
 
 import java.util.Arrays;
@@ -278,7 +278,7 @@
         return queues.computeIfAbsent(queueName, name -> new LinkedList<>());
     }
 
-    private boolean isUpdatePossible(DatabaseUpdate update) {
+    private boolean isUpdatePossible(MapUpdate<String, byte[]> update) {
         Versioned<byte[]> existingEntry = mapGet(update.mapName(), update.key());
         switch (update.type()) {
         case PUT:
@@ -299,7 +299,7 @@
         }
     }
 
-    private void doProvisionalUpdate(DatabaseUpdate update, long transactionId) {
+    private void doProvisionalUpdate(MapUpdate<String, byte[]> update, TransactionId transactionId) {
         Map<String, Update> lockMap = getLockMap(update.mapName());
         switch (update.type()) {
         case PUT:
@@ -318,7 +318,8 @@
         }
     }
 
-    private UpdateResult<String, byte[]> commitProvisionalUpdate(DatabaseUpdate update, long transactionId) {
+    private UpdateResult<String, byte[]> commitProvisionalUpdate(
+            MapUpdate<String, byte[]> update, TransactionId transactionId) {
         String mapName = update.mapName();
         String key = update.key();
         Update provisionalUpdate = getLockMap(mapName).get(key);
@@ -330,7 +331,7 @@
         return mapUpdate(mapName, key, Match.any(), Match.any(), provisionalUpdate.value()).value();
     }
 
-    private void undoProvisionalUpdate(DatabaseUpdate update, long transactionId) {
+    private void undoProvisionalUpdate(MapUpdate<String, byte[]> update, TransactionId transactionId) {
         String mapName = update.mapName();
         String key = update.key();
         Update provisionalUpdate = getLockMap(mapName).get(key);
@@ -342,7 +343,7 @@
         }
     }
 
-    private boolean isLockedByAnotherTransaction(String mapName, String key, long transactionId) {
+    private boolean isLockedByAnotherTransaction(String mapName, String key, TransactionId transactionId) {
         Update update = getLockMap(mapName).get(key);
         return update != null && !Objects.equal(transactionId, update.transactionId());
     }
@@ -356,15 +357,15 @@
     }
 
     private class Update {
-        private final long transactionId;
+        private final TransactionId transactionId;
         private final byte[] value;
 
-        public Update(long txId, byte[] value) {
+        public Update(TransactionId txId, byte[] value) {
             this.transactionId = txId;
             this.value = value;
         }
 
-        public long transactionId() {
+        public TransactionId transactionId() {
             return this.transactionId;
         }
 
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransaction.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransaction.java
deleted file mode 100644
index 406e901..0000000
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransaction.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.primitives.impl;
-
-import java.util.List;
-
-import org.onosproject.store.service.DatabaseUpdate;
-import org.onosproject.store.service.Transaction;
-
-import com.google.common.collect.ImmutableList;
-
-/**
- * A Default transaction implementation.
- */
-public class DefaultTransaction implements Transaction {
-
-    private final long transactionId;
-    private final List<DatabaseUpdate> updates;
-    private final State state;
-    private final long lastUpdated;
-
-    public DefaultTransaction(long transactionId, List<DatabaseUpdate> updates) {
-        this(transactionId, updates, State.PREPARING, System.currentTimeMillis());
-    }
-
-    private DefaultTransaction(long transactionId, List<DatabaseUpdate> updates, State state, long lastUpdated) {
-        this.transactionId = transactionId;
-        this.updates = ImmutableList.copyOf(updates);
-        this.state = state;
-        this.lastUpdated = lastUpdated;
-    }
-
-    @Override
-    public long id() {
-        return transactionId;
-    }
-
-    @Override
-    public List<DatabaseUpdate> updates() {
-        return updates;
-    }
-
-    @Override
-    public State state() {
-        return state;
-    }
-
-    @Override
-    public Transaction transition(State newState) {
-        return new DefaultTransaction(transactionId, updates, newState, System.currentTimeMillis());
-    }
-
-    @Override
-    public long lastUpdated() {
-        return lastUpdated;
-    }
-}
\ No newline at end of file
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContext.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContext.java
index 8cbe99f..d165bc1 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContext.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContext.java
@@ -18,14 +18,17 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
 import java.util.function.Supplier;
 
 import static com.google.common.base.Preconditions.*;
 
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.CommitResult;
+import org.onosproject.store.primitives.resources.impl.MapUpdate;
 import org.onosproject.store.service.ConsistentMapBuilder;
-import org.onosproject.store.service.DatabaseUpdate;
 import org.onosproject.store.service.Serializer;
-import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.TransactionContext;
 import org.onosproject.store.service.TransactionalMap;
 
@@ -44,20 +47,20 @@
     @SuppressWarnings("rawtypes")
     private final Map<String, DefaultTransactionalMap> txMaps = Maps.newConcurrentMap();
     private boolean isOpen = false;
-    private final Database database;
-    private final long transactionId;
+    private final Function<Transaction, CompletableFuture<CommitResult>> transactionCommitter;
+    private final TransactionId transactionId;
     private final Supplier<ConsistentMapBuilder> mapBuilderSupplier;
 
-    public DefaultTransactionContext(long transactionId,
-            Database database,
+    public DefaultTransactionContext(TransactionId transactionId,
+            Function<Transaction, CompletableFuture<CommitResult>> transactionCommitter,
             Supplier<ConsistentMapBuilder> mapBuilderSupplier) {
         this.transactionId = transactionId;
-        this.database = checkNotNull(database);
+        this.transactionCommitter = checkNotNull(transactionCommitter);
         this.mapBuilderSupplier = checkNotNull(mapBuilderSupplier);
     }
 
     @Override
-    public long transactionId() {
+    public TransactionId transactionId() {
         return transactionId;
     }
 
@@ -91,13 +94,13 @@
     public boolean commit() {
         // TODO: rework commit implementation to be more intuitive
         checkState(isOpen, TX_NOT_OPEN_ERROR);
-        CommitResponse response = null;
+        CommitResult result = null;
         try {
-            List<DatabaseUpdate> updates = Lists.newLinkedList();
-            txMaps.values().forEach(m -> updates.addAll(m.prepareDatabaseUpdates()));
-            Transaction transaction = new DefaultTransaction(transactionId, updates);
-            response = Futures.getUnchecked(database.prepareAndCommit(transaction));
-            return response.success();
+            List<MapUpdate<String, byte[]>> updates = Lists.newLinkedList();
+            txMaps.values().forEach(m -> updates.addAll(m.toMapUpdates()));
+            Transaction transaction = new Transaction(transactionId, updates);
+            result = Futures.getUnchecked(transactionCommitter.apply(transaction));
+            return result == CommitResult.OK;
         } catch (Exception e) {
             abort();
             return false;
@@ -128,4 +131,9 @@
         });
         return s.toString();
     }
+
+    @Override
+    public String name() {
+        return transactionId.toString();
+    }
 }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContextBuilder.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContextBuilder.java
index 36b2831..99d62ca 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContextBuilder.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionContextBuilder.java
@@ -15,6 +15,13 @@
  */
 package org.onosproject.store.primitives.impl;
 
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.CommitResult;
+import org.onosproject.store.service.ConsistentMapBuilder;
 import org.onosproject.store.service.TransactionContext;
 import org.onosproject.store.service.TransactionContextBuilder;
 
@@ -22,29 +29,28 @@
  * The default implementation of a transaction context builder. This builder
  * generates a {@link DefaultTransactionContext}.
  */
-public class DefaultTransactionContextBuilder implements TransactionContextBuilder {
+public class DefaultTransactionContextBuilder extends TransactionContextBuilder {
 
-    private boolean partitionsEnabled = true;
-    private final DatabaseManager manager;
-    private final long transactionId;
+    private final Supplier<ConsistentMapBuilder> mapBuilderSupplier;
+    private final Function<Transaction, CompletableFuture<CommitResult>> transactionCommitter;
+    private final TransactionId transactionId;
 
-    public DefaultTransactionContextBuilder(DatabaseManager manager, long transactionId) {
-        this.manager = manager;
+    public DefaultTransactionContextBuilder(Supplier<ConsistentMapBuilder> mapBuilderSupplier,
+            Function<Transaction, CompletableFuture<CommitResult>> transactionCommiter,
+            TransactionId transactionId) {
+        this.mapBuilderSupplier = mapBuilderSupplier;
+        this.transactionCommitter = transactionCommiter;
         this.transactionId = transactionId;
     }
 
     @Override
-    public TransactionContextBuilder withPartitionsDisabled() {
-        partitionsEnabled = false;
-        return this;
-    }
-
-    @Override
     public TransactionContext build() {
-        return new DefaultTransactionContext(
-                transactionId,
-                partitionsEnabled ? manager.partitionedDatabase : manager.inMemoryDatabase,
-                () -> partitionsEnabled ? manager.consistentMapBuilder()
-                                        : manager.consistentMapBuilder().withPartitionsDisabled());
+        return new DefaultTransactionContext(transactionId, transactionCommitter, () -> {
+            ConsistentMapBuilder mapBuilder = mapBuilderSupplier.get();
+            if (partitionsDisabled()) {
+                mapBuilder = mapBuilder.withPartitionsDisabled();
+            }
+            return mapBuilder;
+        });
     }
 }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionalMap.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionalMap.java
index dfeb4c1..32b3057 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionalMap.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/DefaultTransactionalMap.java
@@ -21,8 +21,8 @@
 import java.util.Set;
 
 import org.onlab.util.HexString;
+import org.onosproject.store.primitives.resources.impl.MapUpdate;
 import org.onosproject.store.service.ConsistentMap;
-import org.onosproject.store.service.DatabaseUpdate;
 import org.onosproject.store.service.Serializer;
 import org.onosproject.store.service.TransactionContext;
 import org.onosproject.store.service.TransactionalMap;
@@ -159,14 +159,14 @@
         return latest;
     }
 
-    protected List<DatabaseUpdate> prepareDatabaseUpdates() {
-        List<DatabaseUpdate> updates = Lists.newLinkedList();
+    protected List<MapUpdate<String, byte[]>> toMapUpdates() {
+        List<MapUpdate<String, byte[]>> updates = Lists.newLinkedList();
         deleteSet.forEach(key -> {
             Versioned<V> original = readCache.get(key);
             if (original != null) {
-                updates.add(DatabaseUpdate.newBuilder()
+                updates.add(MapUpdate.<String, byte[]>newBuilder()
                         .withMapName(name)
-                        .withType(DatabaseUpdate.Type.REMOVE_IF_VERSION_MATCH)
+                        .withType(MapUpdate.Type.REMOVE_IF_VERSION_MATCH)
                         .withKey(keyCache.getUnchecked(key))
                         .withCurrentVersion(original.version())
                         .build());
@@ -175,16 +175,16 @@
         writeCache.forEach((key, value) -> {
             Versioned<V> original = readCache.get(key);
             if (original == null) {
-                updates.add(DatabaseUpdate.newBuilder()
+                updates.add(MapUpdate.<String, byte[]>newBuilder()
                         .withMapName(name)
-                        .withType(DatabaseUpdate.Type.PUT_IF_ABSENT)
+                        .withType(MapUpdate.Type.PUT_IF_ABSENT)
                         .withKey(keyCache.getUnchecked(key))
                         .withValue(serializer.encode(value))
                         .build());
             } else {
-                updates.add(DatabaseUpdate.newBuilder()
+                updates.add(MapUpdate.<String, byte[]>newBuilder()
                         .withMapName(name)
-                        .withType(DatabaseUpdate.Type.PUT_IF_VERSION_MATCH)
+                        .withType(MapUpdate.Type.PUT_IF_VERSION_MATCH)
                         .withKey(keyCache.getUnchecked(key))
                         .withCurrentVersion(original.version())
                         .withValue(serializer.encode(value))
@@ -199,7 +199,7 @@
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("backingMap", backingMap)
-                .add("updates", prepareDatabaseUpdates())
+                .add("updates", toMapUpdates())
                 .toString();
     }
 
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/PartitionedDatabase.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/PartitionedDatabase.java
index fdcc59f..24674f8 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/PartitionedDatabase.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/PartitionedDatabase.java
@@ -26,8 +26,8 @@
 import net.kuujo.copycat.resource.ResourceState;
 
 import org.onlab.util.Match;
-import org.onosproject.store.service.DatabaseUpdate;
-import org.onosproject.store.service.Transaction;
+import org.onosproject.store.primitives.resources.impl.CommitResult;
+import org.onosproject.store.primitives.resources.impl.MapUpdate;
 import org.onosproject.store.service.Versioned;
 
 import java.util.Collection;
@@ -273,7 +273,9 @@
             if (transactionManager == null) {
                 throw new IllegalStateException("TransactionManager is not initialized");
             }
-            return transactionManager.execute(transaction);
+            return transactionManager.execute(transaction)
+                                     .thenApply(r -> r == CommitResult.OK
+                                             ? CommitResponse.success(ImmutableList.of()) : CommitResponse.failure());
         }
     }
 
@@ -373,15 +375,15 @@
 
     private Map<Database, Transaction> createSubTransactions(
             Transaction transaction) {
-        Map<Database, List<DatabaseUpdate>> perPartitionUpdates = Maps.newHashMap();
-        for (DatabaseUpdate update : transaction.updates()) {
+        Map<Database, List<MapUpdate<String, byte[]>>> perPartitionUpdates = Maps.newHashMap();
+        for (MapUpdate<String, byte[]> update : transaction.updates()) {
             Database partition = partitioner.getPartition(update.mapName(), update.key());
-            List<DatabaseUpdate> partitionUpdates =
+            List<MapUpdate<String, byte[]>> partitionUpdates =
                     perPartitionUpdates.computeIfAbsent(partition, k -> Lists.newLinkedList());
             partitionUpdates.add(update);
         }
         Map<Database, Transaction> subTransactions = Maps.newHashMap();
-        perPartitionUpdates.forEach((k, v) -> subTransactions.put(k, new DefaultTransaction(transaction.id(), v)));
+        perPartitionUpdates.forEach((k, v) -> subTransactions.put(k, new Transaction(transaction.id(), v)));
         return subTransactions;
     }
 
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/Transaction.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/Transaction.java
new file mode 100644
index 0000000..ac5238a
--- /dev/null
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/Transaction.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.store.primitives.impl;
+
+import java.util.List;
+
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.MapUpdate;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * An immutable transaction object.
+ */
+public class Transaction {
+
+    enum State {
+        /**
+         * Indicates a new transaction that is about to be prepared. All transactions
+         * start their life in this state.
+         */
+        PREPARING,
+
+        /**
+         * Indicates a transaction that is successfully prepared i.e. all participants voted to commit
+         */
+        PREPARED,
+
+        /**
+         * Indicates a transaction that is about to be committed.
+         */
+        COMMITTING,
+
+        /**
+         * Indicates a transaction that has successfully committed.
+         */
+        COMMITTED,
+
+        /**
+         * Indicates a transaction that is about to be rolled back.
+         */
+        ROLLINGBACK,
+
+        /**
+         * Indicates a transaction that has been rolled back and all locks are released.
+         */
+        ROLLEDBACK
+    }
+
+    private final TransactionId transactionId;
+    private final List<MapUpdate<String, byte[]>> updates;
+    private final State state;
+
+    public Transaction(TransactionId transactionId, List<MapUpdate<String, byte[]>> updates) {
+        this(transactionId, updates, State.PREPARING);
+    }
+
+    private Transaction(TransactionId transactionId,
+            List<MapUpdate<String, byte[]>> updates,
+            State state) {
+        this.transactionId = transactionId;
+        this.updates = ImmutableList.copyOf(updates);
+        this.state = state;
+    }
+
+    public TransactionId id() {
+        return transactionId;
+    }
+
+    public List<MapUpdate<String, byte[]>> updates() {
+        return updates;
+    }
+
+    public State state() {
+        return state;
+    }
+
+    public Transaction transition(State newState) {
+        return new Transaction(transactionId, updates, newState);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("transactionId", transactionId)
+                .add("updates", updates)
+                .add("state", state)
+                .toString();
+    }
+}
\ No newline at end of file
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 7cfc88b..30aebb1 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
@@ -17,87 +17,62 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
-import org.onlab.util.KryoNamespace;
-import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.CommitResult;
 import org.onosproject.store.service.AsyncConsistentMap;
-import org.onosproject.store.service.ConsistentMapBuilder;
-import org.onosproject.store.service.DatabaseUpdate;
-import org.onosproject.store.service.Serializer;
-import org.onosproject.store.service.Transaction;
-import org.onosproject.store.service.Versioned;
-import org.onosproject.store.service.Transaction.State;
 
-import com.google.common.collect.ImmutableList;
+import static org.onosproject.store.primitives.impl.Transaction.State.COMMITTED;
+import static org.onosproject.store.primitives.impl.Transaction.State.COMMITTING;
+import static org.onosproject.store.primitives.impl.Transaction.State.ROLLEDBACK;
+import static org.onosproject.store.primitives.impl.Transaction.State.ROLLINGBACK;
 
 /**
  * Agent that runs the two phase commit protocol.
  */
 public class TransactionManager {
 
-    private static final KryoNamespace KRYO_NAMESPACE = KryoNamespace.newBuilder()
-            .register(KryoNamespaces.BASIC)
-            .nextId(KryoNamespace.FLOATING_ID)
-            .register(Versioned.class)
-            .register(DatabaseUpdate.class)
-            .register(DatabaseUpdate.Type.class)
-            .register(DefaultTransaction.class)
-            .register(Transaction.State.class)
-            .build();
-
-    private final Serializer serializer = Serializer.using(Arrays.asList(KRYO_NAMESPACE));
     private final Database database;
-    private final AsyncConsistentMap<Long, Transaction> transactions;
+    private final AsyncConsistentMap<TransactionId, Transaction> transactions;
 
-    /**
-     * Constructs a new TransactionManager for the specified database instance.
-     *
-     * @param database database
-     * @param mapBuilder builder for ConsistentMap instances
-     */
-    public TransactionManager(Database database, ConsistentMapBuilder<Long, Transaction> mapBuilder) {
+    public TransactionManager(Database database, AsyncConsistentMap<TransactionId, Transaction> transactions) {
         this.database = checkNotNull(database, "database cannot be null");
-        this.transactions = mapBuilder.withName("onos-transactions")
-                                      .withSerializer(serializer)
-                                      .buildAsyncMap();
+        this.transactions = transactions;
     }
 
     /**
      * Executes the specified transaction by employing a two phase commit protocol.
      *
      * @param transaction transaction to commit
-     * @return transaction result. Result value true indicates a successful commit, false
-     * indicates abort
+     * @return transaction commit result
      */
-    public CompletableFuture<CommitResponse> execute(Transaction transaction) {
+    public CompletableFuture<CommitResult> execute(Transaction transaction) {
         // clean up if this transaction in already in a terminal state.
-        if (transaction.state() == Transaction.State.COMMITTED ||
-                transaction.state() == Transaction.State.ROLLEDBACK) {
-            return transactions.remove(transaction.id()).thenApply(v -> CommitResponse.success(ImmutableList.of()));
-        } else if (transaction.state() == Transaction.State.COMMITTING) {
+        if (transaction.state() == COMMITTED || transaction.state() == ROLLEDBACK) {
+            return transactions.remove(transaction.id()).thenApply(v -> CommitResult.OK);
+        } else if (transaction.state() == COMMITTING) {
             return commit(transaction);
-        } else if (transaction.state() == Transaction.State.ROLLINGBACK) {
-            return rollback(transaction).thenApply(v -> CommitResponse.success(ImmutableList.of()));
+        } else if (transaction.state() == ROLLINGBACK) {
+            return rollback(transaction).thenApply(v -> CommitResult.FAILURE_TO_PREPARE);
         } else {
             return prepare(transaction).thenCompose(v -> v ? commit(transaction) : rollback(transaction));
         }
     }
 
-
     /**
-     * Returns all transactions in the system.
+     * Returns all pending transaction identifiers.
      *
-     * @return future for a collection of transactions
+     * @return future for a collection of transaction identifiers.
      */
-    public CompletableFuture<Collection<Transaction>> getTransactions() {
-        return transactions.values().thenApply(c -> {
-            Collection<Transaction> txns = c.stream().map(v -> v.value()).collect(Collectors.toList());
-            return txns;
-        });
+    public CompletableFuture<Collection<TransactionId>> getPendingTransactionIds() {
+        return transactions.values().thenApply(c -> c.stream()
+                    .map(v -> v.value())
+                    .filter(v -> v.state() != COMMITTED && v.state() != ROLLEDBACK)
+                    .map(Transaction::id)
+                    .collect(Collectors.toList()));
     }
 
     private CompletableFuture<Boolean> prepare(Transaction transaction) {
@@ -105,22 +80,25 @@
                 .thenCompose(v -> database.prepare(transaction))
                 .thenCompose(status -> transactions.put(
                             transaction.id(),
-                            transaction.transition(status ? State.COMMITTING : State.ROLLINGBACK))
+                            transaction.transition(status ? COMMITTING : ROLLINGBACK))
                 .thenApply(v -> status));
     }
 
-    private CompletableFuture<CommitResponse> commit(Transaction transaction) {
+    private CompletableFuture<CommitResult> commit(Transaction transaction) {
         return database.commit(transaction)
-                .whenComplete((r, e) -> transactions.put(
-                            transaction.id(),
-                            transaction.transition(Transaction.State.COMMITTED)));
+                       .thenCompose(r -> {
+                           if (r.success()) {
+                               return transactions.put(transaction.id(), transaction.transition(COMMITTED))
+                                                  .thenApply(v -> CommitResult.OK);
+                           } else {
+                               return CompletableFuture.completedFuture(CommitResult.FAILURE_DURING_COMMIT);
+                           }
+                       });
     }
 
-    private CompletableFuture<CommitResponse> rollback(Transaction transaction) {
+    private CompletableFuture<CommitResult> rollback(Transaction transaction) {
         return database.rollback(transaction)
-                .thenCompose(v -> transactions.put(
-                            transaction.id(),
-                            transaction.transition(Transaction.State.ROLLEDBACK)))
-                .thenApply(v -> CommitResponse.failure());
+                       .thenCompose(v -> transactions.put(transaction.id(), transaction.transition(ROLLEDBACK)))
+                       .thenApply(v -> CommitResult.FAILURE_TO_PREPARE);
     }
 }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionParticipant.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionParticipant.java
new file mode 100644
index 0000000..58957a2
--- /dev/null
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/TransactionParticipant.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.store.primitives.impl;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.resources.impl.CommitResult;
+import org.onosproject.store.primitives.resources.impl.PrepareResult;
+import org.onosproject.store.primitives.resources.impl.RollbackResult;
+
+/**
+ * Participant in a two-phase commit protocol.
+ */
+public interface TransactionParticipant {
+
+    /**
+     * Attempts to execute the prepare phase for the specified {@link Transaction transaction}.
+     * @param transaction transaction
+     * @return future for prepare result
+     */
+    CompletableFuture<PrepareResult> prepare(Transaction transaction);
+
+    /**
+     * Attempts to execute the commit phase for previously prepared transaction.
+     * @param transactionId transaction identifier
+     * @return future for commit result
+     */
+    CompletableFuture<CommitResult> commit(TransactionId transactionId);
+
+    /**
+     * Attempts to execute the rollback phase for previously prepared transaction.
+     * @param transactionId transaction identifier
+     * @return future for rollback result
+     */
+    CompletableFuture<RollbackResult> rollback(TransactionId transactionId);
+}
\ No newline at end of file
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMap.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMap.java
index 46487f2..5342d74 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMap.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMap.java
@@ -31,6 +31,9 @@
 import java.util.function.Predicate;
 
 import org.onlab.util.Match;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.impl.Transaction;
+import org.onosproject.store.primitives.impl.TransactionParticipant;
 import org.onosproject.store.service.AsyncConsistentMap;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.MapEventListener;
@@ -43,7 +46,7 @@
  */
 @ResourceTypeInfo(id = -151, stateMachine = AtomixConsistentMapState.class)
 public class AtomixConsistentMap extends Resource<AtomixConsistentMap, Resource.Options>
-    implements AsyncConsistentMap<String, byte[]> {
+    implements AsyncConsistentMap<String, byte[]>, TransactionParticipant {
 
     private final Set<MapEventListener<String, byte[]>> mapEventListeners = Sets.newCopyOnWriteArraySet();
 
@@ -235,18 +238,6 @@
         });
     }
 
-    public CompletableFuture<PrepareResult> prepare(TransactionalMapUpdate<String, byte[]> update) {
-        return submit(new AtomixConsistentMapCommands.TransactionPrepare(update));
-    }
-
-    public CompletableFuture<CommitResult> commit(TransactionId transactionId) {
-        return submit(new AtomixConsistentMapCommands.TransactionCommit(transactionId));
-    }
-
-    public CompletableFuture<RollbackResult> rollback(TransactionId transactionId) {
-        return submit(new AtomixConsistentMapCommands.TransactionRollback(transactionId));
-    }
-
     @Override
     public synchronized CompletableFuture<Void> addListener(MapEventListener<String, byte[]> listener) {
         if (!mapEventListeners.isEmpty()) {
@@ -274,6 +265,21 @@
         }
     }
 
+    @Override
+    public CompletableFuture<PrepareResult> prepare(Transaction transaction) {
+        return submit(new AtomixConsistentMapCommands.TransactionPrepare(transaction));
+    }
+
+    @Override
+    public CompletableFuture<CommitResult> commit(TransactionId transactionId) {
+        return submit(new AtomixConsistentMapCommands.TransactionCommit(transactionId));
+    }
+
+    @Override
+    public CompletableFuture<RollbackResult> rollback(TransactionId transactionId) {
+        return submit(new AtomixConsistentMapCommands.TransactionRollback(transactionId));
+    }
+
     /**
      * Change listener context.
      */
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapCommands.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapCommands.java
index c463320..a5dd232 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapCommands.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapCommands.java
@@ -28,6 +28,8 @@
 import java.util.Set;
 
 import org.onlab.util.Match;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.impl.Transaction;
 import org.onosproject.store.service.Versioned;
 
 import com.google.common.base.MoreObjects;
@@ -207,35 +209,35 @@
      */
     @SuppressWarnings("serial")
     public static class TransactionPrepare extends MapCommand<PrepareResult> {
-        private TransactionalMapUpdate<String, byte[]> update;
+        private Transaction transaction;
 
         public TransactionPrepare() {
         }
 
-        public TransactionPrepare(TransactionalMapUpdate<String, byte[]> update) {
-            this.update = update;
+        public TransactionPrepare(Transaction transaction) {
+            this.transaction = transaction;
         }
 
-        public TransactionalMapUpdate<String, byte[]> transactionUpdate() {
-            return update;
+        public Transaction transaction() {
+            return transaction;
         }
 
         @Override
         public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
             super.writeObject(buffer, serializer);
-            serializer.writeObject(update, buffer);
+            serializer.writeObject(transaction, buffer);
         }
 
         @Override
         public void readObject(BufferInput<?> buffer, Serializer serializer) {
             super.readObject(buffer, serializer);
-            update = serializer.readObject(buffer);
+            transaction = serializer.readObject(buffer);
         }
 
         @Override
         public String toString() {
             return MoreObjects.toStringHelper(getClass())
-                    .add("update", update)
+                    .add("transaction", transaction)
                     .toString();
         }
     }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java
index 100941f..de22a75 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapState.java
@@ -37,6 +37,8 @@
 
 import org.onlab.util.CountDownCompleter;
 import org.onlab.util.Match;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.impl.Transaction;
 import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapCommands.TransactionPrepare;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.Versioned;
@@ -382,9 +384,8 @@
             Commit<? extends AtomixConsistentMapCommands.TransactionPrepare> commit) {
         boolean ok = false;
         try {
-            TransactionalMapUpdate<String, byte[]> transactionUpdate = commit
-                    .operation().transactionUpdate();
-            for (MapUpdate<String, byte[]> update : transactionUpdate.batch()) {
+            Transaction transaction = commit.operation().transaction();
+            for (MapUpdate<String, byte[]> update : transaction.updates()) {
                 String key = update.key();
                 if (preparedKeys.contains(key)) {
                     return PrepareResult.CONCURRENT_TRANSACTION;
@@ -403,8 +404,8 @@
             // No violations detected. Add to pendingTranctions and mark
             // modified keys as
             // currently locked to updates.
-            pendingTransactions.put(transactionUpdate.transactionId(), commit);
-            transactionUpdate.batch().forEach(u -> preparedKeys.add(u.key()));
+            pendingTransactions.put(transaction.id(), commit);
+            transaction.updates().forEach(u -> preparedKeys.add(u.key()));
             ok = true;
             return PrepareResult.OK;
         } finally {
@@ -429,16 +430,15 @@
             if (prepareCommit == null) {
                 return CommitResult.UNKNOWN_TRANSACTION_ID;
             }
-            TransactionalMapUpdate<String, byte[]> transactionalUpdate = prepareCommit
-                    .operation().transactionUpdate();
-            long totalReferencesToCommit = transactionalUpdate
-                    .batch()
+            Transaction transaction = prepareCommit.operation().transaction();
+            long totalReferencesToCommit = transaction
+                    .updates()
                     .stream()
                     .filter(update -> update.type() != MapUpdate.Type.REMOVE_IF_VERSION_MATCH)
                     .count();
             CountDownCompleter<Commit<? extends AtomixConsistentMapCommands.TransactionPrepare>> completer =
                     new CountDownCompleter<>(prepareCommit, totalReferencesToCommit, Commit::close);
-            for (MapUpdate<String, byte[]> update : transactionalUpdate.batch()) {
+            for (MapUpdate<String, byte[]> update : transaction.updates()) {
                 String key = update.key();
                 MapEntryValue previousValue = mapEntries.remove(key);
                 MapEntryValue newValue = null;
@@ -473,8 +473,10 @@
             if (prepareCommit == null) {
                 return RollbackResult.UNKNOWN_TRANSACTION_ID;
             } else {
-                prepareCommit.operation().transactionUpdate().batch()
-                        .forEach(u -> preparedKeys.remove(u.key()));
+                prepareCommit.operation()
+                             .transaction()
+                             .updates()
+                             .forEach(u -> preparedKeys.remove(u.key()));
                 prepareCommit.close();
                 return RollbackResult.OK;
             }
@@ -608,9 +610,8 @@
 
         @Override
         public byte[] value() {
-            TransactionalMapUpdate<String, byte[]> update = completer.object()
-                    .operation().transactionUpdate();
-            return update.valueForKey(key);
+            Transaction transaction = completer.object().operation().transaction();
+            return valueForKey(key, transaction);
         }
 
         @Override
@@ -622,5 +623,14 @@
         public void discard() {
             completer.countDown();
         }
+
+        private byte[] valueForKey(String key, Transaction transaction) {
+            MapUpdate<String, byte[]>  update = transaction.updates()
+                                                           .stream()
+                                                           .filter(u -> u.key().equals(key))
+                                                           .findFirst()
+                                                           .orElse(null);
+            return update == null ? null : update.value();
+        }
     }
 }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/CommitResult.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/CommitResult.java
index 2b43f83..ae1e1d9 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/CommitResult.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/CommitResult.java
@@ -28,4 +28,14 @@
      * Signifies a failure due to unrecognized transaction identifier.
      */
     UNKNOWN_TRANSACTION_ID,
+
+    /**
+     * Signifies a failure to get participants to agree to commit (during prepare stage).
+     */
+    FAILURE_TO_PREPARE,
+
+    /**
+     * Failure during commit phase.
+     */
+    FAILURE_DURING_COMMIT
 }
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapEntryUpdateResult.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapEntryUpdateResult.java
index 7858595..bc6d645 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapEntryUpdateResult.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapEntryUpdateResult.java
@@ -29,6 +29,8 @@
  * Both old and new values are accessible along with a flag that indicates if the
  * the value was updated. If flag is false, oldValue and newValue both
  * point to the same unmodified value.
+ *
+ * @param <K> key type
  * @param <V> result type
  */
 public class MapEntryUpdateResult<K, V> {
@@ -123,6 +125,8 @@
      * @param keyTransform transformer to use for transcoding keys
      * @param valueMapper mapper to use for transcoding values
      * @return new instance
+     * @param <K1> key type of returned {@code MapEntryUpdateResult}
+     * @param <V1> value type of returned {@code MapEntryUpdateResult}
      */
     public <K1, V1> MapEntryUpdateResult<K1, V1> map(Function<K, K1> keyTransform, Function<V, V1> valueMapper) {
         return new MapEntryUpdateResult<>(status,
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapUpdate.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapUpdate.java
index c105a08..dc80c56 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapUpdate.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/MapUpdate.java
@@ -70,6 +70,7 @@
         REMOVE_IF_VALUE_MATCH,
     }
 
+    private String mapName;
     private Type type;
     private K key;
     private V value;
@@ -77,6 +78,15 @@
     private long currentVersion = -1;
 
     /**
+     * Returns the name of the map.
+     *
+     * @return map name
+     */
+    public String mapName() {
+        return mapName;
+    }
+
+    /**
      * Returns the type of update operation.
      * @return type of update.
      */
@@ -119,6 +129,7 @@
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
+            .add("mapName", mapName)
             .add("type", type)
             .add("key", key)
             .add("value", value)
@@ -153,6 +164,11 @@
             return update;
         }
 
+        public Builder<K, V> withMapName(String name) {
+            update.mapName = checkNotNull(name, "name cannot be null");
+            return this;
+        }
+
         public Builder<K, V> withType(Type type) {
             update.type = checkNotNull(type, "type cannot be null");
             return this;
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/PrepareResult.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/PrepareResult.java
index 0465743..fa57f05 100644
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/PrepareResult.java
+++ b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/PrepareResult.java
@@ -25,6 +25,11 @@
     OK,
 
     /**
+     * Signifies some participants in a distributed prepare operation failed.
+     */
+    PARTIAL_FAILURE,
+
+    /**
      * Signifies a failure to another transaction locking the underlying state.
      */
     CONCURRENT_TRANSACTION,
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/TransactionId.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/TransactionId.java
deleted file mode 100644
index e378580..0000000
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/TransactionId.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.primitives.resources.impl;
-
-import com.google.common.base.Objects;
-
-/**
- * Transaction identifier.
- */
-public final class TransactionId {
-
-    public static TransactionId from(String id) {
-        return new TransactionId(id);
-    }
-
-    private final String id;
-
-    private TransactionId(String id) {
-        this.id = id;
-    }
-
-    @Override
-    public String toString() {
-        return id;
-    }
-
-    @Override
-    public int hashCode() {
-        return id.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (this == other) {
-            return true;
-        }
-        if (other instanceof TransactionId) {
-            TransactionId that = (TransactionId) other;
-            return Objects.equal(this.id, that.id);
-        }
-        return false;
-    }
-}
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/TransactionalMapUpdate.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/TransactionalMapUpdate.java
deleted file mode 100644
index 6e83b69..0000000
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/resources/impl/TransactionalMapUpdate.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2016 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.store.primitives.resources.impl;
-
-import java.util.Collection;
-import java.util.Map;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-
-/**
- * A batch updates to an {@code AsyncConsistentMap} be committed as a transaction.
- *
- * @param <K> key type
- * @param <V> value type
- */
-public class TransactionalMapUpdate<K, V> {
-    private final TransactionId transactionId;
-    private final Collection<MapUpdate<K, V>> updates;
-    private boolean indexPopulated = false;
-    private final Map<K, V> keyValueIndex = Maps.newHashMap();
-
-    public TransactionalMapUpdate(TransactionId transactionId, Collection<MapUpdate<K, V>> updates) {
-        this.transactionId = transactionId;
-        this.updates = ImmutableList.copyOf(updates);
-        populateIndex();
-    }
-
-    /**
-     * Returns the transaction identifier.
-     * @return transaction id
-     */
-    public TransactionId transactionId() {
-        return transactionId;
-    }
-
-    /**
-     * Returns the collection of map updates.
-     * @return map updates
-     */
-    public Collection<MapUpdate<K, V>> batch() {
-        return updates;
-    }
-
-    /**
-     * Returns the value that will be associated with the key after this transaction commits.
-     * @param key key
-     * @return value that will be associated with the value once this transaction commits
-     */
-    public V valueForKey(K key) {
-        if (!indexPopulated) {
-            // We do not synchronize as we don't expect this called to be made from multiple threads.
-            populateIndex();
-        }
-        return keyValueIndex.get(key);
-    }
-
-    /**
-     * Populates the internal key -> value mapping.
-     */
-    private synchronized void populateIndex() {
-        updates.forEach(mapUpdate -> {
-            if (mapUpdate.value() != null) {
-                keyValueIndex.put(mapUpdate.key(), mapUpdate.value());
-            }
-        });
-        indexPopulated = true;
-    }
-}
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMapTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMapTest.java
index a630d1a..68e7ecb 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMapTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/impl/DefaultAsyncConsistentMapTest.java
@@ -41,7 +41,6 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
 import org.onosproject.store.service.Serializer;
-import org.onosproject.store.service.Transaction;
 import org.onosproject.store.service.Versioned;
 
 import com.google.common.base.MoreObjects;
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java
index 5711a88..21d8edc 100644
--- a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/AtomixConsistentMapTest.java
@@ -27,6 +27,8 @@
 import org.junit.Ignore;
 import org.junit.Test;
 import org.onlab.util.Tools;
+import org.onosproject.store.primitives.TransactionId;
+import org.onosproject.store.primitives.impl.Transaction;
 import org.onosproject.store.service.MapEvent;
 import org.onosproject.store.service.MapEventListener;
 import org.onosproject.store.service.Versioned;
@@ -351,10 +353,9 @@
                 .withValue(value1)
                 .build();
 
-        TransactionalMapUpdate<String, byte[]> txMapUpdate =
-                new TransactionalMapUpdate<>(TransactionId.from("tx1"), Arrays.asList(update1));
+        Transaction tx = new Transaction(TransactionId.from("tx1"), Arrays.asList(update1));
 
-        map.prepare(txMapUpdate).thenAccept(result -> {
+        map.prepare(tx).thenAccept(result -> {
             assertEquals(PrepareResult.OK, result);
         }).join();
         assertNull(listener.event());
@@ -376,7 +377,7 @@
 
         assertNull(listener.event());
 
-        map.commit(txMapUpdate.transactionId()).join();
+        map.commit(tx.id()).join();
         assertNotNull(listener.event());
         assertEquals(MapEvent.Type.INSERT, listener.event().type());
         assertTrue(Arrays.equals(value1, listener.event().newValue().value()));
@@ -406,14 +407,13 @@
                 .withKey("foo")
                 .withValue(value1)
                 .build();
-        TransactionalMapUpdate<String, byte[]> txMapUpdate =
-                new TransactionalMapUpdate<>(TransactionId.from("tx1"), Arrays.asList(update1));
-        map.prepare(txMapUpdate).thenAccept(result -> {
+        Transaction tx = new Transaction(TransactionId.from("tx1"), Arrays.asList(update1));
+        map.prepare(tx).thenAccept(result -> {
             assertEquals(PrepareResult.OK, result);
         }).join();
         assertNull(listener.event());
 
-        map.rollback(txMapUpdate.transactionId()).join();
+        map.rollback(tx.id()).join();
         assertNull(listener.event());
 
         map.get("foo").thenAccept(result -> {
diff --git a/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/MapUpdateTest.java b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/MapUpdateTest.java
new file mode 100644
index 0000000..6a0db93
--- /dev/null
+++ b/core/store/primitives/src/test/java/org/onosproject/store/primitives/resources/impl/MapUpdateTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.store.primitives.resources.impl;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit Tests for MapUpdate class.
+ */
+
+public class MapUpdateTest {
+
+    private final MapUpdate<String, byte[]> stats1 = MapUpdate.<String, byte[]>newBuilder()
+            .withCurrentValue("1".getBytes())
+            .withValue("2".getBytes())
+            .withCurrentVersion(3)
+            .withKey("4")
+            .withMapName("5")
+            .withType(MapUpdate.Type.PUT)
+            .build();
+
+    private final MapUpdate<String, byte[]> stats2 = MapUpdate.<String, byte[]>newBuilder()
+            .withCurrentValue("1".getBytes())
+            .withValue("2".getBytes())
+            .withCurrentVersion(3)
+            .withKey("4")
+            .withMapName("5")
+            .withType(MapUpdate.Type.REMOVE)
+            .build();
+
+    private final MapUpdate<String, byte[]> stats3 = MapUpdate.<String, byte[]>newBuilder()
+            .withCurrentValue("1".getBytes())
+            .withValue("2".getBytes())
+            .withCurrentVersion(3)
+            .withKey("4")
+            .withMapName("5")
+            .withType(MapUpdate.Type.REMOVE_IF_VALUE_MATCH)
+            .build();
+
+    private final MapUpdate<String, byte[]> stats4 = MapUpdate.<String, byte[]>newBuilder()
+            .withCurrentValue("1".getBytes())
+            .withValue("2".getBytes())
+            .withCurrentVersion(3)
+            .withKey("4")
+            .withMapName("5")
+            .withType(MapUpdate.Type.REMOVE_IF_VERSION_MATCH)
+            .build();
+
+    private final MapUpdate<String, byte[]> stats5 = MapUpdate.<String, byte[]>newBuilder()
+            .withCurrentValue("1".getBytes())
+            .withValue("2".getBytes())
+            .withCurrentVersion(3)
+            .withKey("4")
+            .withMapName("5")
+            .withType(MapUpdate.Type.PUT_IF_VALUE_MATCH)
+            .build();
+
+    private final MapUpdate<String, byte[]> stats6 = MapUpdate.<String, byte[]>newBuilder()
+            .withCurrentValue("1".getBytes())
+            .withValue("2".getBytes())
+            .withCurrentVersion(3)
+            .withKey("4")
+            .withMapName("5")
+            .withType(MapUpdate.Type.PUT_IF_VERSION_MATCH)
+            .build();
+
+    /**
+     *  Tests the constructor for the class.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(stats1.currentValue(), is("1".getBytes()));
+        assertThat(stats1.value(), is("2".getBytes()));
+        assertThat(stats1.currentVersion(), is(3L));
+        assertThat(stats1.key(), is("4"));
+        assertThat(stats1.mapName(), is("5"));
+        assertThat(stats1.type(), is(MapUpdate.Type.PUT));
+    }
+
+    /**
+     * Tests the equals, hashCode and toString methods using Guava EqualsTester.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(stats1, stats1)
+                .addEqualityGroup(stats2)
+                .testEquals();
+
+        new EqualsTester()
+                .addEqualityGroup(stats3, stats3)
+                .addEqualityGroup(stats4)
+                .testEquals();
+
+        new EqualsTester()
+                .addEqualityGroup(stats5, stats5)
+                .addEqualityGroup(stats6)
+                .testEquals();
+    }
+
+    /**
+     * Tests if the toString method returns a consistent value for hashing.
+     */
+    @Test
+    public void testToString() {
+        assertThat(stats1.toString(), is(stats1.toString()));
+    }
+
+}
