diff --git a/apps/kafka-integration/api/src/main/java/org/onosproject/kafkaintegration/api/KafkaEventStorageService.java b/apps/kafka-integration/api/src/main/java/org/onosproject/kafkaintegration/api/KafkaEventStorageService.java
new file mode 100644
index 0000000..3845896
--- /dev/null
+++ b/apps/kafka-integration/api/src/main/java/org/onosproject/kafkaintegration/api/KafkaEventStorageService.java
@@ -0,0 +1,40 @@
+/**
+ * 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.kafkaintegration.api;
+
+import org.onosproject.kafkaintegration.api.dto.OnosEvent;
+
+/**
+ * APIs to insert and delete into a local store. This store is used to keep
+ * track of events that are being published.
+ */
+public interface KafkaEventStorageService {
+
+    /**
+     * Inserts the Generated event into the local cache.
+     *
+     * @param e the ONOS Event
+     * @return true if the insertion was successful
+     */
+    boolean insertCacheEntry(OnosEvent e);
+
+    /**
+     * Updates the counter with the most recently published event's sequence
+     * number.
+     *
+     * @param sequenceNumber the updated value of sequence number.
+     */
+    void updateLastPublishedEntry(Long sequenceNumber);
+}
diff --git a/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaStorageManager.java b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaStorageManager.java
new file mode 100644
index 0000000..4b9035e
--- /dev/null
+++ b/apps/kafka-integration/app/src/main/java/org/onosproject/kafkaintegration/impl/KafkaStorageManager.java
@@ -0,0 +1,108 @@
+/**
+ * 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.kafkaintegration.impl;
+
+import java.util.TreeMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+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.onosproject.kafkaintegration.api.KafkaEventStorageService;
+import org.onosproject.kafkaintegration.api.dto.OnosEvent;
+import org.onosproject.store.service.AtomicValue;
+import org.onosproject.store.service.StorageService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(immediate = true)
+public class KafkaStorageManager implements KafkaEventStorageService {
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected StorageService storageService;
+
+    private TreeMap<Long, OnosEvent> kafkaEventStore;
+
+    private AtomicValue<Long> lastPublishedEvent;
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private ScheduledExecutorService gcExService;
+
+    private InternalGarbageCollector gcTask;
+
+    // Thread scheduler parameters.
+    private final long delay = 0;
+    private final long period = 1;
+
+    @Activate
+    protected void activate() {
+        kafkaEventStore = new TreeMap<Long, OnosEvent>();
+        lastPublishedEvent = storageService.<Long>atomicValueBuilder()
+                .withName("onos-app-kafka-published-seqNumber").build()
+                .asAtomicValue();
+
+        startGC();
+
+        log.info("Started");
+    }
+
+    private void startGC() {
+        log.info("Starting Garbage Collection Service");
+        gcExService = Executors.newSingleThreadScheduledExecutor();
+        gcTask = new InternalGarbageCollector();
+        gcExService.scheduleAtFixedRate(gcTask, delay, period,
+                                        TimeUnit.SECONDS);
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        stopGC();
+        log.info("Stopped");
+    }
+
+    private void stopGC() {
+        log.info("Stopping Garbage Collection Service");
+        gcExService.shutdown();
+    }
+
+    @Override
+    public boolean insertCacheEntry(OnosEvent e) {
+        // TODO: Fill in the code once the event carries timestamp info.
+        return true;
+    }
+
+    @Override
+    public void updateLastPublishedEntry(Long sequenceNumber) {
+        this.lastPublishedEvent.set(sequenceNumber);
+    }
+
+    /**
+     * Removes events from the Kafka Event Store which have been published.
+     *
+     */
+    private class InternalGarbageCollector implements Runnable {
+
+        @Override
+        public void run() {
+            kafkaEventStore.headMap(lastPublishedEvent.get(), true).clear();
+        }
+    }
+
+}
