diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/ConsistentMapImpl.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/ConsistentMapImpl.java
deleted file mode 100644
index 0ceb566..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/ConsistentMapImpl.java
+++ /dev/null
@@ -1,239 +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.consistent.impl;
-
-import static com.google.common.base.Preconditions.*;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.stream.Collectors;
-import java.util.Set;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.onlab.util.HexString;
-import org.onosproject.store.service.ConsistentMap;
-import org.onosproject.store.service.ConsistentMapException;
-import org.onosproject.store.service.Serializer;
-import org.onosproject.store.service.Versioned;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-
-/**
- * ConsistentMap implementation that is backed by a Raft consensus
- * based database.
- *
- * @param <K> type of key.
- * @param <V> type of value.
- */
-public class ConsistentMapImpl<K, V> implements ConsistentMap<K, V> {
-
-    private final String name;
-    private final DatabaseProxy<String, byte[]> proxy;
-    private final Serializer serializer;
-
-    private static final int OPERATION_TIMEOUT_MILLIS = 5000;
-    private static final String ERROR_NULL_KEY = "Key cannot be null";
-    private static final String ERROR_NULL_VALUE = "Null values are not allowed";
-
-    private final LoadingCache<K, String> keyCache = CacheBuilder.newBuilder()
-            .softValues()
-            .build(new CacheLoader<K, String>() {
-
-                @Override
-                public String load(K key) {
-                    return HexString.toHexString(serializer.encode(key));
-                }
-            });
-
-    protected K dK(String key) {
-        return serializer.decode(HexString.fromHexString(key));
-    }
-
-    public ConsistentMapImpl(String name,
-            DatabaseProxy<String, byte[]> proxy,
-            Serializer serializer) {
-        this.name = checkNotNull(name, "map name cannot be null");
-        this.proxy = checkNotNull(proxy, "database proxy cannot be null");
-        this.serializer = checkNotNull(serializer, "serializer cannot be null");
-    }
-
-    @Override
-    public int size() {
-        return complete(proxy.size(name));
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return complete(proxy.isEmpty(name));
-    }
-
-    @Override
-    public boolean containsKey(K key) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        return complete(proxy.containsKey(name, keyCache.getUnchecked(key)));
-    }
-
-    @Override
-    public boolean containsValue(V value) {
-        checkNotNull(value, ERROR_NULL_VALUE);
-        return complete(proxy.containsValue(name, serializer.encode(value)));
-    }
-
-    @Override
-    public Versioned<V> get(K key) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        Versioned<byte[]> value = complete(proxy.get(name, keyCache.getUnchecked(key)));
-        if (value == null) {
-            return null;
-        }
-        return new Versioned<>(
-                serializer.decode(value.value()),
-                value.version(),
-                value.creationTime());
-    }
-
-    @Override
-    public Versioned<V> put(K key, V value) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        checkNotNull(value, ERROR_NULL_VALUE);
-        Versioned<byte[]> previousValue =
-                complete(proxy.put(name, keyCache.getUnchecked(key), serializer.encode(value)));
-        if (previousValue == null) {
-            return null;
-        }
-        return new Versioned<>(
-                serializer.decode(previousValue.value()),
-                previousValue.version(),
-                previousValue.creationTime());
-    }
-
-    @Override
-    public Versioned<V> remove(K key) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        Versioned<byte[]> value = complete(proxy.remove(name, keyCache.getUnchecked(key)));
-        if (value == null) {
-            return null;
-        }
-        return new Versioned<>(
-                serializer.decode(value.value()),
-                value.version(),
-                value.creationTime());
-    }
-
-    @Override
-    public void clear() {
-        complete(proxy.clear(name));
-    }
-
-    @Override
-    public Set<K> keySet() {
-        return Collections.unmodifiableSet(complete(proxy.keySet(name))
-                .stream()
-                .map(this::dK)
-                .collect(Collectors.toSet()));
-    }
-
-    @Override
-    public Collection<Versioned<V>> values() {
-        return Collections.unmodifiableList(complete(proxy.values(name))
-            .stream()
-            .map(v -> new Versioned<V>(serializer.decode(v.value()), v.version(), v.creationTime()))
-            .collect(Collectors.toList()));
-    }
-
-    @Override
-    public Set<Entry<K, Versioned<V>>> entrySet() {
-        return Collections.unmodifiableSet(complete(proxy.entrySet(name))
-                .stream()
-                .map(this::fromRawEntry)
-                .collect(Collectors.toSet()));
-    }
-
-    @Override
-    public Versioned<V> putIfAbsent(K key, V value) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        checkNotNull(value, ERROR_NULL_VALUE);
-        Versioned<byte[]> existingValue = complete(proxy.putIfAbsent(
-                name, keyCache.getUnchecked(key), serializer.encode(value)));
-        if (existingValue == null) {
-            return null;
-        }
-        return new Versioned<>(
-                serializer.decode(existingValue.value()),
-                existingValue.version(),
-                existingValue.creationTime());
-    }
-
-    @Override
-    public boolean remove(K key, V value) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        checkNotNull(value, ERROR_NULL_VALUE);
-        return complete(proxy.remove(name, keyCache.getUnchecked(key), serializer.encode(value)));
-    }
-
-    @Override
-    public boolean remove(K key, long version) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        return complete(proxy.remove(name, keyCache.getUnchecked(key), version));
-
-    }
-
-    @Override
-    public boolean replace(K key, V oldValue, V newValue) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        checkNotNull(newValue, ERROR_NULL_VALUE);
-        byte[] existing = oldValue != null ? serializer.encode(oldValue) : null;
-        return complete(proxy.replace(name, keyCache.getUnchecked(key), existing, serializer.encode(newValue)));
-    }
-
-    @Override
-    public boolean replace(K key, long oldVersion, V newValue) {
-        checkNotNull(key, ERROR_NULL_KEY);
-        checkNotNull(newValue, ERROR_NULL_VALUE);
-        return complete(proxy.replace(name, keyCache.getUnchecked(key), oldVersion, serializer.encode(newValue)));
-    }
-
-    private static <T> T complete(CompletableFuture<T> future) {
-        try {
-            return future.get(OPERATION_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new ConsistentMapException.Interrupted();
-        } catch (TimeoutException e) {
-            throw new ConsistentMapException.Timeout();
-        } catch (ExecutionException e) {
-            throw new ConsistentMapException(e.getCause());
-        }
-    }
-
-    private Map.Entry<K, Versioned<V>> fromRawEntry(Map.Entry<String, Versioned<byte[]>> e) {
-        return Pair.of(
-                dK(e.getKey()),
-                new Versioned<>(
-                        serializer.decode(e.getValue().value()),
-                        e.getValue().version(),
-                        e.getValue().creationTime()));
-    }
-}
\ No newline at end of file
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java
index b78f3ae..6ddeea9 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DatabaseManager.java
@@ -32,6 +32,7 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.store.cluster.impl.NodeInfo;
+import org.onosproject.store.service.AsyncConsistentMap;
 import org.onosproject.store.service.ConsistentMap;
 import org.onosproject.store.service.PartitionInfo;
 import org.onosproject.store.service.Serializer;
@@ -168,7 +169,12 @@
 
     @Override
     public <K, V> ConsistentMap<K , V> createConsistentMap(String name, Serializer serializer) {
-        return new ConsistentMapImpl<K, V>(name, partitionedDatabase, serializer);
+        return new DefaultConsistentMap<K, V>(name, partitionedDatabase, serializer);
+    }
+
+    @Override
+    public <K, V> AsyncConsistentMap<K , V> createAsyncConsistentMap(String name, Serializer serializer) {
+        return new DefaultAsyncConsistentMap<K, V>(name, partitionedDatabase, serializer);
     }
 
     @Override
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
new file mode 100644
index 0000000..d9876fd
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultAsyncConsistentMap.java
@@ -0,0 +1,200 @@
+/*
+ * 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.consistent.impl;
+
+import static com.google.common.base.Preconditions.*;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+import java.util.Set;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.onlab.util.HexString;
+import org.onosproject.store.service.AsyncConsistentMap;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.Versioned;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+
+/**
+ * AsyncConsistentMap implementation that is backed by a Raft consensus
+ * based database.
+ *
+ * @param <K> type of key.
+ * @param <V> type of value.
+ */
+public class DefaultAsyncConsistentMap<K, V> implements AsyncConsistentMap<K, V> {
+
+    private final String name;
+    private final DatabaseProxy<String, byte[]> proxy;
+    private final Serializer serializer;
+
+    private static final String ERROR_NULL_KEY = "Key cannot be null";
+    private static final String ERROR_NULL_VALUE = "Null values are not allowed";
+
+    private final LoadingCache<K, String> keyCache = CacheBuilder.newBuilder()
+            .softValues()
+            .build(new CacheLoader<K, String>() {
+
+                @Override
+                public String load(K key) {
+                    return HexString.toHexString(serializer.encode(key));
+                }
+            });
+
+    protected K dK(String key) {
+        return serializer.decode(HexString.fromHexString(key));
+    }
+
+    public DefaultAsyncConsistentMap(String name,
+            DatabaseProxy<String, byte[]> proxy,
+            Serializer serializer) {
+        this.name = checkNotNull(name, "map name cannot be null");
+        this.proxy = checkNotNull(proxy, "database proxy cannot be null");
+        this.serializer = checkNotNull(serializer, "serializer cannot be null");
+    }
+
+    @Override
+    public CompletableFuture<Integer> size() {
+        return proxy.size(name);
+    }
+
+    @Override
+    public CompletableFuture<Boolean> isEmpty() {
+        return proxy.isEmpty(name);
+    }
+
+    @Override
+    public CompletableFuture<Boolean> containsKey(K key) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        return proxy.containsKey(name, keyCache.getUnchecked(key));
+    }
+
+    @Override
+    public CompletableFuture<Boolean> containsValue(V value) {
+        checkNotNull(value, ERROR_NULL_VALUE);
+        return proxy.containsValue(name, serializer.encode(value));
+    }
+
+    @Override
+    public CompletableFuture<Versioned<V>> get(K key) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        return proxy.get(name, keyCache.getUnchecked(key))
+            .thenApply(v -> v != null
+            ? new Versioned<>(serializer.decode(v.value()), v.version(), v.creationTime()) : null);
+    }
+
+    @Override
+    public CompletableFuture<Versioned<V>> put(K key, V value) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        checkNotNull(value, ERROR_NULL_VALUE);
+        return proxy.put(name, keyCache.getUnchecked(key), serializer.encode(value))
+                .thenApply(v -> v != null
+                ? new Versioned<>(serializer.decode(v.value()), v.version(), v.creationTime()) : null);
+    }
+
+    @Override
+    public CompletableFuture<Versioned<V>> remove(K key) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        return proxy.remove(name, keyCache.getUnchecked(key))
+                .thenApply(v -> v != null
+                ? new Versioned<>(serializer.decode(v.value()), v.version(), v.creationTime()) : null);
+    }
+
+    @Override
+    public CompletableFuture<Void> clear() {
+        return proxy.clear(name);
+    }
+
+    @Override
+    public CompletableFuture<Set<K>> keySet() {
+        return proxy.keySet(name)
+                .thenApply(s -> s
+                .stream()
+                .map(this::dK)
+                .collect(Collectors.toSet()));
+    }
+
+    @Override
+    public CompletableFuture<Collection<Versioned<V>>> values() {
+        return proxy.values(name).thenApply(c -> c
+            .stream()
+            .map(v -> new Versioned<V>(serializer.decode(v.value()), v.version(), v.creationTime()))
+            .collect(Collectors.toList()));
+    }
+
+    @Override
+    public CompletableFuture<Set<Entry<K, Versioned<V>>>> entrySet() {
+        return proxy.entrySet(name).thenApply(s -> s
+                .stream()
+                .map(this::fromRawEntry)
+                .collect(Collectors.toSet()));
+    }
+
+    @Override
+    public CompletableFuture<Versioned<V>> putIfAbsent(K key, V value) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        checkNotNull(value, ERROR_NULL_VALUE);
+        return proxy.putIfAbsent(
+                name, keyCache.getUnchecked(key), serializer.encode(value)).thenApply(v ->
+                v != null ?
+                new Versioned<>(serializer.decode(v.value()), v.version(), v.creationTime()) : null);
+    }
+
+    @Override
+    public CompletableFuture<Boolean> remove(K key, V value) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        checkNotNull(value, ERROR_NULL_VALUE);
+        return proxy.remove(name, keyCache.getUnchecked(key), serializer.encode(value));
+    }
+
+    @Override
+    public CompletableFuture<Boolean> remove(K key, long version) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        return proxy.remove(name, keyCache.getUnchecked(key), version);
+
+    }
+
+    @Override
+    public CompletableFuture<Boolean> replace(K key, V oldValue, V newValue) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        checkNotNull(newValue, ERROR_NULL_VALUE);
+        byte[] existing = oldValue != null ? serializer.encode(oldValue) : null;
+        return proxy.replace(name, keyCache.getUnchecked(key), existing, serializer.encode(newValue));
+    }
+
+    @Override
+    public CompletableFuture<Boolean> replace(K key, long oldVersion, V newValue) {
+        checkNotNull(key, ERROR_NULL_KEY);
+        checkNotNull(newValue, ERROR_NULL_VALUE);
+        return proxy.replace(name, keyCache.getUnchecked(key), oldVersion, serializer.encode(newValue));
+    }
+
+    private Map.Entry<K, Versioned<V>> fromRawEntry(Map.Entry<String, Versioned<byte[]>> e) {
+        return Pair.of(
+                dK(e.getKey()),
+                new Versioned<>(
+                        serializer.decode(e.getValue().value()),
+                        e.getValue().version(),
+                        e.getValue().creationTime()));
+    }
+}
\ No newline at end of file
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMap.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMap.java
new file mode 100644
index 0000000..123615c
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultConsistentMap.java
@@ -0,0 +1,144 @@
+/*
+ * 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.consistent.impl;
+
+import java.util.Collection;
+import java.util.Map.Entry;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.Set;
+
+import org.onosproject.store.service.AsyncConsistentMap;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.ConsistentMapException;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.Versioned;
+
+/**
+ * ConsistentMap implementation that is backed by a Raft consensus
+ * based database.
+ *
+ * @param <K> type of key.
+ * @param <V> type of value.
+ */
+public class DefaultConsistentMap<K, V> implements ConsistentMap<K, V> {
+
+    private static final int OPERATION_TIMEOUT_MILLIS = 5000;
+
+    private final AsyncConsistentMap<K, V> asyncMap;
+
+    public DefaultConsistentMap(String name,
+            DatabaseProxy<String, byte[]> proxy,
+            Serializer serializer) {
+        asyncMap = new DefaultAsyncConsistentMap<>(name, proxy, serializer);
+    }
+
+    @Override
+    public int size() {
+        return complete(asyncMap.size());
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return complete(asyncMap.isEmpty());
+    }
+
+    @Override
+    public boolean containsKey(K key) {
+        return complete(asyncMap.containsKey(key));
+    }
+
+    @Override
+    public boolean containsValue(V value) {
+        return complete(asyncMap.containsValue(value));
+    }
+
+    @Override
+    public Versioned<V> get(K key) {
+        return complete(asyncMap.get(key));
+    }
+
+    @Override
+    public Versioned<V> put(K key, V value) {
+        return complete(asyncMap.put(key, value));
+    }
+
+    @Override
+    public Versioned<V> remove(K key) {
+        return complete(asyncMap.remove(key));
+    }
+
+    @Override
+    public void clear() {
+        complete(asyncMap.clear());
+    }
+
+    @Override
+    public Set<K> keySet() {
+        return complete(asyncMap.keySet());
+    }
+
+    @Override
+    public Collection<Versioned<V>> values() {
+        return complete(asyncMap.values());
+    }
+
+    @Override
+    public Set<Entry<K, Versioned<V>>> entrySet() {
+        return complete(asyncMap.entrySet());
+    }
+
+    @Override
+    public Versioned<V> putIfAbsent(K key, V value) {
+        return complete(asyncMap.putIfAbsent(key, value));
+    }
+
+    @Override
+    public boolean remove(K key, V value) {
+        return complete(asyncMap.remove(key, value));
+    }
+
+    @Override
+    public boolean remove(K key, long version) {
+        return complete(asyncMap.remove(key, version));
+    }
+
+    @Override
+    public boolean replace(K key, V oldValue, V newValue) {
+        return complete(asyncMap.replace(key, oldValue, newValue));
+    }
+
+    @Override
+    public boolean replace(K key, long oldVersion, V newValue) {
+        return complete(asyncMap.replace(key, oldVersion, newValue));
+    }
+
+    private static <T> T complete(CompletableFuture<T> future) {
+        try {
+            return future.get(OPERATION_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new ConsistentMapException.Interrupted();
+        } catch (TimeoutException e) {
+            throw new ConsistentMapException.Timeout();
+        } catch (ExecutionException e) {
+            throw new ConsistentMapException(e.getCause());
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java
index 40c3a5f..9f8c5bd 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/consistent/impl/DefaultTransactionContext.java
@@ -63,7 +63,7 @@
         checkNotNull(serializer, "serializer is null");
         checkState(isOpen, TX_NOT_OPEN_ERROR);
         if (!txMaps.containsKey(mapName)) {
-            ConsistentMap<K, V> backingMap = new ConsistentMapImpl<>(mapName, databaseProxy, serializer);
+            ConsistentMap<K, V> backingMap = new DefaultConsistentMap<>(mapName, databaseProxy, serializer);
             DefaultTransactionalMap<K, V> txMap = new DefaultTransactionalMap<>(mapName, backingMap, this, serializer);
             txMaps.put(mapName, txMap);
         }
