diff --git a/src/main/java/org/opencord/cordvtn/api/CordVtnStore.java b/src/main/java/org/opencord/cordvtn/api/CordVtnStore.java
new file mode 100644
index 0000000..d6d7a9b
--- /dev/null
+++ b/src/main/java/org/opencord/cordvtn/api/CordVtnStore.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2016-present 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.opencord.cordvtn.api;
+
+import java.util.Set;
+
+/**
+ * Manages VTN service networks and ports.
+ */
+public interface CordVtnStore {
+
+    /**
+     * Creates service network.
+     *
+     * @param serviceNet the new service network
+     */
+    void createServiceNetwork(ServiceNetwork serviceNet);
+
+    /**
+     * Updates the service network.
+     *
+     * @param serviceNet the updated service network
+     */
+    void updateServiceNetwork(ServiceNetwork serviceNet);
+
+    /**
+     * Returns the service network with the given network id.
+     *
+     * @param netId network id
+     * @return service network
+     */
+    ServiceNetwork getServiceNetwork(NetworkId netId);
+
+    /**
+     * Returns all service networks.
+     *
+     * @return set of service networks
+     */
+    Set<ServiceNetwork> getServiceNetworks();
+
+    /**
+     * Removes the service network.
+     *
+     * @param netId network id
+     */
+    void removeServiceNetwork(NetworkId netId);
+
+    /**
+     * Creates service port.
+     *
+     * @param servicePort the new service port
+     */
+    void createServicePort(ServicePort servicePort);
+
+    /**
+     * Returns the service port with the given port id.
+     *
+     * @param portId port id
+     * @return service port
+     */
+    ServicePort getServicePort(PortId portId);
+
+    /**
+     * Returns all service ports.
+     *
+     * @return set of service ports
+     */
+    Set<ServicePort> getServicePorts();
+
+    /**
+     * Removes service port.
+     *
+     * @param portId port id
+     */
+    void removeServicePort(PortId portId);
+
+    // TODO add apis for the virtual network and port
+}
diff --git a/src/main/java/org/opencord/cordvtn/impl/DistributedCordVtnStore.java b/src/main/java/org/opencord/cordvtn/impl/DistributedCordVtnStore.java
new file mode 100644
index 0000000..11b1e83
--- /dev/null
+++ b/src/main/java/org/opencord/cordvtn/impl/DistributedCordVtnStore.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2016-present 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.opencord.cordvtn.impl;
+
+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.Service;
+import org.opencord.cordvtn.api.CordVtnStore;
+import org.opencord.cordvtn.api.NetworkId;
+import org.opencord.cordvtn.api.PortId;
+import org.opencord.cordvtn.api.ServiceNetwork;
+import org.opencord.cordvtn.api.ServicePort;
+import org.slf4j.Logger;
+
+import java.util.Set;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of the cordvtn service.
+ */
+@Component(immediate = true)
+@Service
+public class DistributedCordVtnStore implements CordVtnStore {
+    protected final Logger log = getLogger(getClass());
+
+    private static final String MSG_SERVICE_NET  = "Service network %s %s";
+    private static final String MSG_SERVICE_PORT = "Service port %s %s";
+    private static final String CREATED = "created";
+    private static final String UPDATED = "updated";
+    private static final String REMOVED = "removed";
+
+    @Activate
+    protected void activate() {
+        log.info("Started");
+    }
+
+    @Deactivate
+    protected void deactivate() {
+        log.info("Stopped");
+    }
+
+    @Override
+    public void createServiceNetwork(ServiceNetwork serviceNet) {
+        // TODO implement
+        log.info(String.format(MSG_SERVICE_NET, CREATED, serviceNet));
+    }
+
+    @Override
+    public void updateServiceNetwork(ServiceNetwork serviceNet) {
+        // TODO implement
+        log.info(String.format(MSG_SERVICE_NET, UPDATED, serviceNet));
+    }
+
+    @Override
+    public ServiceNetwork getServiceNetwork(NetworkId netId) {
+        // TODO implement
+        return null;
+    }
+
+    @Override
+    public Set<ServiceNetwork> getServiceNetworks() {
+        // TODO implement
+        return null;
+    }
+
+    @Override
+    public void removeServiceNetwork(NetworkId netId) {
+        // TODO implement
+        log.info(String.format(MSG_SERVICE_NET, REMOVED, netId));
+    }
+
+    @Override
+    public void createServicePort(ServicePort servicePort) {
+        // TODO implement
+        log.info(String.format(MSG_SERVICE_PORT, CREATED, servicePort));
+    }
+
+    @Override
+    public ServicePort getServicePort(PortId portId) {
+        // TODO implement
+        return null;
+    }
+
+    @Override
+    public Set<ServicePort> getServicePorts() {
+        // TODO implement
+        return null;
+    }
+
+    @Override
+    public void removeServicePort(PortId portId) {
+        // TODO implement
+        log.info(String.format(MSG_SERVICE_PORT, REMOVED, portId));
+    }
+}
