diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiResolver.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiResolver.java
similarity index 71%
rename from apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiResolver.java
rename to apps/odtn/service/src/main/java/org/onosproject/odtn/TapiResolver.java
index 5311cd9..2c2f271 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiResolver.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiResolver.java
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
-package org.onosproject.odtn.internal;
+package org.onosproject.odtn;
 
 import java.util.List;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.ElementId;
@@ -70,13 +71,39 @@
     TapiNodeRef getNodeRef(ElementId deviceId);
 
     /**
+     * Resolve TAPI node with Node unique keys.
+     *
+     * @param nodeRef Node reference object which has node unique keys.
+     * @return TapiNodeRef
+     * @throws NoSuchElementException if target not found
+     */
+    TapiNodeRef getNodeRef(TapiNodeRef nodeRef);
+
+    /**
      * Get all NodeRefs.
      *
-     * @return List&lt;TapiNodeRef&gt;
+     * @return List of all NodeRefs
      */
     List<TapiNodeRef> getNodeRefs();
 
     /**
+     * Apply filter and get filtered NodeRefs.
+     *
+     * @param filter key value map for filter
+     * @return List of filtered NodeRefs, which matches all of {@code filter}
+     */
+    List<TapiNodeRef> getNodeRefs(Map<String, String> filter);
+
+    /**
+     * Resolve TAPI nep with Nep unique keys.
+     *
+     * @param nepRef Nep reference object which has Nep unique keys.
+     * @return TapiNepRef
+     * @throws NoSuchElementException if target not found
+     */
+    TapiNepRef getNepRef(TapiNepRef nepRef);
+
+    /**
      * Resolve TAPI nep associated with ConnectPoint.
      *
      * @param cp search key
@@ -97,11 +124,19 @@
     /**
      * Get all NepRefs.
      *
-     * @return List&lt;TapiNepRef&gt;
+     * @return List of all NepRefs
      */
     List<TapiNepRef> getNepRefs();
 
     /**
+     * Apply filter and get filtered NepRefs.
+     *
+     * @param filter key value map for filter
+     * @return List of filtered NepRefs, which matches all of {@code filter}
+     */
+    List<TapiNepRef> getNepRefs(Map<String, String> filter);
+
+    /**
      * Inform the cache is already got dirty and let it update cache.
      * The cache update process is conducted when next resolve request
      * (hasXXX or getXXX) comes.
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiTopologyManager.java
similarity index 95%
rename from apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java
rename to apps/odtn/service/src/main/java/org/onosproject/odtn/TapiTopologyManager.java
index 1be4ed5..bea4a20 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiTopologyManager.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/TapiTopologyManager.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.odtn.internal;
+package org.onosproject.odtn;
 
 import org.onosproject.net.Device;
 import org.onosproject.net.Link;
@@ -27,36 +27,42 @@
 
     /**
      * DEVICE_ADDED event handler.
+     *
      * @param device device to be added
      */
     void addDevice(Device device);
 
     /**
      * DEVICE_REMOVED event handler.
+     *
      * @param device device to be removed
      */
     void removeDevice(Device device);
 
     /**
      * LINK_ADDED event handler.
+     *
      * @param link link to be added
      */
     void addLink(Link link);
 
     /**
      * LINK_REMOVED event handler.
+     *
      * @param link link to be removed
      */
     void removeLink(Link link);
 
     /**
      * PORT_ADDED event handler.
+     *
      * @param port port to be added
      */
     void addPort(Port port);
 
     /**
      * PORT_REMOVED event handler.
+     *
      * @param port port to be removed
      */
     void removePort(Port port);
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java
index 2a92137..48057c8 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/impl/ServiceApplicationComponent.java
@@ -20,68 +20,41 @@
 
 package org.onosproject.odtn.impl;
 
-import java.util.List;
-
 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.config.DynamicConfigEvent;
-import org.onosproject.config.DynamicConfigListener;
-import org.onosproject.config.DynamicConfigService;
-import org.onosproject.config.FailedException;
-import org.onosproject.config.Filter;
 import org.onosproject.net.Link;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.NetworkConfigStoreDelegate;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.link.LinkEvent;
 import org.onosproject.net.link.LinkListener;
 import org.onosproject.net.link.LinkService;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.TapiTopologyManager;
+import org.onosproject.odtn.internal.DcsBasedTapiCommonRpc;
+import org.onosproject.odtn.internal.DcsBasedTapiConnectivityRpc;
 import org.onosproject.odtn.internal.DcsBasedTapiDataProducer;
 import org.onosproject.odtn.internal.TapiDataProducer;
-import org.onosproject.odtn.internal.TapiResolver;
-import org.onosproject.odtn.internal.TapiTopologyManager;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.TapiCommonService;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.DefaultGetServiceInterfacePointListOutput;
-import org.onosproject.yang.model.NodeKey;
-import org.onosproject.yang.model.SchemaId;
+import org.onosproject.store.AbstractStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.TapiConnectivityService;
 
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.
-    tapiconnectivity.createconnectivityservice.CreateConnectivityServiceInput;
-
-import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.
-    tapiconnectivity.createconnectivityservice.createconnectivityserviceinput.EndPoint;
-
-
-
-// onos-yang-tools
-import org.onosproject.yang.model.DataNode;
-
-import org.onosproject.yang.model.ResourceData;
-import org.onosproject.yang.model.DefaultResourceData;
-import org.onosproject.yang.model.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
-import org.onosproject.yang.model.ModelConverter;
-
-import org.onosproject.yang.model.ResourceId;
-
+// DCS / onos-yang-tools
+import org.onosproject.config.DynamicConfigEvent;
+import org.onosproject.config.DynamicConfigListener;
+import org.onosproject.config.DynamicConfigService;
 import org.onosproject.yang.model.RpcRegistry;
-import org.onosproject.yang.model.RpcService;
-import org.onosproject.yang.model.RpcInput;
-import org.onosproject.yang.model.RpcOutput;
-import org.onosproject.yang.model.SchemaContextProvider;
-import org.onosproject.yang.runtime.YangRuntimeService;
 
 import static org.onosproject.config.DynamicConfigEvent.Type.NODE_ADDED;
 import static org.onosproject.config.DynamicConfigEvent.Type.NODE_DELETED;
-import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
 
 /**
  * OSGi Component for ODTN Service application.
@@ -104,18 +77,9 @@
     protected NetworkConfigService netcfgService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected YangRuntimeService yangRuntime;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected SchemaContextProvider schemaContextProvider;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected RpcRegistry rpcRegistry;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ModelConverter modelConverter;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected TapiTopologyManager tapiTopologyManager;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -127,14 +91,13 @@
 
     private DeviceListener deviceListener = new InternalDeviceListener();
     private final LinkListener linkListener = new InternalLinkListener();
+    private final NetworkConfigListener netcfgListener = new InternalNetCfgListener();
     private TapiDataProducer dataProvider = new DcsBasedTapiDataProducer();
+    private InternalNetCfgManager netcfgStore = new InternalNetCfgManager();
 
     // Rpc Service for TAPI Connectivity
-    private final RpcService rpcTapiConnectivity =
-            new TapiConnectivityRpc();
-
-    private final RpcService rpcTapiCommon =
-            new TapiCommonRpc();
+    private final DcsBasedTapiConnectivityRpc rpcTapiConnectivity = new DcsBasedTapiConnectivityRpc();
+    private final DcsBasedTapiCommonRpc rpcTapiCommon = new DcsBasedTapiCommonRpc();
 
 
     @Activate
@@ -143,8 +106,11 @@
         dynConfigService.addListener(dynamicConfigServiceListener);
         deviceService.addListener(deviceListener);
         linkService.addListener(linkListener);
+        netcfgService.addListener(netcfgListener);
         rpcRegistry.registerRpcService(rpcTapiConnectivity);
         rpcRegistry.registerRpcService(rpcTapiCommon);
+        rpcTapiConnectivity.init();
+        rpcTapiCommon.init();
     }
 
 
@@ -153,6 +119,7 @@
         log.info("Stopped");
         rpcRegistry.unregisterRpcService(rpcTapiCommon);
         rpcRegistry.unregisterRpcService(rpcTapiConnectivity);
+        netcfgService.removeListener(netcfgListener);
         linkService.removeListener(linkListener);
         deviceService.removeListener(deviceListener);
         dynConfigService.removeListener(dynamicConfigServiceListener);
@@ -172,6 +139,8 @@
         @Override
         public void event(DeviceEvent event) {
 
+            netcfgStore.post(event);
+
             switch (event.type()) {
                 case DEVICE_ADDED:
                     tapiTopologyManager.addDevice(event.subject());
@@ -222,6 +191,36 @@
     }
 
     /**
+     * Representation of internal listener, listening for netcfg event.
+     */
+    private class InternalNetCfgListener implements NetworkConfigListener {
+
+        /**
+         * Process an Event from the NetCfg Service.
+         *
+         * @param event link event
+         */
+        @Override
+        public void event(NetworkConfigEvent event) {
+//            Object config = event.subject();
+            log.info("config: {}", event.subject());
+            log.info("type: {}", event.type());
+        }
+    }
+
+    private class InternalNetCfgManager
+        extends AbstractStore<NetworkConfigEvent, NetworkConfigStoreDelegate> {
+
+        public void post(Object obj) {
+            log.info("Post netcfg event : {}", obj);
+            NetworkConfigEvent.Type type = NetworkConfigEvent.Type.CONFIG_UPDATED;
+            notifyDelegate(new NetworkConfigEvent(type, obj, obj.getClass()));
+        }
+
+    }
+
+
+    /**
      * Representation of internal listener, listening for dynamic config event.
      */
     private class InternalDynamicConfigListener implements DynamicConfigListener {
@@ -251,237 +250,74 @@
         @Override
         public void event(DynamicConfigEvent event) {
             resolver.makeDirty();
-
-            ResourceId rsId = event.subject();
-            DataNode node;
-            try {
-                Filter filter = Filter.builder().addCriteria(rsId).build();
-                node = dynConfigService.readNode(rsId, filter);
-            } catch (FailedException e) {
-                node = null;
-            }
-            switch (event.type()) {
-                case NODE_ADDED:
-                    onDcsNodeAdded(rsId, node);
-                    break;
-
-                case NODE_DELETED:
-                    onDcsNodeDeleted(node);
-                    break;
-
-                default:
-                    log.warn("Unknown Event", event.type());
-                    break;
-            }
+//            ResourceId rsId = event.subject();
+//            DataNode node;
+//            try {
+//                Filter filter = Filter.builder().addCriteria(rsId).build();
+//                node = dynConfigService.readNode(rsId, filter);
+//            } catch (FailedException e) {
+//                node = null;
+//            }
+//            switch (event.type()) {
+//                case NODE_ADDED:
+//                    onDcsNodeAdded(rsId, node);
+//                    break;
+//
+//                case NODE_DELETED:
+//                    onDcsNodeDeleted(node);
+//                    break;
+//
+//                default:
+//                    log.warn("Unknown Event", event.type());
+//                    break;
+//            }
         }
 
 
-        /**
-         * Process the event that a node has been added to the DCS.
-         *
-         * @param rsId ResourceId of the added node
-         * @param node added node. Access the key and value
-         */
-        private void onDcsNodeAdded(ResourceId rsId, DataNode node) {
-
-            switch (node.type()) {
-                case SINGLE_INSTANCE_NODE:
-                    break;
-                case MULTI_INSTANCE_NODE:
-                    break;
-                case SINGLE_INSTANCE_LEAF_VALUE_NODE:
-                    break;
-                case MULTI_INSTANCE_LEAF_VALUE_NODE:
-                    break;
-                default:
-                    break;
-            }
-
-            NodeKey dataNodeKey = node.key();
-            SchemaId schemaId = dataNodeKey.schemaId();
+//        /**
+//         * Process the event that a node has been added to the DCS.
+//         *
+//         * @param rsId ResourceId of the added node
+//         * @param node added node. Access the key and value
+//         */
+//        private void onDcsNodeAdded(ResourceId rsId, DataNode node) {
+//
+//            switch (node.type()) {
+//                case SINGLE_INSTANCE_NODE:
+//                    break;
+//                case MULTI_INSTANCE_NODE:
+//                    break;
+//                case SINGLE_INSTANCE_LEAF_VALUE_NODE:
+//                    break;
+//                case MULTI_INSTANCE_LEAF_VALUE_NODE:
+//                    break;
+//                default:
+//                    break;
+//            }
+//
+//            NodeKey dataNodeKey = node.key();
+//            SchemaId schemaId = dataNodeKey.schemaId();
 
             // Consolidate events
 //            if (!schemaId.namespace().contains("tapi")) {
 //                return;
 //            }
 //            log.info("namespace {}", schemaId.namespace());
-        }
+//        }
 
 
-        /**
-         * Process the event that a node has been deleted from the DCS.
-         *
-         * @param dataNode data node
-         */
-        private void onDcsNodeDeleted(DataNode dataNode) {
-            // TODO: Implement release logic
-        }
+//        /**
+//         * Process the event that a node has been deleted from the DCS.
+//         *
+//         * @param dataNode data node
+//         */
+//        private void onDcsNodeDeleted(DataNode dataNode) {
+//            // TODO: Implement release logic
+//        }
 
     }
 
 
-    private class TapiConnectivityRpc implements TapiConnectivityService {
 
 
-        /**
-         * Service interface of createConnectivityService.
-         *
-         * @param inputVar input of service interface createConnectivityService
-         * @return rpcOutput output of service interface createConnectivityService
-         */
-        @Override
-        public RpcOutput createConnectivityService(RpcInput inputVar) {
-
-            DataNode data = inputVar.data();
-            ResourceId rid = inputVar.id();
-
-            log.info("RpcInput Data {}", data);
-            log.info("RpcInput ResourceId {}", rid);
-
-            for (ModelObject mo : getModelObjects(data, rid)) {
-                if (mo instanceof CreateConnectivityServiceInput) {
-                    CreateConnectivityServiceInput i = (CreateConnectivityServiceInput) mo;
-                    log.info("i {}", i);
-                    List<EndPoint> epl = i.endPoint();
-                    for (EndPoint ep : epl) {
-                        log.info("ep {}", ep);
-                    }
-                }
-            }
-
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-        }
-
-
-        /**
-         * Service interface of deleteConnectivityService.
-         *
-         * @param inputVar input of service interface deleteConnectivityService
-         * @return rpcOutput output of service interface deleteConnectivityService
-         */
-        @Override
-        public RpcOutput deleteConnectivityService(RpcInput inputVar) {
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-        }
-
-
-        /**
-         * Service interface of getConnectionDetails.
-         *
-         * @param inputVar input of service interface getConnectionDetails
-         * @return rpcOutput output of service interface getConnectionDetails
-         */
-        @Override
-        public RpcOutput getConnectionDetails(RpcInput inputVar) {
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
-        }
-
-        /**
-         * Service interface of getConnectivityServiceList.
-         *
-         * @param inputVar input of service interface getConnectivityServiceList
-         * @return rpcOutput output of service interface getConnectivityServiceList
-         */
-        @Override
-        public RpcOutput getConnectivityServiceList(RpcInput inputVar) {
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
-        }
-
-        /**
-         * Service interface of getConnectivityServiceDetails.
-         *
-         * @param inputVar input of service interface getConnectivityServiceDetails
-         * @return rpcOutput output of service interface getConnectivityServiceDetails
-         */
-        @Override
-        public RpcOutput getConnectivityServiceDetails(RpcInput inputVar) {
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
-        }
-
-
-        /**
-         * Service interface of updateConnectivityService.
-         *
-         * @param inputVar input of service interface updateConnectivityService
-         * @return rpcOutput output of service interface updateConnectivityService
-         */
-        @Override
-        public RpcOutput updateConnectivityService(RpcInput inputVar) {
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-
-        }
-
-
-        private ResourceData createResourceData(DataNode dataNode, ResourceId resId) {
-            return DefaultResourceData.builder()
-                    .addDataNode(dataNode)
-                    .resourceId(resId)
-                    .build();
-        }
-
-        /**
-         * Returns model objects of the store.
-         *
-         * @param dataNode data node from store
-         * @param resId    parent resource id
-         * @return model objects
-         */
-        private List<ModelObject> getModelObjects(DataNode dataNode, ResourceId resId) {
-            ResourceData data = createResourceData(dataNode, resId);
-            ModelObjectData modelData = modelConverter.createModel(data);
-            return modelData.modelObjects();
-        }
-
-
-    }
-
-
-    private class TapiCommonRpc implements TapiCommonService {
-
-        /**
-         * Service interface of getServiceInterfacePointDetails.
-         *
-         * @param rpcInput input of service interface getServiceInterfacePointDetails
-         * @return rpcOutput output of service interface getServiceInterfacePointDetails
-         */
-        @Override
-        public RpcOutput getServiceInterfacePointDetails(RpcInput rpcInput) {
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-        }
-
-        /**
-         * Service interface of getServiceInterfacePointList.
-         *
-         * @param rpcInput input of service interface getServiceInterfacePointList
-         * @return rpcOutput output of service interface getServiceInterfacePointList
-         */
-        @Override
-        public RpcOutput getServiceInterfacePointList(RpcInput rpcInput) {
-
-            DataNode data = rpcInput.data();
-            ResourceId rid = rpcInput.id();
-
-            log.info("RpcInput Data {}", data);
-            log.info("RpcInput ResourceId {}", rid);
-
-            DefaultGetServiceInterfacePointListOutput node = new DefaultGetServiceInterfacePointListOutput();
-            DataNode dnode = toDataNode(node);
-
-            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, dnode);
-        }
-
-        /**
-         * Service interface of updateServiceInterfacePoint.
-q         *
-         * @param rpcInput input of service interface updateServiceInterfacePoint
-         * @return rpcOutput output of service interface updateServiceInterfacePoint
-         */
-        @Override
-        public RpcOutput updateServiceInterfacePoint(RpcInput rpcInput) {
-            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
-        }
-    }
 }
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java
new file mode 100644
index 0000000..315e10c
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiCommonRpc.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2018-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.odtn.internal;
+
+import org.onosproject.config.DynamicConfigService;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.utils.tapi.TapiGetSipListOutputHandler;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.TapiCommonService;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.RpcInput;
+import org.onosproject.yang.model.RpcOutput;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+
+/**
+ * DCS-dependent tapi-common yang RPCs implementation.
+ */
+public class DcsBasedTapiCommonRpc implements TapiCommonService {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    protected DynamicConfigService dcs;
+    protected ModelConverter modelConverter;
+    protected TapiResolver resolver;
+
+    public void init() {
+        dcs = getService(DynamicConfigService.class);
+        modelConverter = getService(ModelConverter.class);
+        resolver = getService(TapiResolver.class);
+    }
+
+    /**
+     * Service interface of getServiceInterfacePointDetails.
+     *
+     * @param rpcInput input of service interface getServiceInterfacePointDetails
+     * @return rpcOutput output of service interface getServiceInterfacePointDetails
+     */
+    @Override
+    public RpcOutput getServiceInterfacePointDetails(RpcInput rpcInput) {
+        log.error("Not implemented");
+        return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+    }
+
+    /**
+     * Service interface of getServiceInterfacePointList.
+     *
+     * @param rpcInput input of service interface getServiceInterfacePointList
+     * @return rpcOutput output of service interface getServiceInterfacePointList
+     */
+    @Override
+    public RpcOutput getServiceInterfacePointList(RpcInput rpcInput) {
+
+        try {
+            TapiGetSipListOutputHandler output = TapiGetSipListOutputHandler.create();
+
+            resolver.getNepRefs().stream()
+                    .filter(nepRef -> nepRef.getSipId() != null)
+                    .forEach(nepRef -> {
+                        output.addSip(Uuid.fromString(nepRef.getSipId()));
+                    });
+
+            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+        } catch (Throwable e) {
+            log.error("Error:", e);
+            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+        }
+
+    }
+
+    /**
+     * Service interface of updateServiceInterfacePoint.
+     *
+     * @param rpcInput input of service interface updateServiceInterfacePoint
+     * @return rpcOutput output of service interface updateServiceInterfacePoint
+     */
+    @Override
+    public RpcOutput updateServiceInterfacePoint(RpcInput rpcInput) {
+        log.error("Not implemented");
+        return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+    }
+}
+
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java
new file mode 100644
index 0000000..6ddb662
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectionManager.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2018-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.odtn.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onosproject.config.FailedException;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.odtn.utils.tapi.TapiConnection;
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+import org.onosproject.odtn.utils.tapi.TapiCepRefHandler;
+import org.onosproject.odtn.utils.tapi.TapiConnectionHandler;
+
+import org.onosproject.odtn.utils.tapi.TapiRouteHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+
+/**
+ * DCS-dependent Tapi connection manager implementation.
+ */
+public class DcsBasedTapiConnectionManager implements TapiConnectionManager {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    protected TapiPathComputer connectionController;
+    private DeviceService deviceService;
+
+    private List<DcsBasedTapiConnectionManager> connectionManagerList = new ArrayList<>();
+    private TapiConnectionHandler connectionHandler = TapiConnectionHandler.create();
+    private Operation op = null;
+
+
+    enum Operation {
+        CREATE,
+        DELETE
+    }
+
+    public static DcsBasedTapiConnectionManager create() {
+        DcsBasedTapiConnectionManager self = new DcsBasedTapiConnectionManager();
+        self.connectionController = DefaultTapiPathComputer.create();
+        self.deviceService = getService(DeviceService.class);
+        return self;
+    }
+
+    @Override
+    public TapiConnectionHandler createConnection(TapiNepPair neps) {
+
+        // Calculate route
+        TapiConnection connection = connectionController.pathCompute(neps);
+        log.info("Calculated path: {}", connection);
+
+        createConnectionRecursively(connection);
+        return connectionHandler;
+    }
+
+    @Override
+    public void deleteConnection(TapiConnectionHandler connectionHandler) {
+
+        // read target to be deleted
+        this.connectionHandler = connectionHandler;
+        this.connectionHandler.read();
+        log.info("model: {}", connectionHandler.getModelObject());
+
+        deleteConnectionRecursively(connectionHandler);
+    }
+
+    @Override
+    public void apply() {
+        connectionManagerList.forEach(DcsBasedTapiConnectionManager::apply);
+        switch (op) {
+            case CREATE:
+                connectionHandler.add();
+                break;
+            case DELETE:
+                connectionHandler.remove();
+                break;
+            default:
+                throw new FailedException("Unknown operation type.");
+        }
+    }
+
+    /**
+     * Generate TAPI connection and its under connections recursively
+     * and add them to creation queue.
+     *
+     * @param connection connection to be created
+     */
+    private void createConnectionRecursively(TapiConnection connection) {
+        op = Operation.CREATE;
+        connectionManagerList.clear();
+
+        TapiRouteHandler routeBuilder = TapiRouteHandler.create();
+
+        // Create under connection, and set them into routeBuilder
+        connection.getLowerConnections().forEach(lowerConnection -> {
+            delegateConnectionCreation(lowerConnection);
+            routeBuilder.addCep(lowerConnection.getCeps().left());
+            routeBuilder.addCep(lowerConnection.getCeps().right());
+        });
+
+        connectionHandler.addRoute(routeBuilder.getModelObject());
+
+        connectionHandler.addCep(TapiCepRefHandler.create()
+                .setCep(connection.getCeps().left()).getModelObject());
+        connectionHandler.addCep(TapiCepRefHandler.create()
+                .setCep(connection.getCeps().right()).getModelObject());
+
+        connectionManagerList.forEach(manager ->
+                connectionHandler.addLowerConnection(manager.getConnectionHandler().getModelObject()));
+
+    }
+
+    /**
+     * Generate TAPI connection and its under connections recursively
+     * and add them to deletion queue.
+     *
+     * @param connectionHandler connectionHandler of connection to be deleted
+     */
+    private void deleteConnectionRecursively(TapiConnectionHandler connectionHandler) {
+        op = Operation.DELETE;
+        connectionManagerList.clear();
+
+        this.connectionHandler = connectionHandler;
+        this.connectionHandler.getLowerConnections().forEach(lowerConnectionHandler -> {
+            delegateConnectionDeletion(lowerConnectionHandler);
+        });
+    }
+
+    /**
+     * Delegate lower-connection creation to other corresponding TapiConnectionManager of each Nodes.
+     *
+     * @param connection connection to be created
+     */
+    private void delegateConnectionCreation(TapiConnection connection) {
+        log.info("ceps: {}", connection.getCeps());
+        DcsBasedTapiConnectionManager manager = DcsBasedTapiConnectionManager.create();
+        manager.createConnectionRecursively(connection);
+        connectionManagerList.add(manager);
+    }
+
+    /**
+     * Delegate lower-connection deletion to other corresponding TapiConnectionManager of each Nodes.
+     *
+     * @param connectionHandler  connectionHandler of connection to be deleted
+     */
+    private void delegateConnectionDeletion(TapiConnectionHandler connectionHandler) {
+        log.info("model: {}", connectionHandler.getModelObject());
+        DcsBasedTapiConnectionManager manager = DcsBasedTapiConnectionManager.create();
+        manager.deleteConnectionRecursively(connectionHandler);
+        connectionManagerList.add(manager);
+    }
+
+
+    public TapiConnectionHandler getConnectionHandler() {
+        return connectionHandler;
+    }
+
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java
new file mode 100644
index 0000000..2598781
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiConnectivityRpc.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2018-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.odtn.internal;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import org.onosproject.config.DynamicConfigService;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+import org.onosproject.odtn.utils.tapi.TapiConnectionHandler;
+import org.onosproject.odtn.utils.tapi.TapiConnectivityServiceHandler;
+import org.onosproject.odtn.utils.tapi.TapiContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiCreateConnectivityInputHandler;
+import org.onosproject.odtn.utils.tapi.TapiCreateConnectivityOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiDeleteConnectivityInputHandler;
+import org.onosproject.odtn.utils.tapi.TapiDeleteConnectivityOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiGetConnectivityDetailsInputHandler;
+import org.onosproject.odtn.utils.tapi.TapiGetConnectivityDetailsOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiGetConnectivityListOutputHandler;
+import org.onosproject.odtn.utils.tapi.TapiNepRef;
+import org.onosproject.odtn.utils.tapi.TapiObjectHandler;
+import org.onosproject.odtn.utils.tapi.TapiSepHandler;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.TapiConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.model.ModelConverter;
+import org.onosproject.yang.model.RpcInput;
+import org.onosproject.yang.model.RpcOutput;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+
+
+/**
+ * DCS-dependent tapi-connectivity yang RPCs implementation.
+ */
+public class DcsBasedTapiConnectivityRpc implements TapiConnectivityService {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    protected DynamicConfigService dcs;
+    protected ModelConverter modelConverter;
+    protected TapiResolver resolver;
+
+    public void init() {
+        dcs = getService(DynamicConfigService.class);
+        modelConverter = getService(ModelConverter.class);
+        resolver = getService(TapiResolver.class);
+    }
+
+    /**
+     * Service interface of createConnectivityService.
+     *
+     * @param inputVar input of service interface createConnectivityService
+     * @return output of service interface createConnectivityService
+     */
+    @Override
+    public RpcOutput createConnectivityService(RpcInput inputVar) {
+
+        try {
+            TapiCreateConnectivityInputHandler input = new TapiCreateConnectivityInputHandler();
+            input.setRpcInput(inputVar);
+            // TODO validation check
+            log.info("input SIPs: {}", input.getSips());
+
+            List<TapiNepRef> nepRefs = input.getSips().stream()
+                    .map(sipId -> resolver.getNepRef(sipId))
+                    .collect(Collectors.toList());
+            // for test
+//            Map<String, String> filter = new HashMap<>();
+//            filter.put(ODTN_PORT_TYPE, OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT.value());
+//            List<TapiNepRef> nepRefs = resolver.getNepRefs(filter);
+
+            // setup connections
+            TapiNepPair neps = TapiNepPair.create(nepRefs.get(0), nepRefs.get(1));
+            DcsBasedTapiConnectionManager connectionManager = DcsBasedTapiConnectionManager.create();
+            connectionManager.createConnection(neps);
+
+            // setup connectivity service
+            TapiConnectivityServiceHandler connectivityServiceHandler = TapiConnectivityServiceHandler.create();
+            connectivityServiceHandler.addConnection(connectionManager.getConnectionHandler().getModelObject().uuid());
+            neps.stream()
+                    .map(nepRef -> TapiSepHandler.create().setSip(nepRef.getSipId()))
+                    .forEach(sepBuilder -> {
+                        connectivityServiceHandler.addSep(sepBuilder.getModelObject());
+                    });
+
+            // build
+            connectionManager.apply();
+            connectivityServiceHandler.add();
+
+            // output
+            TapiCreateConnectivityOutputHandler output = TapiCreateConnectivityOutputHandler.create()
+                    .addService(connectivityServiceHandler.getModelObject());
+            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+
+        } catch (Throwable e) {
+            log.error("Error:", e);
+            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+        }
+
+    }
+
+
+    /**
+     * Service interface of deleteConnectivityService.
+     *
+     * @param inputVar input of service interface deleteConnectivityService
+     * @return output of service interface deleteConnectivityService
+     */
+    @Override
+    public RpcOutput deleteConnectivityService(RpcInput inputVar) {
+
+        try {
+            TapiDeleteConnectivityInputHandler input = new TapiDeleteConnectivityInputHandler();
+            input.setRpcInput(inputVar);
+            log.info("input serviceId: {}", input.getId());
+
+            TapiConnectivityServiceHandler serviceHandler = TapiConnectivityServiceHandler.create();
+            serviceHandler.setId(input.getId());
+
+            DefaultConnectivityService service = serviceHandler.read();
+
+            service.connection().stream().forEach(connection -> {
+                TapiConnectionHandler connectionHandler = TapiConnectionHandler.create();
+                connectionHandler.setId(Uuid.fromString(connection.connectionId().toString()));
+                DcsBasedTapiConnectionManager manager = DcsBasedTapiConnectionManager.create();
+                manager.deleteConnection(connectionHandler);
+                manager.apply();
+            });
+            serviceHandler.remove();
+
+            TapiDeleteConnectivityOutputHandler output = TapiDeleteConnectivityOutputHandler.create()
+                    .addService(serviceHandler.getModelObject());
+
+            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+        } catch (Throwable e) {
+            log.error("Error:", e);
+            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+        }
+    }
+
+    /**
+     * Service interface of updateConnectivityService.
+     *
+     * @param inputVar input of service interface updateConnectivityService
+     * @return output of service interface updateConnectivityService
+     */
+    @Override
+    public RpcOutput updateConnectivityService(RpcInput inputVar) {
+        log.error("Not implemented");
+        return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+
+    }
+
+    /**
+     * Service interface of getConnectivityServiceList.
+     *
+     * @param inputVar input of service interface getConnectivityServiceList
+     * @return output of service interface getConnectivityServiceList
+     */
+    @Override
+    public RpcOutput getConnectivityServiceList(RpcInput inputVar) {
+
+        try {
+            TapiGetConnectivityListOutputHandler output = TapiGetConnectivityListOutputHandler.create();
+            log.info("get list called");
+
+            TapiContextHandler handler = TapiContextHandler.create();
+            handler.read();
+            log.info("model : {}", handler.getModelObject());
+            log.info("conserv : {}", handler.getConnectivityServices());
+
+            handler.getConnectivityServices().stream()
+                    .map(TapiObjectHandler::getModelObject)
+                    .forEach(output::addService);
+
+            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+
+        } catch (Throwable e) {
+            log.error("Error:", e);
+            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+        }
+    }
+
+
+    /**
+     * Service interface of getConnectivityServiceDetails.
+     *
+     * @param inputVar input of service interface getConnectivityServiceDetails
+     * @return output of service interface getConnectivityServiceDetails
+     */
+    @Override
+    public RpcOutput getConnectivityServiceDetails(RpcInput inputVar) {
+
+        try {
+            TapiGetConnectivityDetailsInputHandler input = new TapiGetConnectivityDetailsInputHandler();
+            input.setRpcInput(inputVar);
+            log.info("input serviceId: {}", input.getId());
+
+            TapiConnectivityServiceHandler handler = TapiConnectivityServiceHandler.create();
+            handler.setId(input.getId());
+            handler.read();
+
+            TapiGetConnectivityDetailsOutputHandler output = TapiGetConnectivityDetailsOutputHandler.create()
+                    .addService(handler.getModelObject());
+
+            return new RpcOutput(RpcOutput.Status.RPC_SUCCESS, output.getDataNode());
+
+        } catch (Throwable e) {
+            return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+        }
+
+    }
+
+    /**
+     * Service interface of getConnectionDetails.
+     *
+     * @param inputVar input of service interface getConnectionDetails
+     * @return output of service interface getConnectionDetails
+     */
+    @Override
+    public RpcOutput getConnectionDetails(RpcInput inputVar) {
+        log.error("Not implemented");
+        return new RpcOutput(RpcOutput.Status.RPC_FAILURE, null);
+    }
+
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java
index 5f6b96c..726d002 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducer.java
@@ -15,9 +15,12 @@
  */
 
 package org.onosproject.odtn.internal;
+
 import com.google.common.annotations.VisibleForTesting;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import org.onosproject.config.DynamicConfigService;
 
@@ -30,14 +33,13 @@
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
 import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
 import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
-import org.onosproject.yang.model.Augmentable;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.DefaultResourceData;
 import org.onosproject.yang.model.ModelConverter;
-import org.onosproject.yang.model.ModelObject;
 import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
 import org.onosproject.yang.model.ResourceData;
@@ -45,13 +47,19 @@
 import org.slf4j.Logger;
 
 import static org.onlab.osgi.DefaultServiceDirectory.getService;
-import static org.onosproject.odtn.utils.tapi.TapiInstanceBuilder.DEVICE_ID;
-import static org.onosproject.odtn.utils.tapi.TapiInstanceBuilder.ONOS_CP;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ONOS_CP;
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.CONNECTION_ID;
 import static org.slf4j.LoggerFactory.getLogger;
 
+/**
+ * DCS-dependent Tapi Data producer implementation.
+ */
 public class DcsBasedTapiDataProducer implements TapiDataProducer {
 
     private final Logger log = getLogger(getClass());
+
     protected DynamicConfigService dcs;
     protected ModelConverter modelConverter;
 
@@ -63,17 +71,28 @@
 
     @Override
     public void updateCacheRequest(DefaultTapiResolver resolver) {
-        ModelObject context = readContextModelObject();
-        updateCache(resolver, context);
+        updateCache(resolver, readContextModelObject());
     }
 
+    /**
+     * Update resolver's cache with Tapi context modelObject.
+     *
+     * @param resolver TapiResolver
+     * @param context Context ModelObject which has all data nodes of Tapi DataTree in Dcs store
+     */
     @VisibleForTesting
-    protected void updateCache(DefaultTapiResolver resolver, ModelObject context) {
+    protected void updateCache(DefaultTapiResolver resolver, DefaultContext context) {
         updateNodes(resolver, getNodes(context));
         updateNeps(resolver, getNeps(context));
     }
 
-    private ModelObject readContextModelObject() {
+    /**
+     * Get Tapi context modelObject from Dcs.
+     *
+     * @return Tapi context modelObject in Dcs store
+     */
+    // FIXME update this method using TapiContextHandler
+    private DefaultContext readContextModelObject() {
         // read DataNode from DCS
         ModelObjectId mid = ModelObjectId.builder().addChild(DefaultContext.class).build();
         DataNode node = dcs.readNode(getResourceId(mid), Filter.builder().build());
@@ -82,15 +101,20 @@
         ResourceData data = DefaultResourceData.builder().addDataNode(node)
                 .resourceId(ResourceId.builder().build()).build();
         ModelObjectData modelData = modelConverter.createModel(data);
-        ModelObject context = modelData.modelObjects().get(0);
+        DefaultContext context = (DefaultContext) modelData.modelObjects().get(0);
 
         return context;
     }
 
-    private List<TapiNodeRef> getNodes(ModelObject context) {
-        Augmentable augmentedContext = (Augmentable) context;
+    /**
+     * Extract Tapi Nodes from context modelObject and convert them to NodeRefs.
+     *
+     * @param context
+     * @return List of NodeRef
+     */
+    private List<TapiNodeRef> getNodes(DefaultContext context) {
         DefaultAugmentedTapiCommonContext topologyContext
-                = augmentedContext.augmentation(DefaultAugmentedTapiCommonContext.class);
+                = context.augmentation(DefaultAugmentedTapiCommonContext.class);
         Topology topology = topologyContext.topology().get(0);
 
         if (topology.node() == null) {
@@ -98,19 +122,27 @@
         }
         return topology.node().stream()
                 .map(node -> {
-                    String deviceId = node.name().stream()
-                            .filter(kv -> kv.valueName().equals(DEVICE_ID))
-                            .findFirst().map(Name::value).get();
-                    return DcsBasedTapiNodeRef.create(topology, node)
-                            .setDeviceId(DeviceId.deviceId(deviceId));
+                    DcsBasedTapiNodeRef nodeRef = DcsBasedTapiNodeRef.create(topology, node);
+                    if (node.name() != null) {
+                        String deviceId = node.name().stream()
+                                .filter(kv -> kv.valueName().equals(DEVICE_ID))
+                                .findFirst().map(Name::value).get();
+                        nodeRef.setDeviceId(DeviceId.deviceId(deviceId));
+                    }
+                    return nodeRef;
                 })
                 .collect(Collectors.toList());
     }
 
-    private List<TapiNepRef> getNeps(ModelObject context) {
-        Augmentable augmentedContext = (Augmentable) context;
+    /**
+     * Extract Tapi Neps from context modelObject and convert them to NepRefs.
+     *
+     * @param context
+     * @return List of TapiNepRef
+     */
+    private List<TapiNepRef> getNeps(DefaultContext context) {
         DefaultAugmentedTapiCommonContext topologyContext
-                = augmentedContext.augmentation(DefaultAugmentedTapiCommonContext.class);
+                = context.augmentation(DefaultAugmentedTapiCommonContext.class);
         Topology topology = topologyContext.topology().get(0);
 
         if (topology.node() == null) {
@@ -118,22 +150,41 @@
         }
         List<TapiNepRef> ret = topology.node().stream()
                 .flatMap(node -> {
-                    if (node.ownedNodeEdgePoint() == null) {
-                        return null;
-                    }
-                    return node.ownedNodeEdgePoint().stream()
+                            if (node.ownedNodeEdgePoint() == null) {
+                                return null;
+                            }
+                            return node.ownedNodeEdgePoint().stream()
                                     .map(nep -> {
-                                        String onosConnectPoint = nep.name().stream()
-                                                .filter(kv -> kv.valueName().equals(ONOS_CP))
-                                                .findFirst().map(Name::value).get();
-                                        TapiNepRef nepRef = DcsBasedTapiNepRef.create(topology, node, nep)
-                                                .setConnectPoint(ConnectPoint.fromString(onosConnectPoint));
+                                        TapiNepRef nepRef = DcsBasedTapiNepRef.create(topology, node, nep);
+                                        if (nep.name() != null) {
+                                            Map<String, String> kvs = new HashMap<>();
+                                            nep.name().forEach(kv -> kvs.put(kv.valueName(), kv.value()));
+
+                                            String onosConnectPoint = kvs.getOrDefault(ONOS_CP, null);
+                                            String portType = kvs.getOrDefault(ODTN_PORT_TYPE, null);
+                                            String connectionId = kvs.getOrDefault(CONNECTION_ID, null);
+                                            nepRef.setConnectPoint(ConnectPoint.fromString(onosConnectPoint))
+                                                    .setPortType(portType)
+                                                    .setConnectionId(connectionId);
+                                        }
                                         if (nep.mappedServiceInterfacePoint() != null) {
                                             nep.mappedServiceInterfacePoint().stream()
                                                     .forEach(sip -> {
                                                         nepRef.setSipId(sip.serviceInterfacePointId().toString());
                                                     });
                                         }
+
+                                        DefaultAugmentedTapiTopologyOwnedNodeEdgePoint augmentNep =
+                                                nep.augmentation(DefaultAugmentedTapiTopologyOwnedNodeEdgePoint.class);
+                                        try {
+                                            if (augmentNep.connectionEndPoint() != null) {
+                                                List<String> cepIds = augmentNep.connectionEndPoint().stream()
+                                                        .map(cep -> cep.uuid().toString()).collect(Collectors.toList());
+                                                nepRef.setCepIds(cepIds);
+                                            }
+                                        } catch (NullPointerException e) {
+                                            log.warn("Augmented ownedNodeEdgePoint is not found.");
+                                        }
                                         return nepRef;
                                     });
                         }
@@ -141,16 +192,26 @@
         return ret;
     }
 
+    /**
+     * Update resolver's NodeRef list.
+     *
+     * @param resolver TapiResolver
+     * @param nodes List of NodeRef for update
+     */
     private void updateNodes(DefaultTapiResolver resolver, List<TapiNodeRef> nodes) {
         resolver.addNodeRefList(nodes);
     }
 
+    /**
+     * Update resolver's NepRef list.
+     *
+     * @param resolver TapiResolver
+     * @param neps List of NepRef for update
+     */
     private void updateNeps(DefaultTapiResolver resolver, List<TapiNepRef> neps) {
         resolver.addNepRefList(neps);
     }
 
-
-
     private ResourceId getResourceId(ModelObjectId modelId) {
         ModelObjectData data = DefaultModelObjectData.builder()
                 .identifier(modelId)
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
index 1ab7f12..b28c769 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DcsBasedTapiTopologyManager.java
@@ -36,14 +36,17 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.Port;
 
-import org.onosproject.odtn.utils.tapi.TapiLinkBuilder;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.TapiTopologyManager;
+import org.onosproject.odtn.utils.tapi.TapiLinkHandler;
+import org.onosproject.odtn.utils.tapi.TapiCepHandler;
 import org.onosproject.odtn.utils.tapi.TapiNepRef;
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
-import org.onosproject.odtn.utils.tapi.TapiContextBuilder;
-import org.onosproject.odtn.utils.tapi.TapiNepBuilder;
-import org.onosproject.odtn.utils.tapi.TapiNodeBuilder;
-import org.onosproject.odtn.utils.tapi.TapiSipBuilder;
-import org.onosproject.odtn.utils.tapi.TapiTopologyBuilder;
+import org.onosproject.odtn.utils.tapi.TapiContextHandler;
+import org.onosproject.odtn.utils.tapi.TapiNepHandler;
+import org.onosproject.odtn.utils.tapi.TapiNodeHandler;
+import org.onosproject.odtn.utils.tapi.TapiSipHandler;
+import org.onosproject.odtn.utils.tapi.TapiTopologyHandler;
 import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
 import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
@@ -55,7 +58,7 @@
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
- * OSGi Component for ODTN Tapi manager application.
+ * OSGi Component for ODTN TAPI topology manager application.
  */
 @Component(immediate = true)
 @Service
@@ -72,8 +75,8 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected TapiResolver tapiResolver;
 
-    private DefaultContext context = new DefaultContext();
-    private DefaultTopology topology = new DefaultTopology();
+    private DefaultContext context;
+    private DefaultTopology topology;
 
     @Activate
     public void activate() {
@@ -95,9 +98,9 @@
         if (tapiResolver.hasNodeRef(deviceId)) {
             return;
         }
-        TapiNodeBuilder.builder()
+        TapiNodeHandler.create()
                 .setTopologyUuid(topology.uuid())
-                .setDeviceId(deviceId).build();
+                .setDeviceId(deviceId).add();
     }
 
     @Override
@@ -115,10 +118,10 @@
         TapiNepRef srcNepRef = tapiResolver.getNepRef(link.src());
         TapiNepRef dstNepRef = tapiResolver.getNepRef(link.dst());
 
-        TapiLinkBuilder.builder()
+        TapiLinkHandler.create()
                 .setTopologyUuid(topology.uuid())
                 .addNep(srcNepRef)
-                .addNep(dstNepRef).build();
+                .addNep(dstNepRef).add();
     }
 
     @Override
@@ -139,19 +142,27 @@
         String nodeId = nodeRef.getNodeId();
 
         // nep
-        TapiNepBuilder nepBuilder = TapiNepBuilder.builder()
-                .setConnectPoint(cp)
+        TapiNepHandler nepBuilder = TapiNepHandler.create()
+                .setPort(port)
                 .setTopologyUuid(topology.uuid())
                 .setNodeUuid(Uuid.fromString(nodeId));
 
-        // sip
-        if (TapiSipBuilder.isSip(cp)) {
+        // cep
+        TapiCepHandler cepBuilder = TapiCepHandler.create()
+                .setTopologyUuid(topology.uuid())
+                .setNodeUuid(Uuid.fromString(nodeId))
+                .setNepUuid(nepBuilder.getId())
+                .setParentNep();
+        nepBuilder.addCep(cepBuilder.getModelObject());
 
-            TapiSipBuilder sipBuilder = TapiSipBuilder.builder().setConnectPoint(cp);
-            nepBuilder.addSip(sipBuilder.getUuid());
-            sipBuilder.build();
+        if (TapiSipHandler.isSip(port)) {
+            TapiSipHandler sipBuilder = TapiSipHandler.create().setPort(port);
+            nepBuilder.addSip(sipBuilder.getId());
+
+            sipBuilder.add();
         }
-        nepBuilder.build();
+
+        nepBuilder.add();
     }
 
     @Override
@@ -159,16 +170,30 @@
         log.info("Remove port: {}", port);
     }
 
+    /**
+     * Add Tapi Context to Dcs store.
+     */
     private void initDcsTapiContext() {
-        TapiContextBuilder.builder(context).build();
+        TapiContextHandler contextHandler = TapiContextHandler.create();
+        context = contextHandler.getModelObject();
+        contextHandler.add();
     }
 
+    /**
+     * Add Tapi Topology to Dcs store.
+     *
+     * Assumed there is only one topology for ODTN Phase 1.0
+     */
     private void initDcsTapiTopology() {
-        TapiTopologyBuilder.builder(topology).build();
+        TapiTopologyHandler topologyHandler = TapiTopologyHandler.create();
+        topology = topologyHandler.getModelObject();
+        topologyHandler.add();
     }
 
-    // FIXME: move DCS-related methods to DCS
-
+    /**
+     * Setup Dcs configuration tree root node.
+     */
+    // FIXME Dcs seems to setup root node by itself when activatation, this might not needed
     private void initDcsIfRootNotExist() {
 
         log.info("read root:");
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiPathComputer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiPathComputer.java
new file mode 100644
index 0000000..f7688cc
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiPathComputer.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2018-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.odtn.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onosproject.net.DeviceId;
+import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
+import org.onosproject.odtn.TapiResolver;
+import org.onosproject.odtn.utils.tapi.TapiCepRef;
+import org.onosproject.odtn.utils.tapi.TapiConnection;
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+import org.onosproject.odtn.utils.tapi.TapiNepRef;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.CONNECTION_ID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * DCS-dependent Tapi path computation engine implementation.
+ */
+public class DefaultTapiPathComputer implements TapiPathComputer {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    protected TapiResolver resolver;
+
+    public static DefaultTapiPathComputer create() {
+        DefaultTapiPathComputer self = new DefaultTapiPathComputer();
+        self.resolver = getService(TapiResolver.class);
+        return self;
+    }
+
+    @Override
+    public TapiConnection pathCompute(TapiNepPair neps) {
+        log.info("Path compute with: {}", neps);
+        return pathComputeDetail(neps);
+    }
+
+    /**
+     * Compute and decide multi-hop route/path from e2e intent.
+     * <p>
+     * FIXME this can work only for Phase1.0, we need some features to:
+     * - define Route and select media channel
+     * - with pre-defined topology and forwarding constraint of each devices or domains
+     * - get all ConnectionEndPoint in the defined route and return them
+     * as list of Cep pair for each connection to be created
+     */
+    private TapiConnection pathComputeDetail(TapiNepPair neps) {
+        return mockPathCompute(neps);
+    }
+
+
+    /**
+     * Mock to create path computation result.
+     *
+     * neps.left           connection                 neps.right
+     * ■----------------------------------------------------■
+     *  \                                                  /
+     *   \                                                /
+     *    \ leftLowerConnection                          / rightLowerConnection
+     *     \                                            /
+     *      \                                          /
+     *       ■                                        ■
+     *   leftLineNep                             rightLineNep
+     */
+    private TapiConnection mockPathCompute(TapiNepPair neps) {
+        TapiNepRef leftLineNep = mockGetTransponderLinePort(neps.left());
+        TapiNepRef rightLineNep = mockGetTransponderLinePort(neps.right());
+
+        TapiConnection leftLowerConnection = TapiConnection.create(
+                TapiCepRef.create(neps.left(), neps.left().getCepIds().get(0)),
+                TapiCepRef.create(leftLineNep, leftLineNep.getCepIds().get(0))
+        );
+
+        TapiConnection rightLowerConnection = TapiConnection.create(
+                TapiCepRef.create(neps.right(), neps.right().getCepIds().get(0)),
+                TapiCepRef.create(rightLineNep, rightLineNep.getCepIds().get(0))
+        );
+
+        TapiConnection connection = TapiConnection.create(
+                TapiCepRef.create(neps.left(), neps.left().getCepIds().get(0)),
+                TapiCepRef.create(neps.right(), neps.right().getCepIds().get(0))
+        );
+        connection.addLowerConnection(leftLowerConnection)
+                .addLowerConnection(rightLowerConnection);
+
+        return connection;
+    }
+
+    /**
+     * Mock to select line port from client port.
+     */
+    private TapiNepRef mockGetTransponderLinePort(TapiNepRef cliNepRef) {
+        DeviceId deviceId = cliNepRef.getConnectPoint().deviceId();
+        Map<String, String> filter = new HashMap<>();
+        filter.put(DEVICE_ID, deviceId.toString());
+        filter.put(ODTN_PORT_TYPE, OdtnDeviceDescriptionDiscovery.OdtnPortType.LINE.value());
+        filter.put(CONNECTION_ID, cliNepRef.getConnectionId());
+        return resolver.getNepRefs(filter).stream().findAny().get();
+    }
+
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
index f5a9bc6..f309d6d 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/DefaultTapiResolver.java
@@ -18,21 +18,27 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 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.onosproject.net.ConnectPoint;
 import org.onosproject.net.ElementId;
+import org.onosproject.odtn.TapiResolver;
 import org.onosproject.odtn.utils.tapi.TapiNepRef;
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
 import org.slf4j.Logger;
 
 import static org.slf4j.LoggerFactory.getLogger;
 
-
+/**
+ * OSGi Component for ODTN TAPI resolver application.
+ */
 @Component(immediate = true)
 @Service
 public class DefaultTapiResolver implements TapiResolver {
@@ -47,7 +53,7 @@
     /**
      * When source (e.g. DCS) is updated, set true
      * When cache update completed successfully, set false
-     *
+     * <p>
      * This flag takes effect when cache update failed with exception,
      * this remains to be true so the cache update process conducts again
      */
@@ -56,7 +62,7 @@
     /**
      * When source (e.g. DCS) is updated, set true
      * When cache update started, set false
-     *
+     * <p>
      * This flag takes effect when source updated during cache updating
      * this forces cache update again at the next request
      */
@@ -95,12 +101,27 @@
     }
 
     @Override
+    public TapiNodeRef getNodeRef(TapiNodeRef nodeRef) throws NoSuchElementException {
+        updateCache();
+        TapiNodeRef ret = null;
+        try {
+            ret = tapiNodeRefList.stream()
+                    .filter(nodeRef::equals)
+                    .findFirst().get();
+        } catch (NoSuchElementException e) {
+            log.error("Node not found of {}", nodeRef);
+            throw e;
+        }
+        return ret;
+    }
+
+    @Override
     public TapiNodeRef getNodeRef(ElementId deviceId) throws NoSuchElementException {
         updateCache();
         TapiNodeRef ret = null;
         try {
             ret = tapiNodeRefList.stream()
-                    .filter(node -> node.getDeviceId().equals(deviceId))
+                    .filter(node -> node.getDeviceId() != null && node.getDeviceId().equals(deviceId))
                     .findFirst().get();
         } catch (NoSuchElementException e) {
             log.error("Node not found associated with {}", deviceId);
@@ -116,12 +137,37 @@
     }
 
     @Override
+    public List<TapiNodeRef> getNodeRefs(Map<String, String> filter) {
+        updateCache();
+        Stream<TapiNodeRef> filterStream = tapiNodeRefList.stream();
+        for (String key : filter.keySet()) {
+            filterStream = filterStream.filter(nodeRef -> nodeRef.is(key, filter.get(key)));
+        }
+        return filterStream.collect(Collectors.toList());
+    }
+
+    @Override
+    public TapiNepRef getNepRef(TapiNepRef nepRef) throws NoSuchElementException {
+        updateCache();
+        TapiNepRef ret = null;
+        try {
+            ret = tapiNepRefList.stream()
+                    .filter(nepRef::equals)
+                    .findFirst().get();
+        } catch (NoSuchElementException e) {
+            log.error("Nep not found of {}", nepRef);
+            throw e;
+        }
+        return ret;
+    }
+
+    @Override
     public TapiNepRef getNepRef(ConnectPoint cp) throws NoSuchElementException {
         updateCache();
         TapiNepRef ret = null;
         try {
             ret = tapiNepRefList.stream()
-                    .filter(nep -> nep.getConnectPoint().equals(cp))
+                    .filter(nep -> nep.getConnectPoint() != null && nep.getConnectPoint().equals(cp))
                     .findFirst().get();
         } catch (NoSuchElementException e) {
             log.error("Nep not found associated with {}", cp);
@@ -136,7 +182,7 @@
         TapiNepRef ret = null;
         try {
             ret = tapiNepRefList.stream()
-                    .filter(nep -> nep.getSipId().equals(sipId))
+                    .filter(nep -> nep.getSipId() != null && nep.getSipId().equals(sipId))
                     .findFirst().get();
         } catch (NoSuchElementException e) {
             log.error("Nep not found associated with {}", sipId);
@@ -152,6 +198,16 @@
     }
 
     @Override
+    public List<TapiNepRef> getNepRefs(Map<String, String> filter) {
+        updateCache();
+        Stream<TapiNepRef> filterStream = tapiNepRefList.stream();
+        for (String key : filter.keySet()) {
+            filterStream = filterStream.filter(nepRef -> nepRef.is(key, filter.get(key)));
+        }
+        return filterStream.collect(Collectors.toList());
+    }
+
+    @Override
     public void makeDirty() {
         sourceUpdated = true;
         isDirty = true;
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiConnectionManager.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiConnectionManager.java
new file mode 100644
index 0000000..baffde9
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiConnectionManager.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2018-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.odtn.internal;
+
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+import org.onosproject.odtn.utils.tapi.TapiConnectionHandler;
+
+/**
+ * ODTN Tapi connectivity-service:connection manager.
+ */
+public interface TapiConnectionManager {
+
+    /**
+     * Queue Tapi connection object to add to DCS.
+     * If target connection has lower-connections, they are also queued recursively
+     * using other TapiConnectionManager instance.
+     * <p>
+     * Operation will not be conducted until apply method called.
+     *
+     * @param neps Both NodeEdgePoints of Nodes(devices or domains) in the calculated route.
+     * @return connectionHandler of connection to be created
+     */
+    TapiConnectionHandler createConnection(TapiNepPair neps);
+
+    /**
+     * Queue Tapi connection object to remove from DCS
+     * If target connection has lower-connections, they are also queued recursively
+     * using other TapiConnectionManager instance.
+     * <p>
+     * Operation will not be conducted until apply method called.
+     *
+     * @param connectionHandler handler of TAPI connection object to be deleted
+     */
+    void deleteConnection(TapiConnectionHandler connectionHandler);
+
+    /**
+     * Apply add/remove operation for queued connection instances.
+     * If target connection has lower-connections, they are also operated recursively
+     * by other TapiConnectionManager instance.
+     */
+    void apply();
+
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java
index 8d0c2d5..0096fa3 100644
--- a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiDataProducer.java
@@ -25,6 +25,7 @@
 
     /**
      * Update TapiResolver cache with latest modelObject in DCS.
+     *
      * @param resolver update target itself
      */
     void updateCacheRequest(DefaultTapiResolver resolver);
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiPathComputer.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiPathComputer.java
new file mode 100644
index 0000000..3951f57
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/internal/TapiPathComputer.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2018-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.odtn.internal;
+
+import org.onosproject.odtn.utils.tapi.TapiConnection;
+import org.onosproject.odtn.utils.tapi.TapiNepPair;
+
+/**
+ * ODTN Tapi path computation service.
+ */
+public interface TapiPathComputer {
+
+    /**
+     * Compute and decide multi-hop route/path from e2e intent.
+     *
+     * @param neps Both NodeEdgePoints associated with ServiceInterfacePoint of NBI request
+     * @return List of both CEPs of devices or domains in the calculated route
+     */
+    TapiConnection pathCompute(TapiNepPair neps);
+}
diff --git a/apps/odtn/service/src/main/java/org/onosproject/odtn/package-info.java b/apps/odtn/service/src/main/java/org/onosproject/odtn/package-info.java
new file mode 100644
index 0000000..8c0e6a0
--- /dev/null
+++ b/apps/odtn/service/src/main/java/org/onosproject/odtn/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2018-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 to place ODTN interfaces.
+ */
+package org.onosproject.odtn;
