diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java
index a3aa0f4..e02ff35 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/PreCommitPortManager.java
@@ -15,20 +15,31 @@
  */
 package org.onosproject.openstacknetworking.impl;
 
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 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.util.KryoNamespace;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.openstacknetworking.api.OpenstackNetworkEvent;
 import org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type;
 import org.onosproject.openstacknetworking.api.PreCommitPortService;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
 import org.slf4j.Logger;
 
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
+import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -40,10 +51,30 @@
 
     protected final Logger log = getLogger(getClass());
 
-    private Map<String, Map<Type, Set<String>>> store = Maps.newConcurrentMap();
+    private static final KryoNamespace SERIALIZER_PRE_COMMIT = KryoNamespace.newBuilder()
+            .register(KryoNamespaces.API)
+            .register(OpenstackNetworkEvent.Type.class)
+            .build();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    private ConsistentMap<String, Map<Type, Set<String>>> store;
 
     @Activate
     protected void activate() {
+
+        ApplicationId appId = coreService.registerApplication(OPENSTACK_NETWORKING_APP_ID);
+
+        store = storageService.<String, Map<Type, Set<String>>>consistentMapBuilder()
+                .withSerializer(Serializer.using(SERIALIZER_PRE_COMMIT))
+                .withName("openstack-pre-commit-store")
+                .withApplicationId(appId)
+                .build();
+
         log.info("Started");
     }
 
@@ -54,7 +85,7 @@
 
     @Override
     public void subscribePreCommit(String portId, Type eventType, String className) {
-        store.computeIfAbsent(portId, s -> Maps.newConcurrentMap());
+        store.computeIfAbsent(portId, s -> new HashMap<>());
 
         store.compute(portId, (k, v) -> {
 
@@ -62,8 +93,7 @@
                 return null;
             }
 
-            Objects.requireNonNull(v).computeIfAbsent(eventType,
-                                     s -> Sets.newConcurrentHashSet());
+            Objects.requireNonNull(v).computeIfAbsent(eventType, s -> new HashSet<>());
 
 
             Objects.requireNonNull(v).compute(eventType, (i, j) -> {
@@ -96,7 +126,7 @@
     @Override
     public int subscriberCountByEventType(String portId, Type eventType) {
 
-        Map<Type, Set<String>> typeMap = store.get(portId);
+        Map<Type, Set<String>> typeMap = store.asJavaMap().get(portId);
 
         if (typeMap == null || typeMap.isEmpty()) {
             return 0;
@@ -112,7 +142,7 @@
     @Override
     public int subscriberCount(String portId) {
 
-        Map<Type, Set<String>> typeMap = store.get(portId);
+        Map<Type, Set<String>> typeMap = store.asJavaMap().get(portId);
 
         if (typeMap == null || typeMap.isEmpty()) {
             return 0;
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/PreCommitPortManagerTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/PreCommitPortManagerTest.java
index b6ba3f9..3b32fc0 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/PreCommitPortManagerTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/PreCommitPortManagerTest.java
@@ -18,6 +18,11 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.junit.TestUtils;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreServiceAdapter;
+import org.onosproject.core.DefaultApplicationId;
+import org.onosproject.store.service.TestStorageService;
 
 import static org.junit.Assert.assertEquals;
 import static org.onosproject.openstacknetworking.api.OpenstackNetworkEvent.Type.OPENSTACK_PORT_PRE_REMOVE;
@@ -28,6 +33,8 @@
  */
 public class PreCommitPortManagerTest {
 
+    private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
+
     private static final String PORT_ID_1 = "port-1";
     private static final String PORT_ID_2 = "port-2";
 
@@ -42,6 +49,8 @@
     @Before
     public void setUp() {
         target = new PreCommitPortManager();
+        TestUtils.setField(target, "coreService", new TestCoreService());
+        TestUtils.setField(target, "storageService", new TestStorageService());
         target.activate();
     }
 
@@ -51,6 +60,7 @@
     @After
     public void tearDown() {
         target.deactivate();
+        target = null;
     }
 
     /**
@@ -98,4 +108,15 @@
 
         target.subscribePreCommit(PORT_ID_2, OPENSTACK_PORT_PRE_UPDATE, CLASS_NAME_1);
     }
+
+    /**
+     * Mocks CoreService.
+     */
+    private static class TestCoreService extends CoreServiceAdapter {
+
+        @Override
+        public ApplicationId registerApplication(String name) {
+            return TEST_APP_ID;
+        }
+    }
 }
