diff --git a/core/store/dist/pom.xml b/core/store/dist/pom.xml
index 72d4b25..66ae1e4 100644
--- a/core/store/dist/pom.xml
+++ b/core/store/dist/pom.xml
@@ -53,12 +53,6 @@
 
         <dependency>
             <groupId>org.onosproject</groupId>
-            <artifactId>onlab-nio</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.onosproject</groupId>
             <artifactId>onlab-misc</artifactId>
             <version>${project.version}</version>
         </dependency>
@@ -75,15 +69,10 @@
         </dependency>
 
         <dependency>
-            <groupId>org.mapdb</groupId>
-            <artifactId>mapdb</artifactId>
-            <version>1.0.8</version>
-        </dependency>
-
-        <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
         </dependency>
+
         <dependency>
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-annotations</artifactId>
@@ -94,26 +83,23 @@
             <artifactId>guava-testlib</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.easymock</groupId>
             <artifactId>easymock</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-api</artifactId>
             <classifier>tests</classifier>
             <scope>test</scope>
         </dependency>
-
-        <!-- for shaded copycat -->
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onlab-thirdparty</artifactId>
-        </dependency>
     </dependencies>
 </project>
diff --git a/core/store/dist/src/main/java/org/onosproject/store/cluster/messaging/impl/IOLoopMessagingManager.java b/core/store/dist/src/main/java/org/onosproject/store/cluster/messaging/impl/IOLoopMessagingManager.java
deleted file mode 100644
index 4236c8c..0000000
--- a/core/store/dist/src/main/java/org/onosproject/store/cluster/messaging/impl/IOLoopMessagingManager.java
+++ /dev/null
@@ -1,54 +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.cluster.messaging.impl;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.nio.service.IOLoopMessaging;
-import org.onosproject.cluster.ClusterMetadataService;
-import org.onosproject.cluster.ControllerNode;
-import org.onosproject.store.cluster.messaging.Endpoint;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * IOLoop based MessagingService.
- */
-//@Component(immediate = true, enabled = false)
-@Service
-public class IOLoopMessagingManager extends IOLoopMessaging {
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ClusterMetadataService clusterMetadataService;
-
-    @Activate
-    public void activate() throws Exception {
-        ControllerNode localNode = clusterMetadataService.getLocalNode();
-        super.start(new Endpoint(localNode.ip(), localNode.tcpPort()));
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() throws Exception {
-        super.stop();
-        log.info("Stopped");
-    }
-}
diff --git a/core/store/primitives/pom.xml b/core/store/primitives/pom.xml
index 186597c..395e7c7 100644
--- a/core/store/primitives/pom.xml
+++ b/core/store/primitives/pom.xml
@@ -37,30 +37,25 @@
             <groupId>org.onosproject</groupId>
             <artifactId>onos-api</artifactId>
         </dependency>
-        
+
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-core-common</artifactId>
             <version>${project.version}</version>
         </dependency>
-        
+
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-core-serializers</artifactId>
             <version>${project.version}</version>
         </dependency>
-        
-        <dependency>
-            <groupId>org.mapdb</groupId>
-            <artifactId>mapdb</artifactId>
-            <version>1.0.8</version>
-        </dependency>
-        
+
         <dependency>
             <groupId>org.easymock</groupId>
             <artifactId>easymock</artifactId>
             <scope>test</scope>
         </dependency>
+
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-api</artifactId>
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MapDbPersistentStore.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MapDbPersistentStore.java
deleted file mode 100644
index 2a58992..0000000
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/MapDbPersistentStore.java
+++ /dev/null
@@ -1,103 +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 org.mapdb.DB;
-import org.mapdb.DBMaker;
-import org.mapdb.Hasher;
-import org.mapdb.Serializer;
-import org.onosproject.store.serializers.KryoSerializer;
-
-import java.io.File;
-import java.util.Map;
-import java.util.concurrent.ExecutorService;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * MapDB based implementation of a persistent store.
- */
-class MapDbPersistentStore<K, V> implements PersistentStore<K, V> {
-
-    private final ExecutorService executor;
-    private final KryoSerializer serializer;
-
-    private final DB database;
-
-    private final Map<byte[], byte[]> items;
-
-    /**
-     * Creates a new MapDB based persistent store.
-     *
-     * @param filename filename of the database on disk
-     * @param executor executor to use for tasks that write to the disk
-     * @param serializer serializer for keys and values
-     */
-    MapDbPersistentStore(String filename, ExecutorService executor,
-                         KryoSerializer serializer) {
-        this.executor = checkNotNull(executor);
-        this.serializer = checkNotNull(serializer);
-
-        File databaseFile = new File(filename);
-
-        database = DBMaker.newFileDB(databaseFile).make();
-
-        items = database.createHashMap("items")
-                .keySerializer(Serializer.BYTE_ARRAY)
-                .valueSerializer(Serializer.BYTE_ARRAY)
-                .hasher(Hasher.BYTE_ARRAY)
-                .makeOrGet();
-    }
-
-    @Override
-    public void readInto(Map<K, MapValue<V>> items) {
-        this.items.forEach((keyBytes, valueBytes) ->
-                              items.put(serializer.decode(keyBytes),
-                                        serializer.decode(valueBytes)));
-    }
-
-    @Override
-    public void update(K key, MapValue<V> value) {
-        executor.submit(() -> updateInternal(key, value));
-    }
-
-    @Override
-    public void remove(K key) {
-        executor.submit(() -> removeInternal(key));
-    }
-
-    private void updateInternal(K key, MapValue<V> newValue) {
-        byte[] keyBytes = serializer.encode(key);
-
-        items.compute(keyBytes, (k, existingBytes) -> {
-            MapValue<V> existing = existingBytes == null ? null :
-                                      serializer.decode(existingBytes);
-            if (existing == null || newValue.isNewerThan(existing)) {
-                return serializer.encode(newValue);
-            } else {
-                return existingBytes;
-            }
-        });
-        database.commit();
-    }
-
-    private void removeInternal(K key) {
-        byte[] keyBytes = serializer.encode(key);
-        items.remove(keyBytes);
-        database.commit();
-    }
-}
\ No newline at end of file
diff --git a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/PersistentStore.java b/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/PersistentStore.java
deleted file mode 100644
index 20381bd..0000000
--- a/core/store/primitives/src/main/java/org/onosproject/store/primitives/impl/PersistentStore.java
+++ /dev/null
@@ -1,47 +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.Map;
-
-/**
- * A persistent store for an eventually consistent map.
- */
-interface PersistentStore<K, V> {
-
-    /**
-     * Read the contents of the disk into the given maps.
-     *
-     * @param items items map
-     */
-    void readInto(Map<K, MapValue<V>> items);
-
-    /**
-     * Updates a key,value pair in the persistent store.
-     *
-     * @param key the key
-     * @param value the value
-     */
-    void update(K key, MapValue<V> value);
-
-    /**
-     * Removes a key from persistent store.
-     *
-     * @param key the key to remove
-     */
-    void remove(K key);
-}
