diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPodEvent.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPodEvent.java
index c580431..a6b8d4f 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPodEvent.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPodEvent.java
@@ -26,7 +26,7 @@
      * @param type      kubernetes pod event type
      * @param subject   kubernetes pod
      */
-    protected K8sPodEvent(Type type, Pod subject) {
+    public K8sPodEvent(Type type, Pod subject) {
         super(type, subject);
     }
 
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/DistributedK8sPodStore.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/DistributedK8sPodStore.java
new file mode 100644
index 0000000..9c943cc
--- /dev/null
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/DistributedK8sPodStore.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.k8snetworking.impl;
+
+import com.google.common.collect.ImmutableSet;
+import io.fabric8.kubernetes.api.model.ObjectMeta;
+import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.api.model.PodSpec;
+import io.fabric8.kubernetes.api.model.PodStatus;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.k8snetworking.api.K8sPodEvent;
+import org.onosproject.k8snetworking.api.K8sPodStore;
+import org.onosproject.k8snetworking.api.K8sPodStoreDelegate;
+import org.onosproject.store.AbstractStore;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.ConsistentMap;
+import org.onosproject.store.service.MapEvent;
+import org.onosproject.store.service.MapEventListener;
+import org.onosproject.store.service.Serializer;
+import org.onosproject.store.service.StorageService;
+import org.onosproject.store.service.Versioned;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_CREATED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_REMOVED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_UPDATED;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of kubernetes pod store using consistent map.
+ */
+@Component(immediate = true, service = K8sPodStore.class)
+public class DistributedK8sPodStore
+        extends AbstractStore<K8sPodEvent, K8sPodStoreDelegate>
+        implements K8sPodStore {
+
+    private final Logger log = getLogger(getClass());
+
+    private static final String ERR_NOT_FOUND = " does not exist";
+    private static final String ERR_DUPLICATE = " already exists";
+    private static final String APP_ID = "org.onosproject.k8snetwork";
+
+    private static final KryoNamespace
+            SERIALIZER_K8S_POD = KryoNamespace.newBuilder()
+            .register(KryoNamespaces.API)
+            .register(Pod.class)
+            .register(ObjectMeta.class)
+            .register(PodSpec.class)
+            .register(PodStatus.class)
+            .register(Collection.class)
+            .build();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected StorageService storageService;
+
+    private final ExecutorService eventExecutor = newSingleThreadExecutor(
+            groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
+
+    private final MapEventListener<String, Pod> podMapListener = new K8sPodMapListener();
+
+    private ConsistentMap<String, Pod> podStore;
+
+    @Activate
+    protected void activate() {
+        ApplicationId appId = coreService.registerApplication(APP_ID);
+        podStore = storageService.<String, Pod>consistentMapBuilder()
+                .withSerializer(Serializer.using(SERIALIZER_K8S_POD))
+                .withName("k8s-pod-store")
+                .withApplicationId(appId)
+                .build();
+
+        podStore.addListener(podMapListener);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        podStore.removeListener(podMapListener);
+        eventExecutor.shutdown();
+        log.info("Stopped");
+    }
+
+    @Override
+    public void createPod(Pod pod) {
+        podStore.compute(pod.getMetadata().getUid(), (uid, existing) -> {
+            final String error = pod.getMetadata().getUid() + ERR_DUPLICATE;
+            checkArgument(existing == null, error);
+            return pod;
+        });
+    }
+
+    @Override
+    public void updatePod(Pod pod) {
+        podStore.compute(pod.getMetadata().getUid(), (uid, existing) -> {
+            final String error = pod.getMetadata().getUid() + ERR_NOT_FOUND;
+            checkArgument(existing != null, error);
+            return pod;
+        });
+    }
+
+    @Override
+    public Pod removePod(String uid) {
+        Versioned<Pod> pod = podStore.remove(uid);
+        if (pod == null) {
+            final String error = uid + ERR_NOT_FOUND;
+            throw new IllegalArgumentException(error);
+        }
+        return pod.value();
+    }
+
+    @Override
+    public Pod pod(String uid) {
+        return podStore.asJavaMap().get(uid);
+    }
+
+    @Override
+    public Set<Pod> pods() {
+        return ImmutableSet.copyOf(podStore.asJavaMap().values());
+    }
+
+    @Override
+    public void clear() {
+        podStore.clear();
+    }
+
+    private class K8sPodMapListener implements MapEventListener<String, Pod> {
+
+        @Override
+        public void event(MapEvent<String, Pod> event) {
+
+            switch (event.type()) {
+                case INSERT:
+                    log.debug("Kubernetes pod created {}", event.newValue());
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new K8sPodEvent(
+                                    K8S_POD_CREATED, event.newValue().value())));
+                    break;
+                case UPDATE:
+                    log.debug("Kubernetes pod updated {}", event.newValue());
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new K8sPodEvent(
+                                    K8S_POD_UPDATED, event.newValue().value())));
+                    break;
+                case REMOVE:
+                    log.debug("Kubernetes pod removed {}", event.oldValue());
+                    eventExecutor.execute(() ->
+                            notifyDelegate(new K8sPodEvent(
+                                    K8S_POD_REMOVED, event.oldValue().value())));
+                    break;
+                default:
+                    // do nothing
+                    break;
+            }
+        }
+    }
+}
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sPodManager.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sPodManager.java
new file mode 100644
index 0000000..0f2c8ae
--- /dev/null
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sPodManager.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.k8snetworking.impl;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import io.fabric8.kubernetes.api.model.Pod;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.event.ListenerRegistry;
+import org.onosproject.k8snetworking.api.K8sPodAdminService;
+import org.onosproject.k8snetworking.api.K8sPodEvent;
+import org.onosproject.k8snetworking.api.K8sPodListener;
+import org.onosproject.k8snetworking.api.K8sPodService;
+import org.onosproject.k8snetworking.api.K8sPodStore;
+import org.onosproject.k8snetworking.api.K8sPodStoreDelegate;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.slf4j.Logger;
+
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.k8snetworking.api.Constants.K8S_NETWORKING_APP_ID;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Provides implementation of administering and interfacing kubernetes pod.
+ */
+@Component(
+        immediate = true,
+        service = {K8sPodAdminService.class, K8sPodService.class}
+)
+public class K8sPodManager
+        extends ListenerRegistry<K8sPodEvent, K8sPodListener>
+        implements K8sPodAdminService, K8sPodService {
+
+    protected final Logger log = getLogger(getClass());
+
+    private static final String MSG_POD  = "Kubernetes pod %s %s";
+    private static final String MSG_CREATED = "created";
+    private static final String MSG_UPDATED = "updated";
+    private static final String MSG_REMOVED = "removed";
+
+    private static final String ERR_NULL_POD  = "Kubernetes pod cannot be null";
+    private static final String ERR_NULL_POD_UID  = "Kubernetes pod UID cannot be null";
+
+    private static final String ERR_IN_USE = " still in use";
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY)
+    protected K8sPodStore k8sPodStore;
+
+    private final K8sPodStoreDelegate delegate = new InternalPodStorageDelegate();
+
+    private ApplicationId appId;
+
+    @Activate
+    protected void activate() {
+        appId = coreService.registerApplication(K8S_NETWORKING_APP_ID);
+
+        k8sPodStore.setDelegate(delegate);
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        k8sPodStore.unsetDelegate(delegate);
+        log.info("Stopped");
+    }
+
+    @Override
+    public void createPod(Pod pod) {
+        checkNotNull(pod, ERR_NULL_POD);
+        checkArgument(!Strings.isNullOrEmpty(pod.getMetadata().getUid()),
+                ERR_NULL_POD_UID);
+
+        k8sPodStore.createPod(pod);
+
+        log.info(String.format(MSG_POD, pod.getMetadata().getName(), MSG_CREATED));
+    }
+
+    @Override
+    public void updatePod(Pod pod) {
+        checkNotNull(pod, ERR_NULL_POD);
+        checkArgument(!Strings.isNullOrEmpty(pod.getMetadata().getUid()),
+                ERR_NULL_POD_UID);
+
+        k8sPodStore.updatePod(pod);
+
+        log.info(String.format(MSG_POD, pod.getMetadata().getName(), MSG_UPDATED));
+    }
+
+    @Override
+    public void removePod(String uid) {
+        checkArgument(!Strings.isNullOrEmpty(uid), ERR_NULL_POD_UID);
+
+        synchronized (this) {
+            if (isPodInUse(uid)) {
+                final String error = String.format(MSG_POD, uid, ERR_IN_USE);
+                throw new IllegalStateException(error);
+            }
+
+            Pod pod = k8sPodStore.removePod(uid);
+
+            if (pod != null) {
+                log.info(String.format(MSG_POD,
+                        pod.getMetadata().getName(), MSG_REMOVED));
+            }
+        }
+    }
+
+    @Override
+    public void clear() {
+        k8sPodStore.clear();
+    }
+
+    @Override
+    public Pod pod(String uid) {
+        checkArgument(!Strings.isNullOrEmpty(uid), ERR_NULL_POD_UID);
+        return k8sPodStore.pod(uid);
+    }
+
+    @Override
+    public Set<Pod> pods() {
+        return ImmutableSet.copyOf(k8sPodStore.pods());
+    }
+
+    private boolean isPodInUse(String uid) {
+        return false;
+    }
+
+    private class InternalPodStorageDelegate implements K8sPodStoreDelegate {
+
+        @Override
+        public void notify(K8sPodEvent event) {
+            if (event != null) {
+                log.trace("send kubernetes pod event {}", event);
+                process(event);
+            }
+        }
+    }
+}
diff --git a/apps/k8s-networking/app/src/test/java/org/onosproject/k8snetworking/impl/K8sPodManagerTest.java b/apps/k8s-networking/app/src/test/java/org/onosproject/k8snetworking/impl/K8sPodManagerTest.java
new file mode 100644
index 0000000..3894f9c
--- /dev/null
+++ b/apps/k8s-networking/app/src/test/java/org/onosproject/k8snetworking/impl/K8sPodManagerTest.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.k8snetworking.impl;
+
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.MoreExecutors;
+import io.fabric8.kubernetes.api.model.ObjectMeta;
+import io.fabric8.kubernetes.api.model.Pod;
+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.event.Event;
+import org.onosproject.k8snetworking.api.K8sPodEvent;
+import org.onosproject.k8snetworking.api.K8sPodListener;
+import org.onosproject.store.service.TestStorageService;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_CREATED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_REMOVED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_UPDATED;
+
+/**
+ * Unit tests for kubernetes pod manager.
+ */
+public class K8sPodManagerTest {
+
+    private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
+
+    private static final String UNKNOWN_UID = "unknown_uid";
+    private static final String UPDATED_UID = "updated_uid";
+    private static final String UPDATED_NAME = "updated_name";
+
+    private static final String POD_UID = "pod_uid";
+    private static final String POD_NAME = "pod_name";
+
+    private static final Pod POD = createK8sPod(POD_UID, POD_NAME);
+    private static final Pod POD_UPDATED = createK8sPod(POD_UID, UPDATED_NAME);
+
+    private final TestK8sPodListener testListener = new TestK8sPodListener();
+
+    private K8sPodManager target;
+    private DistributedK8sPodStore k8sPodStore;
+
+    @Before
+    public void setUp() throws Exception {
+        k8sPodStore = new DistributedK8sPodStore();
+        TestUtils.setField(k8sPodStore, "coreService", new TestCoreService());
+        TestUtils.setField(k8sPodStore, "storageService", new TestStorageService());
+        TestUtils.setField(k8sPodStore, "eventExecutor", MoreExecutors.newDirectExecutorService());
+        k8sPodStore.activate();
+
+        target = new K8sPodManager();
+        TestUtils.setField(target, "coreService", new TestCoreService());
+        target.k8sPodStore = k8sPodStore;
+        target.addListener(testListener);
+        target.activate();
+    }
+
+    @After
+    public void tearDown() {
+        target.removeListener(testListener);
+        k8sPodStore.deactivate();
+        target.deactivate();
+        k8sPodStore = null;
+        target = null;
+    }
+
+    /**
+     * Tests if getting all pods return correct set of pods.
+     */
+    @Test
+    public void testGetPods() {
+        createBasicPods();
+        assertEquals("Number of pods did not match", 1, target.pods().size());
+    }
+
+    /**
+     * Tests if getting a pod with UID returns the correct pod.
+     */
+    @Test
+    public void testGetPodByUid() {
+        createBasicPods();
+        assertNotNull("Pod did not match", target.pod(POD_UID));
+        assertNull("Pod did not match", target.pod(UNKNOWN_UID));
+    }
+
+    /**
+     * Tests creating and removing a pod, and checks if it triggers proper events.
+     */
+    @Test
+    public void testCreateAndRemovePod() {
+        target.createPod(POD);
+        assertEquals("Number of pods did not match", 1, target.pods().size());
+        assertNotNull("Pod was not created", target.pod(POD_UID));
+
+        target.removePod(POD_UID);
+        assertEquals("Number of pods did not match", 0, target.pods().size());
+        assertNull("Pod was not removed", target.pod(POD_UID));
+
+        validateEvents(K8S_POD_CREATED, K8S_POD_REMOVED);
+    }
+
+    /**
+     * Tests updating a pod, and checks if it triggers proper events.
+     */
+    @Test
+    public void testCreateAndUpdatePod() {
+        target.createPod(POD);
+        assertEquals("Number of pods did not match", 1, target.pods().size());
+        assertEquals("Pod did not match", POD_NAME,
+                target.pod(POD_UID).getMetadata().getName());
+
+        target.updatePod(POD_UPDATED);
+
+        assertEquals("Number of pods did not match", 1, target.pods().size());
+        assertEquals("Pod did not match", UPDATED_NAME,
+                target.pod(POD_UID).getMetadata().getName());
+        validateEvents(K8S_POD_CREATED, K8S_POD_UPDATED);
+    }
+
+    /**
+     * Tests if creating a null pod fails with an exception.
+     */
+    @Test(expected = NullPointerException.class)
+    public void testCreateNullPod() {
+        target.createPod(null);
+    }
+
+    /**
+     * Tests if creating a duplicate pod fails with an exception.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testCreateDuplicatePod() {
+        target.createPod(POD);
+        target.createPod(POD);
+    }
+
+    /**
+     * Tests if removing pod with null ID fails with an exception.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testRemovePodWithNull() {
+        target.removePod(null);
+    }
+
+    /**
+     * Tests if updating an unregistered pod fails with an exception.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testUpdateUnregisteredPod() {
+        target.updatePod(POD);
+    }
+
+    private void createBasicPods() {
+        target.createPod(POD);
+    }
+
+    private static Pod createK8sPod(String uid, String name) {
+        ObjectMeta meta = new ObjectMeta();
+        meta.setUid(uid);
+        meta.setName(name);
+
+        Pod pod = new Pod();
+        pod.setApiVersion("v1");
+        pod.setKind("pod");
+        pod.setMetadata(meta);
+
+        return pod;
+    }
+
+    private static class TestCoreService extends CoreServiceAdapter {
+
+        @Override
+        public ApplicationId registerApplication(String name) {
+            return TEST_APP_ID;
+        }
+    }
+
+    private static class TestK8sPodListener implements K8sPodListener {
+        private List<K8sPodEvent> events = Lists.newArrayList();
+
+        @Override
+        public void event(K8sPodEvent event) {
+            events.add(event);
+        }
+    }
+
+    private void validateEvents(Enum... types) {
+        int i = 0;
+        assertEquals("Number of events did not match", types.length, testListener.events.size());
+        for (Event event : testListener.events) {
+            assertEquals("Incorrect event received", types[i], event.type());
+            i++;
+        }
+        testListener.events.clear();
+    }
+}
