diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java
index 12df8cb..e5fcf2d 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java
@@ -20,6 +20,9 @@
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
 
+/**
+ * TAPI Nep reference class which has a factory method using DCS modelObject.
+ */
 public final class DcsBasedTapiNepRef extends TapiNepRef {
 
     private DcsBasedTapiNepRef(Topology topology, Node node, OwnedNodeEdgePoint nep) {
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java
index cfc38e2..b6260a7 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java
@@ -19,6 +19,9 @@
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
 
+/**
+ * TAPI Node reference class which has a factory method using DCS modelObject.
+ */
 public final class DcsBasedTapiNodeRef extends TapiNodeRef {
 
     private DcsBasedTapiNodeRef(Topology topology, Node node) {
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepHandler.java
new file mode 100644
index 0000000..b49de0c
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepHandler.java
@@ -0,0 +1,123 @@
+/*
+ * 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.utils.tapi;
+
+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.tapiconnectivity.rev20180307.tapiconnectivity.ceplist.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectionendpoint.DefaultParentNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.DefaultOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.OwnedNodeEdgePointKeys;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.NodeKeys;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
+import org.onosproject.yang.model.ModelObjectId;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
+
+/**
+ * Utility class to deal with TAPI CEP with DCS.
+ */
+public final class TapiCepHandler extends TapiObjectHandler<DefaultConnectionEndPoint> {
+
+    private Uuid topologyUuid;
+    private Uuid nodeUuid;
+    private Uuid nepUuid;
+
+    private TapiCepHandler() {
+        obj = new DefaultConnectionEndPoint();
+        setId();
+    }
+
+    public static TapiCepHandler create() {
+        return new TapiCepHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        checkNotNull(topologyUuid);
+        checkNotNull(nodeUuid);
+        checkNotNull(nodeUuid);
+
+        TopologyKeys topologyKey = new TopologyKeys();
+        topologyKey.uuid(topologyUuid);
+
+        NodeKeys nodeKey = new NodeKeys();
+        nodeKey.uuid(nodeUuid);
+
+        OwnedNodeEdgePointKeys nepKey = new OwnedNodeEdgePointKeys();
+        nepKey.uuid(nepUuid);
+
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultTopology.class, topologyKey)
+                .addChild(DefaultNode.class, nodeKey)
+                .addChild(DefaultOwnedNodeEdgePoint.class, nepKey)
+                .build();
+    }
+
+    public TapiCepHandler setTopologyUuid(Uuid topologyUuid) {
+        this.topologyUuid = topologyUuid;
+        return this;
+    }
+
+    public TapiCepHandler setNodeUuid(Uuid nodeUuid) {
+        this.nodeUuid = nodeUuid;
+        return this;
+    }
+
+    public TapiCepHandler setNepUuid(Uuid nepUuid) {
+        this.nepUuid = nepUuid;
+        return this;
+    }
+
+    public TapiCepHandler setParentNep() {
+        checkNotNull(topologyUuid);
+        checkNotNull(nodeUuid);
+        checkNotNull(nepUuid);
+
+        DefaultParentNodeEdgePoint parentNep = new DefaultParentNodeEdgePoint();
+        parentNep.topologyId(topologyUuid);
+        parentNep.nodeId(nodeUuid);
+        parentNep.ownedNodeEdgePointId(nepUuid);
+        obj.addToParentNodeEdgePoint(parentNep);
+
+        return this;
+    }
+
+    public TapiCepHandler setParentNep(TapiNepRef nepRef) {
+        topologyUuid = Uuid.fromString(nepRef.getTopologyId());
+        nodeUuid = Uuid.fromString(nepRef.getNodeId());
+        nepUuid = Uuid.fromString(nepRef.getNepId());
+
+        setParentNep();
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepPair.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepPair.java
new file mode 100644
index 0000000..f283bf3
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepPair.java
@@ -0,0 +1,90 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.Objects;
+import java.util.stream.Stream;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * TAPI CepRef pair class for representation of endpoints of single connection.
+ */
+public final class TapiCepPair {
+
+    private TapiCepRef left;
+    private TapiCepRef right;
+
+    private TapiCepPair() {
+    }
+
+    public static TapiCepPair create(TapiCepRef left, TapiCepRef right) {
+        TapiCepPair self = new TapiCepPair();
+        self.left = left;
+        self.right = right;
+        return self;
+    }
+
+    public TapiCepRef left() {
+        return left;
+    }
+
+    public TapiCepRef right() {
+        return right;
+    }
+
+    public TapiNepPair getTapiNepPair() {
+        return TapiNepPair.create(left.getNepRef(), right.getNepRef());
+    }
+
+    public TapiCepPair invert() {
+        return TapiCepPair.create(right, left);
+    }
+
+    public boolean isSameNode() {
+        return left.getTopologyId().equals(right.getTopologyId()) && left.getNodeId().equals(right.getNodeId());
+    }
+
+    public Stream<TapiCepRef> stream() {
+        return Stream.of(left, right);
+    }
+
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("left", left)
+                .add("right", right)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof TapiCepPair)) {
+            return false;
+        }
+        TapiCepPair that = (TapiCepPair) o;
+        return Objects.equals(left, that.left) &&
+                Objects.equals(right, that.right);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(left, right);
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRef.java
new file mode 100644
index 0000000..15e3ecc
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRef.java
@@ -0,0 +1,105 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.Objects;
+import java.util.UUID;
+
+import org.slf4j.Logger;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * TAPI Cep reference class.
+ * <p>
+ * TAPI reference class should be used in ODTN ServiceApplication
+ * in order to make independent ServiceApplication implementation from DCS.
+ */
+public final class TapiCepRef {
+
+    protected final Logger log = getLogger(getClass());
+
+    private final UUID topologyId;
+    private final UUID nodeId;
+    private final UUID nepId;
+    private final UUID cepId;
+
+    private TapiCepRef(String topologyId, String nodeId, String nepId, String cepId) {
+        this.topologyId = UUID.fromString(topologyId);
+        this.nodeId = UUID.fromString(nodeId);
+        this.nepId = UUID.fromString(nepId);
+        this.cepId = UUID.fromString(cepId);
+    }
+
+    public static TapiCepRef create(String topologyId, String nodeId, String nepId, String cepId) {
+        return new TapiCepRef(topologyId, nodeId, nepId, cepId);
+    }
+
+    public static TapiCepRef create(TapiNepRef nepRef, String cepId) {
+        return new TapiCepRef(nepRef.getTopologyId(), nepRef.getNodeId(), nepRef.getNepId(), cepId);
+    }
+
+    public String getTopologyId() {
+        return topologyId.toString();
+    }
+
+    public String getNodeId() {
+        return nodeId.toString();
+    }
+
+    public String getNepId() {
+        return nepId.toString();
+    }
+
+    public String getCepId() {
+        return cepId.toString();
+    }
+
+    public TapiNepRef getNepRef() {
+        return new TapiNepRef(topologyId.toString(), nodeId.toString(), nepId.toString());
+    }
+
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("topologyId", topologyId)
+                .add("nodeId", nodeId)
+                .add("nepId", nepId)
+                .add("cepId", cepId)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof TapiCepRef)) {
+            return false;
+        }
+        TapiCepRef that = (TapiCepRef) o;
+        return Objects.equals(topologyId, that.topologyId) &&
+                Objects.equals(nodeId, that.nodeId) &&
+                Objects.equals(nepId, that.nepId) &&
+                Objects.equals(cepId, that.cepId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(topologyId, nodeId, nepId, cepId);
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRefHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRefHandler.java
new file mode 100644
index 0000000..38acd75
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCepRefHandler.java
@@ -0,0 +1,67 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.ceplist.ConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectionendpoint.ParentNodeEdgePoint;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * Utility class to deal with TAPI CepRef with DCS.
+ */
+public final class TapiCepRefHandler extends TapiObjectHandler<DefaultConnectionEndPoint> {
+
+    private TapiCepRefHandler() {
+        obj = new DefaultConnectionEndPoint();
+    }
+
+    public static TapiCepRefHandler create() {
+        return new TapiCepRefHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return (Uuid) obj.connectionEndPointId();
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {}
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return null;
+    }
+
+    public TapiCepRefHandler setCep(TapiCepRef cepRef) {
+        obj.topologyId(cepRef.getTopologyId());
+        obj.nodeId(cepRef.getNodeId());
+        obj.ownedNodeEdgePointId(cepRef.getNepId());
+        obj.connectionEndPointId(cepRef.getCepId());
+        return this;
+    }
+
+    public TapiCepRefHandler setCep(ConnectionEndPoint cep) {
+        obj.connectionEndPointId(cep.uuid());
+        ParentNodeEdgePoint parentNep = cep.parentNodeEdgePoint().get(0);
+        obj.topologyId(parentNep.topologyId());
+        obj.nodeId(parentNep.nodeId());
+        obj.ownedNodeEdgePointId(parentNep.ownedNodeEdgePointId());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnection.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnection.java
new file mode 100644
index 0000000..f81ec1a
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnection.java
@@ -0,0 +1,80 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+public final class TapiConnection {
+
+    private TapiCepPair ceps;
+    private List<TapiConnection> lowerConnections = new ArrayList<>();
+
+    private TapiConnection(TapiCepPair ceps) {
+        this.ceps = ceps;
+    }
+
+    public static TapiConnection create(TapiCepPair ceps) {
+        return new TapiConnection(ceps);
+    }
+
+    public static TapiConnection create(TapiCepRef left, TapiCepRef right) {
+        TapiCepPair cepPair = TapiCepPair.create(left, right);
+        return new TapiConnection(cepPair);
+    }
+
+    public TapiCepPair getCeps() {
+        return ceps;
+    }
+
+    public List<TapiConnection> getLowerConnections() {
+        return lowerConnections;
+    }
+
+    public TapiConnection addLowerConnection(TapiConnection lowerConnection) {
+        this.lowerConnections.add(lowerConnection);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("ceps", ceps)
+                .add("lowerConnection", lowerConnections)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof TapiConnection)) {
+            return false;
+        }
+        TapiConnection that = (TapiConnection) o;
+        return Objects.equals(ceps, that.ceps) &&
+                Objects.equals(lowerConnections, that.lowerConnections);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ceps, lowerConnections);
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java
new file mode 100644
index 0000000..b3d6f3e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectionHandler.java
@@ -0,0 +1,117 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+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.tapiconnectivity.rev20180307.tapiconnectivity.connection.ConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultLowerConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultRoute;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connection.LowerConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectionKeys;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnection;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
+
+/**
+ * Utility class to deal with TAPI Connection with DCS.
+ */
+public final class TapiConnectionHandler extends TapiObjectHandler<DefaultConnection> {
+
+    private TapiConnectionHandler() {
+        obj = new DefaultConnection();
+        setId();
+    }
+
+    public static TapiConnectionHandler create() {
+        return new TapiConnectionHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return ModelObjectId.builder().addChild(DefaultContext.class).build();
+    }
+
+    @Override
+    public ModelObjectData getChildModelObjectData() {
+
+        ConnectionKeys key = new ConnectionKeys();
+        key.uuid(getId());
+
+        DefaultConnectionEndPoint mObj = new DefaultConnectionEndPoint();
+
+        ModelObjectId mId = ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultConnection.class, key)
+                .build();
+
+        return DefaultModelObjectData.builder()
+                .addModelObject(mObj)
+                .identifier(mId)
+                .build();
+    }
+
+    public TapiConnectionHandler addCep(ConnectionEndPoint cep) {
+        obj.addToConnectionEndPoint(cep);
+        return this;
+    }
+
+    public TapiConnectionHandler addLowerConnection(DefaultConnection connection) {
+        DefaultLowerConnection lowerConnection = new DefaultLowerConnection();
+        lowerConnection.connectionId(connection.uuid());
+        obj.addToLowerConnection(lowerConnection);
+        return this;
+    }
+
+    public TapiConnectionHandler addRoute(DefaultRoute route) {
+        obj.addToRoute(route);
+        return this;
+    }
+
+    public List<TapiConnectionHandler> getLowerConnections() {
+
+        try {
+            return obj.lowerConnection().stream()
+                    .map(LowerConnection::connectionId)
+                    .map(id -> {
+                        TapiConnectionHandler handler = new TapiConnectionHandler();
+                        handler.setId(Uuid.fromString(id.toString()));
+                        return handler;
+                    }).collect(Collectors.toList());
+        } catch (NullPointerException e) {
+            return Collections.emptyList();
+        }
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityServiceHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityServiceHandler.java
new file mode 100644
index 0000000..89ac48e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiConnectivityServiceHandler.java
@@ -0,0 +1,91 @@
+/*
+ * 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.utils.tapi;
+
+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.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityServiceKeys;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityservice.DefaultConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityservice.EndPoint;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
+
+/**
+ * Utility class to deal with TAPI ConnectivityService with DCS.
+ */
+public final class TapiConnectivityServiceHandler extends TapiObjectHandler<DefaultConnectivityService> {
+
+    private TapiConnectivityServiceHandler() {
+        obj = new DefaultConnectivityService();
+        setId();
+    }
+
+    public static TapiConnectivityServiceHandler create() {
+        return new TapiConnectivityServiceHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return ModelObjectId.builder().addChild(DefaultContext.class).build();
+    }
+
+    @Override
+    public ModelObjectData getChildModelObjectData() {
+
+        ConnectivityServiceKeys key = new ConnectivityServiceKeys();
+        key.uuid(getId());
+
+        DefaultConnection mObj = new DefaultConnection();
+
+        ModelObjectId mId = ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultConnectivityService.class, key)
+                .build();
+
+        return DefaultModelObjectData.builder()
+                .addModelObject(mObj)
+                .identifier(mId)
+                .build();
+    }
+
+    public TapiConnectivityServiceHandler addSep(EndPoint sep) {
+        obj.addToEndPoint(sep);
+        return this;
+    }
+
+    public TapiConnectivityServiceHandler addConnection(Uuid connectionUuid) {
+        DefaultConnection connection = new DefaultConnection();
+        connection.connectionId(connectionUuid.toString());
+        obj.addToConnection(connection);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextBuilder.java
deleted file mode 100644
index 720d436..0000000
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextBuilder.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.utils.tapi;
-
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.model.ModelObjectId;
-
-/**
- * Utility builder class for TAPI context creation with DCS.
- */
-public final class TapiContextBuilder extends TapiInstanceBuilder {
-
-    private DefaultContext context;
-
-    private TapiContextBuilder(DefaultContext context) {
-        this.context = context;
-    }
-
-    public static TapiContextBuilder builder(DefaultContext context) {
-        return new TapiContextBuilder(context);
-    }
-
-    @Override
-    public ModelObjectId getModelObjectId() {
-        return ModelObjectId.builder().build();
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public DefaultContext getModelObject() {
-        return context;
-    }
-
-    @Override
-    public Uuid getUuid() {
-        return null;
-    }
-}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextHandler.java
new file mode 100644
index 0000000..ff8e24d
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextHandler.java
@@ -0,0 +1,88 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+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.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.DefaultAugmentedTapiCommonContext;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * Utility class to deal with TAPI Context with DCS.
+ */
+public final class TapiContextHandler extends TapiObjectHandler<DefaultContext> {
+
+    private TapiContextHandler() {
+        obj = new DefaultContext();
+    }
+
+    public static TapiContextHandler create() {
+        return new TapiContextHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return null;
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return ModelObjectId.builder().build();
+    }
+
+    @Override
+    public ModelObjectData getChildModelObjectData() {
+
+        ModelObjectId mId = ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .build();
+
+        DefaultTopology mObj = new DefaultTopology();
+
+        return DefaultModelObjectData.builder()
+                .addModelObject(mObj)
+                .identifier(mId)
+                .build();
+    }
+
+    public List<TapiConnectivityServiceHandler> getConnectivityServices() {
+
+        DefaultAugmentedTapiCommonContext augmentedContext = obj.augmentation(DefaultAugmentedTapiCommonContext.class);
+        try {
+            return augmentedContext.connectivityService().stream()
+                    .map(connectivityService -> {
+                        TapiConnectivityServiceHandler handler = TapiConnectivityServiceHandler.create();
+                        handler.setModelObject((DefaultConnectivityService) connectivityService);
+                        return handler;
+                    }).collect(Collectors.toList());
+        } catch (NullPointerException e) {
+            return Collections.emptyList();
+        }
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityInputHandler.java
new file mode 100644
index 0000000..1a182b8
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityInputHandler.java
@@ -0,0 +1,46 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.CreateConnectivityServiceInput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.DefaultCreateConnectivityServiceInput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.createconnectivityserviceinput.EndPoint;
+
+/**
+ * Utility class to deal with TAPI RPC input with DCS.
+ */
+public final class TapiCreateConnectivityInputHandler
+        extends TapiRpcInputHandler<DefaultCreateConnectivityServiceInput> {
+
+    public List<EndPoint> getEndPoints() {
+        List<EndPoint> eps = CreateConnectivityServiceInput.class.cast(obj).endPoint();
+        if (eps == null) {
+            return Collections.emptyList();
+        }
+        return eps;
+    }
+
+    public List<String> getSips() {
+        return getEndPoints().stream()
+                .map(ep -> ep.serviceInterfacePoint().serviceInterfacePointId().toString())
+                .collect(Collectors.toList());
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityOutputHandler.java
new file mode 100644
index 0000000..f503072
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiCreateConnectivityOutputHandler.java
@@ -0,0 +1,45 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.DefaultCreateConnectivityServiceOutput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.createconnectivityservice.createconnectivityserviceoutput.DefaultService;
+
+/**
+ * Utility class to deal with TAPI RPC output with DCS.
+ */
+public final class TapiCreateConnectivityOutputHandler
+        extends TapiRpcOutputHandler<DefaultCreateConnectivityServiceOutput> {
+
+    private TapiCreateConnectivityOutputHandler() {
+        obj = new DefaultCreateConnectivityServiceOutput();
+    }
+
+    public static TapiCreateConnectivityOutputHandler create() {
+        return new TapiCreateConnectivityOutputHandler();
+    }
+
+    public TapiCreateConnectivityOutputHandler addService(ConnectivityService res) {
+        DefaultService rpcOutputService = new DefaultService();
+        rpcOutputService.uuid(res.uuid());
+        res.connection().forEach(rpcOutputService::addToConnection);
+        res.endPoint().forEach(rpcOutputService::addToEndPoint);
+        obj.service(rpcOutputService);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityInputHandler.java
new file mode 100644
index 0000000..75d854e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityInputHandler.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.utils.tapi;
+
+import java.util.UUID;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.deleteconnectivityservice.DefaultDeleteConnectivityServiceInput;
+
+/**
+ * Utility class to deal with TAPI RPC input with DCS.
+ */
+public final class TapiDeleteConnectivityInputHandler
+        extends TapiRpcInputHandler<DefaultDeleteConnectivityServiceInput> {
+
+    public Uuid getId() {
+        String idOrName = obj.serviceIdOrName();
+        UUID uuid = UUID.fromString(idOrName);
+        return Uuid.fromString(uuid.toString());
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityOutputHandler.java
new file mode 100644
index 0000000..34186a4
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiDeleteConnectivityOutputHandler.java
@@ -0,0 +1,45 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.deleteconnectivityservice.DefaultDeleteConnectivityServiceOutput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.deleteconnectivityservice.deleteconnectivityserviceoutput.DefaultService;
+
+/**
+ * Utility class to deal with TAPI RPC output with DCS.
+ */
+public final class TapiDeleteConnectivityOutputHandler
+        extends TapiRpcOutputHandler<DefaultDeleteConnectivityServiceOutput> {
+
+    private TapiDeleteConnectivityOutputHandler() {
+        obj = new DefaultDeleteConnectivityServiceOutput();
+    }
+
+    public static TapiDeleteConnectivityOutputHandler create() {
+        return new TapiDeleteConnectivityOutputHandler();
+    }
+
+    public TapiDeleteConnectivityOutputHandler addService(ConnectivityService res) {
+        log.info("Output service: {}", res);
+        DefaultService rpcOutputService = new DefaultService();
+        rpcOutputService.uuid(res.uuid());
+        obj.service(rpcOutputService);
+        return this;
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsInputHandler.java
new file mode 100644
index 0000000..ca01812
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsInputHandler.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.utils.tapi;
+
+import java.util.UUID;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicedetails.DefaultGetConnectivityServiceDetailsInput;
+
+/**
+ * Utility class to deal with TAPI RPC input with DCS.
+ */
+public final class TapiGetConnectivityDetailsInputHandler
+        extends TapiRpcInputHandler<DefaultGetConnectivityServiceDetailsInput> {
+
+    public Uuid getId() {
+        String idOrName = obj.serviceIdOrName();
+        UUID uuid = UUID.fromString(idOrName);
+        return Uuid.fromString(uuid.toString());
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsOutputHandler.java
new file mode 100644
index 0000000..1d7b02d
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityDetailsOutputHandler.java
@@ -0,0 +1,46 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicedetails.DefaultGetConnectivityServiceDetailsOutput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicedetails.getconnectivityservicedetailsoutput.DefaultService;
+
+/**
+ * Utility class to deal with TAPI RPC output with DCS.
+ */
+public final class TapiGetConnectivityDetailsOutputHandler
+        extends TapiRpcOutputHandler<DefaultGetConnectivityServiceDetailsOutput> {
+
+    private TapiGetConnectivityDetailsOutputHandler() {
+        obj = new DefaultGetConnectivityServiceDetailsOutput();
+    }
+
+    public static TapiGetConnectivityDetailsOutputHandler create() {
+        return new TapiGetConnectivityDetailsOutputHandler();
+    }
+
+    public TapiGetConnectivityDetailsOutputHandler addService(ConnectivityService res) {
+        DefaultService rpcOutputService = new DefaultService();
+        rpcOutputService.uuid(res.uuid());
+        res.connection().forEach(rpcOutputService::addToConnection);
+        res.endPoint().forEach(rpcOutputService::addToEndPoint);
+        obj.service(rpcOutputService);
+        return this;
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityListOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityListOutputHandler.java
new file mode 100644
index 0000000..99bc678
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetConnectivityListOutputHandler.java
@@ -0,0 +1,46 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectivityService;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicelist.DefaultGetConnectivityServiceListOutput;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.getconnectivityservicelist.getconnectivityservicelistoutput.DefaultService;
+
+/**
+ * Utility class to deal with TAPI RPC output with DCS.
+ */
+public final class TapiGetConnectivityListOutputHandler
+        extends TapiRpcOutputHandler<DefaultGetConnectivityServiceListOutput> {
+
+    private TapiGetConnectivityListOutputHandler() {
+        obj = new DefaultGetConnectivityServiceListOutput();
+    }
+
+    public static TapiGetConnectivityListOutputHandler create() {
+        return new TapiGetConnectivityListOutputHandler();
+    }
+
+    public TapiGetConnectivityListOutputHandler addService(ConnectivityService res) {
+        DefaultService rpcOutputService = new DefaultService();
+        rpcOutputService.uuid(res.uuid());
+        res.connection().forEach(rpcOutputService::addToConnection);
+        res.endPoint().forEach(rpcOutputService::addToEndPoint);
+        obj.addToService(rpcOutputService);
+        return this;
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetSipListOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetSipListOutputHandler.java
new file mode 100644
index 0000000..95143d6
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGetSipListOutputHandler.java
@@ -0,0 +1,45 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.DefaultGetServiceInterfacePointListOutput;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.getserviceinterfacepointlistoutput.DefaultSip;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.getserviceinterfacepointlist.getserviceinterfacepointlistoutput.Sip;
+
+/**
+ * Utility class to deal with TAPI RPC output with DCS.
+ */
+public final class TapiGetSipListOutputHandler
+        extends TapiRpcOutputHandler<DefaultGetServiceInterfacePointListOutput> {
+
+    private TapiGetSipListOutputHandler() {
+        obj = new DefaultGetServiceInterfacePointListOutput();
+    }
+
+    public static TapiGetSipListOutputHandler create() {
+        return new TapiGetSipListOutputHandler();
+    }
+
+    public TapiGetSipListOutputHandler addSip(Uuid sipId) {
+        Sip sip = new DefaultSip();
+        sip.uuid(sipId);
+        obj.addToSip(sip);
+        return this;
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java
index 2af7fed..200c623 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java
@@ -25,35 +25,35 @@
 import java.lang.reflect.Method;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.UUID;
 
 import org.slf4j.Logger;
+
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Utility methods dealing with TAPI modelObject which includes global class grouping.
- *
+ * <p>
  * <p> tapi-common@2018-03-07.yang
  * grouping global-class {
- *   leaf uuid {
- *     type uuid;
- *   }
- *   list name {
- *     key 'value-name';
- *     uses name-and-value;
- *   }
+ * leaf uuid {
+ * type uuid;
  * }
- *
+ * list name {
+ * key 'value-name';
+ * uses name-and-value;
+ * }
+ * }
+ * <p>
  * grouping name-and-value {
- *   leaf value-name {
- *     type string;
- *     description "The name of the value. The value need not have a name.";
- *   }
- *   leaf value {
- *     type string;
- *     description "The value";
- *   }
- *   description "A scoped name-value pair";
+ * leaf value-name {
+ * type string;
+ * description "The name of the value. The value need not have a name.";
+ * }
+ * leaf value {
+ * type string;
+ * description "The value";
+ * }
+ * description "A scoped name-value pair";
  * }
  * </p>
  */
@@ -65,14 +65,13 @@
     }
 
     /**
-     * Generate and set Uuid for the ModelObject.
-     * @param obj ModelObject
-     * @param <T> type of ModelObject
-     * @return generated uuid
+     * Set uuid for the ModelObject.
+     *
+     * @param obj  ModelObject
+     * @param uuid Uuid
+     * @param <T>  Type of ModelObject
      */
-    public static <T extends ModelObject> Uuid setUuid(T obj) {
-        Uuid uuid = Uuid.of(UUID.randomUUID().toString());
-
+    public static <T extends ModelObject> void setUuid(T obj, Uuid uuid) {
         @SuppressWarnings("unchecked")
         Class<T> cls = (Class<T>) obj.getClass();
         try {
@@ -81,15 +80,35 @@
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
             log.error("Exception thrown", e);
         }
+    }
+
+    /**
+     * Get uuid for the ModelObject.
+     *
+     * @param obj ModelObject
+     * @param <T> Type of ModelObject
+     * @return Uuid
+     */
+    public static <T extends ModelObject> Uuid getUuid(T obj) {
+        Uuid uuid = null;
+        @SuppressWarnings("unchecked")
+        Class<T> cls = (Class<T>) obj.getClass();
+        try {
+            Method method = cls.getMethod("uuid");
+            uuid = (Uuid) method.invoke(obj);
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            log.error("Exception thrown", e);
+        }
 
         return uuid;
     }
 
     /**
      * Add key-value to the ModelObject as "name-and-value" list.
+     *
      * @param obj ModelObject
-     * @param kvs key-value map
-     * @param <T> type of ModelObject
+     * @param kvs Key-value map
+     * @param <T> Type of ModelObject
      */
     public static <T extends ModelObject> void addNameList(T obj, Map<String, String> kvs) {
 
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
deleted file mode 100644
index dc4fd10..0000000
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.utils.tapi;
-
-import java.util.List;
-import org.onlab.util.XmlString;
-import org.onosproject.config.DynamicConfigService;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-import org.onosproject.yang.model.DataNode;
-import org.onosproject.yang.model.DefaultModelObjectData;
-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;
-
-import static org.onlab.osgi.DefaultServiceDirectory.getService;
-import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
-import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
-import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
-
-import org.onosproject.yang.model.ResourceId;
-import org.slf4j.Logger;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Utility builder class for TAPI modelobject creation with DCS.
- */
-public abstract class TapiInstanceBuilder {
-
-    public static final String ONOS_CP = "onos-cp";
-
-    public static final String DEVICE_ID = "device-id";
-
-    public static final String ODTN_PORT_TYPE = "odtn-port-type";
-
-    private final Logger log = getLogger(getClass());
-
-    private ModelConverter modelConverter;
-    private DynamicConfigService dcs;
-
-    /**
-     * Generate DCS modelObjectData.
-     *
-     * @return ModelObjectId of build target
-     */
-    public abstract ModelObjectId getModelObjectId();
-
-    /**
-     * Get modelObject instance.
-     *
-     * @param <T> build target class
-     * @return ModelObject of build target
-     */
-    public abstract <T extends ModelObject> T getModelObject();
-
-    /**
-     * Get modelObject uuid.
-     *
-     * @return Uuid of build target
-     */
-    public abstract Uuid getUuid();
-
-    /**
-     * Get modelObjectData instance.
-     *
-     * @return ModelObjectData of build target
-     */
-    public ModelObjectData getModelObjectData() {
-        ModelObject obj = getModelObject();
-        ModelObjectId objId = getModelObjectId();
-
-        return DefaultModelObjectData.builder()
-                .addModelObject(obj)
-                .identifier(objId)
-                .build();
-    }
-
-    /**
-     * Add built modelObject to Dcs store.
-     */
-    public void build() {
-        dcs = getService(DynamicConfigService.class);
-        modelConverter = getService(ModelConverter.class);
-        addModelObjectDataToDcs(getModelObjectData());
-    }
-
-    private void addModelObjectDataToDcs(ModelObjectData input) {
-
-        ResourceData rnode = modelConverter.createDataNode(input);
-
-        // for debug
-        CharSequence strNode = toCharSequence(toXmlCompositeStream(toCompositeData(rnode)));
-        log.info("XML:\n{}", XmlString.prettifyXml(strNode));
-
-        addResourceDataToDcs(rnode);
-    }
-
-    private void addResourceDataToDcs(ResourceData input) {
-        addResourceDataToDcs(input, input.resourceId());
-    }
-
-    private void addResourceDataToDcs(ResourceData input, ResourceId rid) {
-        if (input == null || input.dataNodes() == null) {
-            return;
-        }
-        List<DataNode> dataNodes = input.dataNodes();
-        for (DataNode node : dataNodes) {
-            dcs.createNode(rid, node);
-        }
-    }
-
-}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkHandler.java
similarity index 71%
rename from apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkBuilder.java
rename to apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkHandler.java
index 31107ae..2af1cb1 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkBuilder.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkHandler.java
@@ -24,40 +24,39 @@
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
 import org.onosproject.yang.model.ModelObjectId;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
 
 /**
- * Utility builder class for TAPI link creation with DCS.
+ * Utility class to deal with TAPI Link with DCS.
  */
-public final class TapiLinkBuilder extends TapiInstanceBuilder {
+public final class TapiLinkHandler extends TapiObjectHandler<DefaultLink> {
 
     private Uuid topologyUuid;
-    private DefaultLink link = new DefaultLink();
 
-    private TapiLinkBuilder() {
-        setUuid(link);
+    private TapiLinkHandler() {
+        obj = new DefaultLink();
+        setId();
     }
 
-    public static TapiLinkBuilder builder() {
-        return new TapiLinkBuilder();
-    }
-
-    public TapiLinkBuilder setTopologyUuid(Uuid topologyUuid) {
-        this.topologyUuid = topologyUuid;
-        return this;
-    }
-
-    public TapiLinkBuilder addNep(TapiNepRef nepRef) {
-        DefaultNodeEdgePoint nep = new DefaultNodeEdgePoint();
-        nep.topologyId(nepRef.getTopologyId());
-        nep.nodeId(nepRef.getNodeId());
-        nep.ownedNodeEdgePointId(nepRef.getNepId());
-        link.addToNodeEdgePoint(nep);
-        return this;
+    public static TapiLinkHandler create() {
+        return new TapiLinkHandler();
     }
 
     @Override
-    public ModelObjectId getModelObjectId() {
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        checkNotNull(topologyUuid);
 
         TopologyKeys topologyKey = new TopologyKeys();
         topologyKey.uuid(topologyUuid);
@@ -67,15 +66,18 @@
                 .build();
     }
 
-    @Override
-    @SuppressWarnings("unchecked")
-    public DefaultLink getModelObject() {
-        return link;
+    public TapiLinkHandler setTopologyUuid(Uuid topologyUuid) {
+        this.topologyUuid = topologyUuid;
+        return this;
     }
 
-    @Override
-    public Uuid getUuid() {
-        return link.uuid();
+    public TapiLinkHandler addNep(TapiNepRef nepRef) {
+        DefaultNodeEdgePoint nep = new DefaultNodeEdgePoint();
+        nep.topologyId(nepRef.getTopologyId());
+        nep.nodeId(nepRef.getNodeId());
+        nep.ownedNodeEdgePointId(nepRef.getNepId());
+        obj.addToNodeEdgePoint(nep);
+        return this;
     }
 
 }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLocalClassUtil.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLocalClassUtil.java
new file mode 100644
index 0000000..f593d20
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLocalClassUtil.java
@@ -0,0 +1,127 @@
+/*
+ * 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.utils.tapi;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.DefaultName;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
+import org.onosproject.yang.model.ModelObject;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Utility methods dealing with TAPI modelObject which includes local class grouping.
+ * <p>
+ * <p> tapi-common@2018-03-07.yang
+ * grouping local-class {
+ * leaf local-id {
+ * type string;
+ * }
+ * list name {
+ * key 'value-name';
+ * uses name-and-value;
+ * }
+ * }
+ * <p>
+ * grouping name-and-value {
+ * leaf value-name {
+ * type string;
+ * description "The name of the value. The value need not have a name.";
+ * }
+ * leaf value {
+ * type string;
+ * description "The value";
+ * }
+ * description "A scoped name-value pair";
+ * }
+ * </p>
+ */
+public final class TapiLocalClassUtil {
+
+    private static final Logger log = getLogger(TapiLocalClassUtil.class);
+
+    private TapiLocalClassUtil() {
+    }
+
+    /**
+     * Set local-id for the ModelObject.
+     *
+     * @param obj     ModelObject
+     * @param localId LocalId
+     * @param <T>     Type of ModelObject
+     */
+    public static <T extends ModelObject> void setLocalId(T obj, String localId) {
+        @SuppressWarnings("unchecked")
+        Class<T> cls = (Class<T>) obj.getClass();
+        try {
+            Method method = cls.getMethod("localId", String.class);
+            method.invoke(obj, localId);
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            log.error("Exception thrown", e);
+        }
+    }
+
+    /**
+     * Get local-id for the ModelObject.
+     *
+     * @param obj ModelObject
+     * @param <T> Type of ModelObject
+     * @return Local-id
+     */
+    public static <T extends ModelObject> String getLocalId(T obj) {
+        String localId = null;
+        @SuppressWarnings("unchecked")
+        Class<T> cls = (Class<T>) obj.getClass();
+        try {
+            Method method = cls.getMethod("localId");
+            localId = (String) method.invoke(obj);
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            log.error("Exception thrown", e);
+        }
+
+        return localId;
+    }
+
+    /**
+     * Add key-value to the ModelObject as "name-and-value" list.
+     *
+     * @param obj ModelObject
+     * @param kvs Key-value map
+     * @param <T> Type of ModelObject
+     */
+    public static <T extends ModelObject> void addNameList(T obj, Map<String, String> kvs) {
+
+        @SuppressWarnings("unchecked")
+        Class<T> cls = (Class<T>) obj.getClass();
+        try {
+            Method method = cls.getMethod("addToName", Name.class);
+
+            for (Entry<String, String> kv : kvs.entrySet()) {
+                DefaultName prop = new DefaultName();
+                prop.valueName(kv.getKey());
+                prop.value(kv.getValue());
+                method.invoke(obj, prop);
+            }
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            log.error("Exception thrown", e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepBuilder.java
deleted file mode 100644
index 1148511..0000000
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepBuilder.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.utils.tapi;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.onosproject.net.ConnectPoint;
-
-import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.addNameList;
-import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
-
-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.node.DefaultOwnedNodeEdgePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.nodeedgepoint.DefaultMappedServiceInterfacePoint;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.NodeKeys;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
-import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
-import org.onosproject.yang.model.ModelObjectId;
-
-/**
- * Utility builder class for TAPI nep creation with DCS.
- */
-public final class TapiNepBuilder extends TapiInstanceBuilder {
-
-    private Uuid topologyUuid;
-    private Uuid nodeUuid;
-    private DefaultOwnedNodeEdgePoint nep = new DefaultOwnedNodeEdgePoint();
-    private ConnectPoint cp;
-    private Map<String, String> kvs = new HashMap<>();
-
-    private TapiNepBuilder() {
-        setUuid(nep);
-    }
-
-    public static TapiNepBuilder builder() {
-        return new TapiNepBuilder();
-    }
-
-    public TapiNepBuilder setTopologyUuid(Uuid topologyUuid) {
-        this.topologyUuid = topologyUuid;
-        return this;
-    }
-
-    public TapiNepBuilder setNodeUuid(Uuid nodeUuid) {
-        this.nodeUuid = nodeUuid;
-        return this;
-    }
-
-    public TapiNepBuilder setConnectPoint(ConnectPoint cp) {
-        kvs.put(ONOS_CP, cp.toString());
-        addNameList(nep, kvs);
-        return this;
-    }
-
-    public TapiNepBuilder addSip(Uuid sipUuid) {
-        DefaultMappedServiceInterfacePoint mappedSip = new DefaultMappedServiceInterfacePoint();
-        mappedSip.serviceInterfacePointId(sipUuid);
-        nep.addToMappedServiceInterfacePoint(mappedSip);
-        return this;
-    }
-
-    public ConnectPoint getConnectPoint() {
-        return cp;
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public DefaultOwnedNodeEdgePoint getModelObject() {
-        return nep;
-    }
-
-    @Override
-    public Uuid getUuid() {
-        return nep.uuid();
-    }
-
-    @Override
-    public ModelObjectId getModelObjectId() {
-        TopologyKeys topologyKey = new TopologyKeys();
-        topologyKey.uuid(topologyUuid);
-
-        NodeKeys nodeKey = new NodeKeys();
-        nodeKey.uuid(nodeUuid);
-
-        return ModelObjectId.builder()
-                .addChild(DefaultContext.class)
-                .addChild(DefaultTopology.class, topologyKey)
-                .addChild(DefaultNode.class, nodeKey)
-                .build();
-    }
-
-}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepHandler.java
new file mode 100644
index 0000000..2934b3e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepHandler.java
@@ -0,0 +1,131 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onosproject.net.ConnectPoint;
+
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.CONNECTION_ID;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.addNameList;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
+
+import org.onosproject.net.Port;
+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.tapiconnectivity.rev20180307.tapiconnectivity.ceplist.DefaultConnectionEndPoint;
+
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.context.topology.node.ownednodeedgepoint.DefaultAugmentedTapiTopologyOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.DefaultOwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.nodeedgepoint.DefaultMappedServiceInterfacePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.NodeKeys;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.TopologyKeys;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * Utility class to deal with TAPI NEP with DCS.
+ */
+public final class TapiNepHandler extends TapiObjectHandler<DefaultOwnedNodeEdgePoint> {
+
+    private Uuid topologyUuid;
+    private Uuid nodeUuid;
+
+    private ConnectPoint cp;
+    private Map<String, String> kvs = new HashMap<>();
+
+    private TapiNepHandler() {
+        obj = new DefaultOwnedNodeEdgePoint();
+        setId();
+    }
+
+    public static TapiNepHandler create() {
+        return new TapiNepHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        TopologyKeys topologyKey = new TopologyKeys();
+        topologyKey.uuid(topologyUuid);
+
+        NodeKeys nodeKey = new NodeKeys();
+        nodeKey.uuid(nodeUuid);
+
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultTopology.class, topologyKey)
+                .addChild(DefaultNode.class, nodeKey)
+                .build();
+    }
+
+    public TapiNepHandler setTopologyUuid(Uuid topologyUuid) {
+        this.topologyUuid = topologyUuid;
+        return this;
+    }
+
+    public TapiNepHandler setNodeUuid(Uuid nodeUuid) {
+        this.nodeUuid = nodeUuid;
+        return this;
+    }
+
+    public TapiNepHandler setPort(Port port) {
+        ConnectPoint cp = new ConnectPoint(port.element().id(), port.number());
+        kvs.put(ODTN_PORT_TYPE, port.annotations().value(ODTN_PORT_TYPE));
+        kvs.put(CONNECTION_ID, port.annotations().value(CONNECTION_ID));
+        addNameList(obj, kvs);
+        return setConnectPoint(cp);
+    }
+
+    public TapiNepHandler setConnectPoint(ConnectPoint cp) {
+        kvs.put(ONOS_CP, cp.toString());
+        addNameList(obj, kvs);
+        return this;
+    }
+
+    public TapiNepHandler addSip(Uuid sipUuid) {
+        DefaultMappedServiceInterfacePoint mappedSip = new DefaultMappedServiceInterfacePoint();
+        mappedSip.serviceInterfacePointId(sipUuid);
+        obj.addToMappedServiceInterfacePoint(mappedSip);
+        return this;
+    }
+
+    public TapiNepHandler addCep(DefaultConnectionEndPoint cep) {
+        DefaultAugmentedTapiTopologyOwnedNodeEdgePoint augmentNep =
+                new DefaultAugmentedTapiTopologyOwnedNodeEdgePoint();
+        augmentNep.addToConnectionEndPoint(cep);
+        obj.addAugmentation(augmentNep);
+        return this;
+    }
+
+    public ConnectPoint getConnectPoint() {
+        return cp;
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepPair.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepPair.java
new file mode 100644
index 0000000..a442586
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepPair.java
@@ -0,0 +1,86 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.Objects;
+import java.util.stream.Stream;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * TAPI NepRef pair class for representation of endpoints of single connection.
+ */
+public class TapiNepPair {
+
+    private TapiNepRef left;
+    private TapiNepRef right;
+
+    public TapiNepPair() {
+    }
+
+    public static TapiNepPair create(TapiNepRef left, TapiNepRef right) {
+        TapiNepPair self = new TapiNepPair();
+        self.left = left;
+        self.right = right;
+        return self;
+    }
+
+    public TapiNepRef left() {
+        return left;
+    }
+
+    public TapiNepRef right() {
+        return right;
+    }
+
+    public TapiNepPair invert() {
+        return TapiNepPair.create(right, left);
+    }
+
+    public boolean isSameNode() {
+        return left.getTopologyId().equals(right.getTopologyId()) && left.getNodeId().equals(right.getNodeId());
+    }
+
+    public Stream<TapiNepRef> stream() {
+        return Stream.of(left, right);
+    }
+
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("left", left)
+                .add("right", right)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof TapiNepPair)) {
+            return false;
+        }
+        TapiNepPair that = (TapiNepPair) o;
+        return Objects.equals(left, that.left) &&
+                Objects.equals(right, that.right);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(left, right);
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java
index d837362..af4d299 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java
@@ -16,21 +16,48 @@
 
 package org.onosproject.odtn.utils.tapi;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import org.onosproject.net.ConnectPoint;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.Objects.hash;
+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.onosproject.net.DeviceId;
+import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * TAPI Nep reference class.
+ *
+ * TAPI reference class should be used in ODTN ServiceApplication
+ * in order to make independent ServiceApplication implementation from DCS.
+ */
 public class TapiNepRef {
 
+    protected final Logger log = getLogger(getClass());
+
     private final UUID topologyId;
     private final UUID nodeId;
     private final UUID nepId;
+
+    // Annotations to be used for reference of related TAPI objects.
     private UUID sipId = null;
+    private List<UUID> cepIds = Collections.emptyList();
+
+    // Annotations to be used for OpenConfig configuration.
     private ConnectPoint cp = null;
+    private OdtnDeviceDescriptionDiscovery.OdtnPortType portType = null;
+    private String connectionId = null;
 
     TapiNepRef(String topologyId, String nodeId, String nepId) {
         this.topologyId = UUID.fromString(topologyId);
@@ -60,27 +87,89 @@
                 .orElse(null);
     }
 
+    public List<String> getCepIds() {
+        return cepIds.stream().map(UUID::toString).collect(Collectors.toList());
+    }
+
+    public OdtnDeviceDescriptionDiscovery.OdtnPortType getPortType() {
+        return portType;
+    }
+
     public ConnectPoint getConnectPoint() {
         return cp;
     }
 
+    public String getConnectionId() {
+        return connectionId;
+    }
+
+
     public TapiNepRef setSipId(String sipId) {
         this.sipId = UUID.fromString(sipId);
         return this;
     }
 
+    public TapiNepRef setCepIds(List<String> cepIds) {
+        this.cepIds = cepIds.stream().map(UUID::fromString).collect(Collectors.toList());
+        return this;
+    }
+
+    public TapiNepRef setPortType(String portType) {
+        this.portType = Optional.ofNullable(portType)
+                .map(OdtnDeviceDescriptionDiscovery.OdtnPortType::fromValue)
+                .orElse(null);
+        return this;
+    }
+
     public TapiNepRef setConnectPoint(ConnectPoint cp) {
         this.cp = cp;
         return this;
     }
 
+    public TapiNepRef setConnectionId(String connectionId) {
+        this.connectionId = connectionId;
+        return this;
+    }
+
+    /**
+     * Check if this Nep matches input filter condition.
+     *
+     * @param key Filter key
+     * @param value Filter value
+     * @return If match or not
+     */
+    public boolean is(String key, String value) {
+        checkNotNull(key);
+        checkNotNull(value);
+        switch (key) {
+            case DEVICE_ID:
+                return value.equals(
+                        Optional.ofNullable(cp)
+                                .map(ConnectPoint::deviceId)
+                                .map(DeviceId::toString)
+                                .orElse(null));
+            case ODTN_PORT_TYPE:
+                return value.equals(
+                        Optional.ofNullable(portType)
+                                .map(OdtnDeviceDescriptionDiscovery.OdtnPortType::value)
+                                .orElse(null));
+            case CONNECTION_ID:
+                return value.equals(connectionId);
+            default:
+                log.warn("Unknown key: {}", key);
+                return true;
+        }
+    }
+
     public String toString() {
         return toStringHelper(getClass())
-//                .add("topologyId", topologyId)
+                .add("topologyId", topologyId)
                 .add("nodeId", nodeId)
                 .add("nepId", nepId)
                 .add("sipId", sipId)
                 .add("connectPoint", cp)
+                .add("portType", portType)
+                .add("connectionId", connectionId)
                 .toString();
     }
 
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeHandler.java
similarity index 69%
rename from apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeBuilder.java
rename to apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeHandler.java
index 21e812c..1d897ad 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeBuilder.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeHandler.java
@@ -18,7 +18,10 @@
 
 import java.util.HashMap;
 import java.util.Map;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.addNameList;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
 
 import org.onosproject.net.DeviceId;
@@ -31,51 +34,35 @@
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
- * Utility builder class for TAPI node creation with DCS.
+ * Utility class to deal with TAPI Node with DCS.
  */
-public final class TapiNodeBuilder extends TapiInstanceBuilder {
+public final class TapiNodeHandler extends TapiObjectHandler<DefaultNode> {
 
     private Uuid topologyUuid;
-    private DefaultNode node = new DefaultNode();
 
-    private TapiNodeBuilder() {
-        setUuid(node);
+    private TapiNodeHandler() {
+        obj = new DefaultNode();
+        setId();
     }
 
-    public static TapiNodeBuilder builder() {
-        return new TapiNodeBuilder();
-    }
-
-    public TapiNodeBuilder setTopologyUuid(Uuid topologyUuid) {
-        this.topologyUuid = topologyUuid;
-        return this;
-    }
-
-    public TapiNodeBuilder addNep(OwnedNodeEdgePoint nep) {
-        node.addToOwnedNodeEdgePoint(nep);
-        return this;
-    }
-
-    public TapiNodeBuilder setDeviceId(DeviceId deviceId) {
-        Map<String, String> kvs = new HashMap<>();
-        kvs.put(DEVICE_ID, deviceId.toString());
-        addNameList(node, kvs);
-        return this;
+    public static TapiNodeHandler create() {
+        return new TapiNodeHandler();
     }
 
     @Override
-    @SuppressWarnings("unchecked")
-    public DefaultNode getModelObject() {
-        return node;
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
     }
 
     @Override
-    public Uuid getUuid() {
-        return node.uuid();
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
     }
 
     @Override
-    public ModelObjectId getModelObjectId() {
+    public ModelObjectId getParentModelObjectId() {
+        checkNotNull(topologyUuid);
+
         TopologyKeys topologyKey = new TopologyKeys();
         topologyKey.uuid(topologyUuid);
         return ModelObjectId.builder()
@@ -84,4 +71,21 @@
                 .build();
     }
 
+    public TapiNodeHandler setTopologyUuid(Uuid topologyUuid) {
+        this.topologyUuid = topologyUuid;
+        return this;
+    }
+
+    public TapiNodeHandler addNep(OwnedNodeEdgePoint nep) {
+        obj.addToOwnedNodeEdgePoint(nep);
+        return this;
+    }
+
+    public TapiNodeHandler setDeviceId(DeviceId deviceId) {
+        Map<String, String> kvs = new HashMap<>();
+        kvs.put(DEVICE_ID, deviceId.toString());
+        addNameList(obj, kvs);
+        return this;
+    }
+
 }
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java
index ae2a968..8db2005 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java
@@ -21,10 +21,23 @@
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Objects.equal;
+import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.Objects.hash;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
 
+import org.slf4j.Logger;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * TAPI Node reference class.
+ *
+ * TAPI reference class should be used in ODTN ServiceApplication
+ * in order to make independent ServiceApplication implementation from DCS.
+ */
 public class TapiNodeRef {
 
+    protected final Logger log = getLogger(getClass());
+
     private final UUID topologyId;
     private final UUID nodeId;
     private DeviceId deviceId;
@@ -51,9 +64,30 @@
         return this;
     }
 
+    /**
+     * Check if this Node matches input filter condition.
+     *
+     * @param key Filter key
+     * @param value Filter value
+     * @return If match or not
+     */
+    public boolean is(String key, String value) {
+        checkNotNull(value);
+        switch (key) {
+            case DEVICE_ID:
+                if (deviceId == null) {
+                    return false;
+                }
+                return value.equals(deviceId.toString());
+            default:
+                log.warn("Unknown key: {}", key);
+                return true;
+        }
+    }
+
     public String toString() {
         return toStringHelper(getClass())
-//                .add("topologyId", topologyId)
+                .add("topologyId", topologyId)
                 .add("nodeId", nodeId)
                 .add("deviceId", deviceId)
                 .toString();
@@ -77,4 +111,5 @@
         return hash(topologyId, nodeId);
     }
 
-}
+
+}
\ No newline at end of file
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiObjectHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiObjectHandler.java
new file mode 100644
index 0000000..05cbc57
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiObjectHandler.java
@@ -0,0 +1,258 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.List;
+import java.util.UUID;
+import org.apache.commons.lang.NotImplementedException;
+import org.onlab.util.XmlString;
+import org.onosproject.config.DynamicConfigService;
+import org.onosproject.config.Filter;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+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;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
+import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
+import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
+
+import org.onosproject.yang.model.ResourceId;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Utility abstract class to deal with TAPI ModelObject with DCS.
+ *
+ * @param <T> modelObject to be dealt with
+ */
+public abstract class TapiObjectHandler<T extends ModelObject> {
+
+    public static final String ONOS_CP = "onos-cp";
+    public static final String DEVICE_ID = "device-id";
+    public static final String ODTN_PORT_TYPE = "odtn-port-type";
+
+    protected final Logger log = getLogger(getClass());
+
+    protected ModelConverter modelConverter;
+    protected DynamicConfigService dcs;
+
+    protected T obj;
+
+    /**
+     * Get modelObject uuid.
+     *
+     * @return Uuid
+     */
+    public Uuid getId() {
+        return getIdDetail();
+    }
+
+    /**
+     * Generate and set modelObject uuid.
+     */
+    public void setId() {
+        Uuid uuid = Uuid.of(UUID.randomUUID().toString());
+        setIdDetail(uuid);
+    }
+
+    /**
+     * Set modelObject uuid.
+     *
+     * @param uuid Uuid
+     */
+    public void setId(Uuid uuid) {
+        setIdDetail(uuid);
+    }
+
+    /**
+     * Get modelObject uuid, to be implemented in sub classes.
+     *
+     * @return Uuid
+     */
+    protected abstract Uuid getIdDetail();
+
+    /**
+     * Set modelObject uuid, to be implemented in sub classes.
+     *
+     * @param uuid Uuid
+     */
+    protected abstract void setIdDetail(Uuid uuid);
+
+    /**
+     * Generate DCS modelObjectId for parent node.
+     *
+     * @return ModelObjectId of parent node
+     */
+    public abstract ModelObjectId getParentModelObjectId();
+
+    /**
+     * Get modelObject instance.
+     *
+     * @return ModelObject of target node
+     */
+    public T getModelObject() {
+        return obj;
+    }
+
+    /**
+     * Set modelObject instance.
+     *
+     * @param newObj ModelObject to be set
+     */
+    public void setModelObject(T newObj) {
+        obj = newObj;
+    }
+
+    /**
+     * Get modelObjectData instance.
+     *
+     * @return ModelObjectData of target node
+     */
+    public ModelObjectData getModelObjectData() {
+        ModelObject obj = getModelObject();
+        ModelObjectId objId = getParentModelObjectId();
+
+        return DefaultModelObjectData.builder()
+                .addModelObject(obj)
+                .identifier(objId)
+                .build();
+    }
+
+    /**
+     * Get modelObjectData instance for child node.
+     * <p>
+     * This modelObjectData is needed for read / update / delete operation
+     * to extract ResourceId of this modelObject itself.
+     * It's just workaround, fix in DCS needed.
+     *
+     * @return ModelObjectData of build target
+     */
+    public ModelObjectData getChildModelObjectData() {
+        throw new NotImplementedException();
+    }
+
+    /**
+     * Get DataNode instance.
+     *
+     * @return DataNode of target node
+     */
+    public DataNode getDataNode() {
+        ResourceData rData = toResourceData(getModelObjectData());
+        if (rData.dataNodes().size() > 1) {
+            throw new RuntimeException("Multiple dataNode found.");
+        }
+        return rData.dataNodes().get(0);
+    }
+
+    /**
+     * Read modelObject from Dcs store.
+     *
+     * @return ModelObject
+     */
+    public T read() {
+        return readOnDcs();
+    }
+
+    /**
+     * Add modelObject to Dcs store.
+     */
+    public void add() {
+        createOnDcs();
+    }
+
+    /**
+     * Delete modelObject from Dcs store.
+     */
+    public void remove() {
+        deleteOnDcs();
+    }
+
+    private void dcsSetup() {
+        dcs = getService(DynamicConfigService.class);
+        modelConverter = getService(ModelConverter.class);
+    }
+
+    @SuppressWarnings("unchecked")
+    private T readOnDcs() {
+        dcsSetup();
+        ResourceData rData1 = toResourceData(getChildModelObjectData());
+        ResourceData rData2 = toResourceData(getModelObjectData());
+        DataNode rNode = dcs.readNode(rData1.resourceId(), Filter.builder().build());
+        obj = toModelObject(rNode, rData2.resourceId());
+        return obj;
+    }
+
+    private void createOnDcs() {
+        dcsSetup();
+        ResourceData rData = toResourceData(getModelObjectData());
+        addResourceDataToDcs(rData, rData.resourceId());
+    }
+
+    private void deleteOnDcs() {
+        dcsSetup();
+        ResourceData rData = toResourceData(getChildModelObjectData());
+        dcs.deleteNode(rData.resourceId());
+    }
+
+    private void addResourceDataToDcs(ResourceData input, ResourceId rid) {
+        if (input == null || input.dataNodes() == null) {
+            return;
+        }
+        List<DataNode> dataNodes = input.dataNodes();
+        for (DataNode node : dataNodes) {
+            dcs.createNode(rid, node);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    protected T toModelObject(DataNode rNode, ResourceId rId) {
+        dcsSetup();
+        ResourceData rData = toResourceData(rNode, rId);
+        ModelObjectData modelObjectData = modelConverter.createModel(rData);
+        if (modelObjectData.modelObjects().size() > 1) {
+            throw new RuntimeException("Multiple modelObject found.");
+        }
+        return (T) modelObjectData.modelObjects().get(0);
+    }
+
+    private ResourceData toResourceData(DataNode rNode, ResourceId rId) {
+        return DefaultResourceData.builder()
+                .addDataNode(rNode)
+                .resourceId(rId)
+                .build();
+    }
+
+    private ResourceData toResourceData(ModelObjectData data) {
+        dcsSetup();
+        ResourceData rData = modelConverter.createDataNode(data);
+
+        // for debug
+        CharSequence strNode = toCharSequence(toXmlCompositeStream(toCompositeData(rData)));
+        log.info("XML:\n{}", XmlString.prettifyXml(strNode));
+
+        return rData;
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRouteHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRouteHandler.java
new file mode 100644
index 0000000..7482979
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRouteHandler.java
@@ -0,0 +1,95 @@
+/*
+ * 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.utils.tapi;
+
+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.tapiconnectivity.rev20180307.tapiconnectivity.connection.DefaultRoute;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.ConnectionKeys;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivitycontext.DefaultConnection;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.route.ConnectionEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.route.DefaultConnectionEndPoint;
+import org.onosproject.yang.model.ModelObjectId;
+
+import static org.onosproject.odtn.utils.tapi.TapiLocalClassUtil.getLocalId;
+import static org.onosproject.odtn.utils.tapi.TapiLocalClassUtil.setLocalId;
+
+/**
+ * Utility class to deal with TAPI Route with DCS.
+ */
+public final class TapiRouteHandler extends TapiObjectHandler<DefaultRoute> {
+
+    private Uuid connectionId;
+
+    private TapiRouteHandler() {
+        obj = new DefaultRoute();
+        setId();
+    }
+
+    public static TapiRouteHandler create() {
+        return new TapiRouteHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return Uuid.fromString(getLocalId(obj));
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setLocalId(obj, uuid.toString());
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        ConnectionKeys connectionKeys = new ConnectionKeys();
+        connectionKeys.uuid(connectionId);
+
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultConnection.class, connectionKeys)
+                .build();
+    }
+
+    public TapiRouteHandler addCep(TapiCepRef cepRef) {
+        DefaultConnectionEndPoint cep = new DefaultConnectionEndPoint();
+        cep.topologyId(cepRef.getTopologyId());
+        cep.nodeId(cepRef.getNodeId());
+        cep.ownedNodeEdgePointId(cepRef.getNepId());
+        cep.connectionEndPointId(cepRef.getCepId());
+
+        obj.addToConnectionEndPoint(cep);
+        return this;
+    }
+
+    public TapiCepRef getRouteStart() {
+        ConnectionEndPoint cep = obj.connectionEndPoint().get(0);
+        return TapiCepRef.create(cep.topologyId().toString(), cep.nodeId().toString(),
+                cep.ownedNodeEdgePointId().toString(), cep.connectionEndPointId().toString());
+    }
+
+    public TapiCepRef getRouteEnd() {
+        ConnectionEndPoint cep = obj.connectionEndPoint().get(obj.connectionEndPoint().size() - 1);
+        return TapiCepRef.create(cep.topologyId().toString(), cep.nodeId().toString(),
+                cep.ownedNodeEdgePointId().toString(), cep.connectionEndPointId().toString());
+    }
+
+    public TapiRouteHandler setConnectionId(Uuid connectionId) {
+        this.connectionId = connectionId;
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcInputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcInputHandler.java
new file mode 100644
index 0000000..9112f34
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcInputHandler.java
@@ -0,0 +1,66 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.RpcInput;
+
+/**
+ * Utility abstract class to deal with TAPI RPC input with DCS.
+ *
+ * @param <T> RPCInput modelObject to be dealt with
+ */
+public abstract class TapiRpcInputHandler<T extends ModelObject> extends TapiObjectHandler<T> {
+
+    // Uuid getter is not needed for RPC input
+    @Override
+    protected Uuid getIdDetail() {
+        return null;
+    }
+
+    // Uuid getter is not needed for RPC input
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+    }
+
+    // Root modelObjectId must be used
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return ModelObjectId.builder().build();
+    }
+
+    // Cannot set InputRpc modelObject into DCS
+    @Override
+    public final void add() {
+    }
+
+    // Cannot remove InputRpc modelObject into DCS
+    @Override
+    public final void remove() {
+    }
+
+    /**
+     * Set RPCInput modelObject.
+     *
+     * @param input Tapi RpcInput modelObject
+     */
+    public void setRpcInput(RpcInput input) {
+        obj = toModelObject(input.data(), input.id());
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcOutputHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcOutputHandler.java
new file mode 100644
index 0000000..aa2c890
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiRpcOutputHandler.java
@@ -0,0 +1,58 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * Utility abstract class to deal with TAPI RPC output with DCS.
+ *
+ * @param <T> RpcOutput modelObject to be dealt with
+ */
+public abstract class TapiRpcOutputHandler<T extends ModelObject> extends TapiObjectHandler<T> {
+
+    // Uuid getter is not needed for RPC output
+    @Override
+    protected Uuid getIdDetail() {
+        return null;
+    }
+
+    // Uuid setter is not needed for RPC output
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+    }
+
+    // Root modelObjectId must be used
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return ModelObjectId.builder().build();
+    }
+
+
+    // Cannot add OutputRpc modelObject into DCS.
+    @Override
+    public final void add() {
+    }
+
+    // Cannot delete OutputRpc modelObject into DCS.
+    @Override
+    public final void remove() {
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSepHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSepHandler.java
new file mode 100644
index 0000000..35e01e0
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSepHandler.java
@@ -0,0 +1,62 @@
+/*
+ * 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.utils.tapi;
+
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityservice.DefaultEndPoint;
+import org.onosproject.yang.gen.v1.tapiconnectivity.rev20180307.tapiconnectivity.connectivityserviceendpoint.DefaultServiceInterfacePoint;
+import org.onosproject.yang.model.ModelObjectId;
+
+import static org.onosproject.odtn.utils.tapi.TapiLocalClassUtil.getLocalId;
+import static org.onosproject.odtn.utils.tapi.TapiLocalClassUtil.setLocalId;
+
+/**
+ * Utility class to deal with TAPI SEP with DCS.
+ */
+public final class TapiSepHandler extends TapiObjectHandler<DefaultEndPoint> {
+
+    private TapiSepHandler() {
+        obj = new DefaultEndPoint();
+        setId();
+    }
+
+    public static TapiSepHandler create() {
+        return new TapiSepHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return Uuid.fromString(getLocalId(obj));
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setLocalId(obj, uuid.toString());
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return null;
+    }
+
+    public TapiSepHandler setSip(String sipId) {
+        DefaultServiceInterfacePoint sip = new DefaultServiceInterfacePoint();
+        sip.serviceInterfacePointId(sipId);
+        obj.serviceInterfacePoint(sip);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipBuilder.java
deleted file mode 100644
index 5e24b33..0000000
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipBuilder.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * 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.utils.tapi;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.onosproject.net.ConnectPoint;
-
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.LayerProtocolName;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
-
-import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.addNameList;
-import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
-import static org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.layerprotocolname.LayerProtocolNameEnum.DSR;
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.tapicontext.DefaultServiceInterfacePoint;
-import org.onosproject.yang.model.ModelObjectId;
-
-/**
- * Utility builder class for TAPI sip creation with DCS.
- */
-public final class TapiSipBuilder extends TapiInstanceBuilder {
-
-    private DefaultServiceInterfacePoint sip = new DefaultServiceInterfacePoint();
-
-    private TapiSipBuilder() {
-        setUuid(sip);
-    }
-
-    public static TapiSipBuilder builder() {
-        return new TapiSipBuilder();
-    }
-
-    /**
-     * Check this builder dealing with port for SIP or not.
-     * @param cp onos connectPoint
-     * @return Is this builder for SIP or not
-     */
-    public static boolean isSip(ConnectPoint cp) {
-        // FIXME modify this method to appropriate way
-        return cp.toString().contains("TRANSCEIVER");
-    }
-
-    public TapiSipBuilder setConnectPoint(ConnectPoint cp) {
-        if (!isSip(cp)) {
-            throw new IllegalStateException("Not allowed to use this port as SIP.");
-        }
-        Map<String, String> kvs = new HashMap<>();
-        kvs.put(ONOS_CP, cp.toString());
-        addNameList(sip, kvs);
-        sip.addToLayerProtocolName(LayerProtocolName.of(DSR));
-        return this;
-    }
-
-    @Override
-    public ModelObjectId getModelObjectId() {
-        return ModelObjectId.builder()
-                .addChild(DefaultContext.class)
-                .build();
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public DefaultServiceInterfacePoint getModelObject() {
-        return sip;
-    }
-
-    @Override
-    public Uuid getUuid() {
-        return sip.uuid();
-    }
-}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipHandler.java
new file mode 100644
index 0000000..34b3896
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipHandler.java
@@ -0,0 +1,97 @@
+/*
+ * 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.utils.tapi;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onosproject.net.ConnectPoint;
+
+import org.onosproject.net.Port;
+import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.LayerProtocolName;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.PORT_TYPE;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.addNameList;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
+import static org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.layerprotocolname.LayerProtocolNameEnum.DSR;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.tapicontext.DefaultServiceInterfacePoint;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * Utility class to deal with TAPI SIP with DCS.
+ */
+public final class TapiSipHandler extends TapiObjectHandler<DefaultServiceInterfacePoint> {
+
+    private TapiSipHandler() {
+        obj = new DefaultServiceInterfacePoint();
+        setId();
+    }
+
+    public static TapiSipHandler create() {
+        return new TapiSipHandler();
+    }
+
+    @Override
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
+    }
+
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
+        return ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .build();
+    }
+
+    /**
+     * Check this handler dealing with port for SIP or not.
+     * @param port onos port object
+     * @return is this handler for SIP or not
+     */
+    public static boolean isSip(Port port) {
+        // FIXME modify this method to appropriate way
+        String portType = port.annotations().value(PORT_TYPE);
+        OdtnDeviceDescriptionDiscovery.OdtnPortType odtnPortType
+                = OdtnDeviceDescriptionDiscovery.OdtnPortType.fromValue(portType);
+        return odtnPortType.value().equals(OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT.value());
+    }
+
+    public TapiSipHandler setPort(Port port) {
+        if (!isSip(port)) {
+            throw new IllegalStateException("Not allowed to use this port as SIP.");
+        }
+        ConnectPoint cp = new ConnectPoint(port.element().id(), port.number());
+        return setConnectPoint(cp);
+    }
+
+    public TapiSipHandler setConnectPoint(ConnectPoint cp) {
+        Map<String, String> kvs = new HashMap<>();
+        kvs.put(ONOS_CP, cp.toString());
+        addNameList(obj, kvs);
+        obj.addToLayerProtocolName(LayerProtocolName.of(DSR));
+        return this;
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyHandler.java
similarity index 67%
rename from apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyBuilder.java
rename to apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyHandler.java
index 4c96133..2d81e80 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyBuilder.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyHandler.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.odtn.utils.tapi;
 
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.getUuid;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
 
 import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.DefaultContext;
@@ -25,40 +26,34 @@
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
- * Utility builder class for TAPI topology creation with DCS.
+ * Utility class to deal with TAPI Topology with DCS.
  */
-public final class TapiTopologyBuilder extends TapiInstanceBuilder {
+public final class TapiTopologyHandler extends TapiObjectHandler<DefaultTopology> {
 
-    private DefaultTopology topology;
-
-    private TapiTopologyBuilder(DefaultTopology topology) {
-        this.topology = topology;
-        setUuid(this.topology);
+    private TapiTopologyHandler() {
+        obj = new DefaultTopology();
+        setId();
     }
 
-    public static TapiTopologyBuilder builder(DefaultTopology topology) {
-        return new TapiTopologyBuilder(topology);
+    public static TapiTopologyHandler create() {
+        return new TapiTopologyHandler();
     }
 
-
     @Override
-    public ModelObjectId getModelObjectId() {
+    protected Uuid getIdDetail() {
+        return getUuid(obj);
+    }
 
+    @Override
+    protected void setIdDetail(Uuid uuid) {
+        setUuid(obj, uuid);
+    }
+
+    @Override
+    public ModelObjectId getParentModelObjectId() {
         DefaultAugmentedTapiCommonContext topologyContext = new DefaultAugmentedTapiCommonContext();
-        topologyContext.addToTopology(topology);
+        topologyContext.addToTopology(obj);
 
         return ModelObjectId.builder().addChild(DefaultContext.class).build();
     }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public DefaultTopology getModelObject() {
-        return topology;
-    }
-
-    @Override
-    public Uuid getUuid() {
-        return topology.uuid();
-    }
-
 }
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;
diff --git a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java
index b259235..e616b21 100644
--- a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java
+++ b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DcsBasedTapiDataProducerTest.java
@@ -27,12 +27,12 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.odtn.utils.tapi.DcsBasedTapiNepRef;
 import org.onosproject.odtn.utils.tapi.DcsBasedTapiNodeRef;
-import org.onosproject.odtn.utils.tapi.TapiNepBuilder;
+import org.onosproject.odtn.utils.tapi.TapiNepHandler;
 import org.onosproject.odtn.utils.tapi.TapiNepRef;
-import org.onosproject.odtn.utils.tapi.TapiNodeBuilder;
+import org.onosproject.odtn.utils.tapi.TapiNodeHandler;
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
-import org.onosproject.odtn.utils.tapi.TapiSipBuilder;
-import org.onosproject.odtn.utils.tapi.TapiTopologyBuilder;
+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.tapicontext.DefaultServiceInterfacePoint;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
@@ -73,49 +73,49 @@
 
         context = new DefaultContext();
 
-        topology = TapiTopologyBuilder.builder(new DefaultTopology()).getModelObject();
+        topology = TapiTopologyHandler.create().getModelObject();
         DefaultAugmentedTapiCommonContext topologyContext = new DefaultAugmentedTapiCommonContext();
         topologyContext.addToTopology(topology);
         Augmentable augmentableContext = context;
         augmentableContext.addAugmentation(topologyContext);
 
-        node1 = TapiNodeBuilder.builder()
+        node1 = TapiNodeHandler.create()
                 .setTopologyUuid(topology.uuid())
                 .setDeviceId(did1)
                 .getModelObject();
 
-        node2 = TapiNodeBuilder.builder()
+        node2 = TapiNodeHandler.create()
                 .setTopologyUuid(topology.uuid())
                 .setDeviceId(did2)
                 .getModelObject();
 
-        sip11 = TapiSipBuilder.builder()
+        sip11 = TapiSipHandler.create()
                 .setConnectPoint(cp11).getModelObject();
 
-        sip21 = TapiSipBuilder.builder()
+        sip21 = TapiSipHandler.create()
                 .setConnectPoint(cp21).getModelObject();
 
-        nep11 = TapiNepBuilder.builder()
+        nep11 = TapiNepHandler.create()
                 .setTopologyUuid(topology.uuid())
                 .setNodeUuid(node1.uuid())
                 .setConnectPoint(cp11)
                 .addSip(sip11.uuid())
                 .getModelObject();
 
-        nep12 = TapiNepBuilder.builder()
+        nep12 = TapiNepHandler.create()
                 .setTopologyUuid(topology.uuid())
                 .setNodeUuid(node1.uuid())
                 .setConnectPoint(cp12)
                 .getModelObject();
 
-        nep21 = TapiNepBuilder.builder()
+        nep21 = TapiNepHandler.create()
                 .setTopologyUuid(topology.uuid())
                 .setNodeUuid(node2.uuid())
                 .setConnectPoint(cp21)
                 .addSip(sip21.uuid())
                 .getModelObject();
 
-        nep22 = TapiNepBuilder.builder()
+        nep22 = TapiNepHandler.create()
                 .setTopologyUuid(topology.uuid())
                 .setNodeUuid(node2.uuid())
                 .setConnectPoint(cp22)
diff --git a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java
index 9696f50..5fcad14 100644
--- a/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java
+++ b/apps/odtn/service/src/test/java/org/onosproject/odtn/internal/DefaultTapiResolverTest.java
@@ -16,6 +16,10 @@
 
 package org.onosproject.odtn.internal;
 
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.NoSuchElementException;
 import org.easymock.EasyMock;
 import org.junit.Before;
@@ -23,19 +27,22 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
+import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
 import org.onosproject.odtn.utils.tapi.TapiNepRef;
 import org.onosproject.odtn.utils.tapi.TapiNodeRef;
 
 import static org.easymock.EasyMock.replay;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.*;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.DEVICE_ID;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
 
 public class DefaultTapiResolverTest {
 
     private DefaultTapiResolver tapiResolver;
 
-    private TapiNodeRef nodeRef;
-    private TapiNepRef nepRef;
+    private TapiNodeRef nodeRef, nodeRefNullAttr;
+    private TapiNepRef nepRef, nepRefNullAttr;
     private DeviceId deviceId;
     private ConnectPoint cp;
     private String sipId;
@@ -44,6 +51,7 @@
     private Integer dummyPort;
     private ConnectPoint dummyCp;
     private String dummySipId;
+    private String portType;
 
     private TapiDataProducer mockTapiDataProducer;
 
@@ -56,11 +64,19 @@
                 "59e2ac46-3975-44b4-b84f-8fab28222a39",
                 "6638e8e6-ac17-40d9-86e4-7c1febab6f1a",
                 "cd673055-e2b2-4f67-88c8-adfae96385bc");
+        nodeRefNullAttr = TapiNodeRef.create(
+                "59e2ac46-3975-44b4-b84f-8fab28222a39",
+                "6638e8e6-ac17-40d9-86e4-7c1febab6f1a");
+        nepRefNullAttr = TapiNepRef.create(
+                "69e2ac46-3975-44b4-b84f-8fab28222a39",
+                "7638e8e6-ac17-40d9-86e4-7c1febab6f1a",
+                "dd673055-e2b2-4f67-88c8-adfae96385bc");
         deviceId = DeviceId.deviceId("netconf:172.24.3.5:11011");
         cp = new ConnectPoint(deviceId, PortNumber.portNumber("42"));
         sipId = "01c39723-7c0d-4754-8d64-fd9ff412404c";
+        portType = OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT.value();
         nodeRef.setDeviceId(deviceId);
-        nepRef.setConnectPoint(cp).setSipId(sipId);
+        nepRef.setConnectPoint(cp).setSipId(sipId).setPortType(portType);
 
         dummyDeviceId = DeviceId.deviceId("dummy");
         dummyPort = 4;
@@ -83,13 +99,34 @@
     }
 
     @Test
-    public void testGetNepRefWithConnectPoint() {
+    public void testGetNepRefByConnectPoint() {
         tapiResolver.addNepRef(nepRef);
         assertThat(nepRef, is(tapiResolver.getNepRef(cp)));
     }
 
     @Test
-    public void testGetNepRefWithSipId() {
+    public void testGetNepRefBySipId() {
+        tapiResolver.addNepRef(nepRef);
+        assertThat(nepRef, is(tapiResolver.getNepRef(sipId)));
+    }
+
+    @Test
+    public void testGetNodeRefWithNullAttrObj() {
+        tapiResolver.addNodeRef(nodeRefNullAttr);
+        tapiResolver.addNodeRef(nodeRef);
+        assertThat(nodeRef, is(tapiResolver.getNodeRef(deviceId)));
+    }
+
+    @Test
+    public void testGetNepRefByConnectPointWithNullAttrObj() {
+        tapiResolver.addNepRef(nepRefNullAttr);
+        tapiResolver.addNepRef(nepRef);
+        assertThat(nepRef, is(tapiResolver.getNepRef(cp)));
+    }
+
+    @Test
+    public void testGetNepRefBySipIdWithNullAttrObj() {
+        tapiResolver.addNepRef(nepRefNullAttr);
         tapiResolver.addNepRef(nepRef);
         assertThat(nepRef, is(tapiResolver.getNepRef(sipId)));
     }
@@ -106,25 +143,53 @@
 
     @Test(expected = NoSuchElementException.class)
     public void testGetNepRefWithSipIdWhenEmpty() {
-        tapiResolver.getNepRef(cp);
+        tapiResolver.getNepRef(sipId);
     }
 
     @Test(expected = NoSuchElementException.class)
     public void testGetNodeRefNotExist() {
+        tapiResolver.addNodeRef(nodeRefNullAttr);
         tapiResolver.addNodeRef(nodeRef);
         tapiResolver.getNodeRef(dummyDeviceId);
     }
 
     @Test(expected = NoSuchElementException.class)
     public void testGetNepRefWithConnectPointNotExist() {
+        tapiResolver.addNepRef(nepRefNullAttr);
         tapiResolver.addNepRef(nepRef);
         tapiResolver.getNepRef(dummyCp);
     }
 
     @Test(expected = NoSuchElementException.class)
     public void testGetNepRefWithSipIdNotExist() {
+        tapiResolver.addNepRef(nepRefNullAttr);
         tapiResolver.addNepRef(nepRef);
         tapiResolver.getNepRef(dummySipId);
     }
 
+    @Test
+    public void testGetNodeRefsFiltered() {
+        tapiResolver.addNodeRef(nodeRefNullAttr);
+        tapiResolver.addNodeRef(nodeRef);
+        List<TapiNodeRef> exp = Arrays.asList(nodeRef);
+        Map<String, String> filter = new HashMap<>();
+        filter.put(DEVICE_ID, deviceId.toString());
+
+        assertThat(tapiResolver.getNodeRefs(filter), is(exp));
+    }
+
+    @Test
+    public void testGetNepRefsFiltered() {
+        tapiResolver.addNepRef(nepRefNullAttr);
+        tapiResolver.addNepRef(nepRef);
+        List<TapiNepRef> exp = Arrays.asList(nepRef);
+        Map<String, String> filter = new HashMap<>();
+
+        filter.put(DEVICE_ID, deviceId.toString());
+        assertThat(tapiResolver.getNepRefs(filter), is(exp));
+
+        filter.put(ODTN_PORT_TYPE, portType);
+        assertThat(tapiResolver.getNepRefs(filter), is(exp));
+    }
+
 }
\ No newline at end of file
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscovery.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscovery.java
index 347a0c8..4ebe973 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscovery.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscovery.java
@@ -148,14 +148,12 @@
         //log.warn("parent data Node: {}",
         //       ((SubnodeConfiguration) component).getParent().getRootNode().getName());
 
-
         String name = component.getString("name");
         checkNotNull(name);
         if (!name.contains("GIGECLIENTCTP")) {
             return null;
         }
 
-
         Builder builder = DefaultPortDescription.builder();
 
         Map<String, String> props = new HashMap<>();
@@ -168,12 +166,17 @@
         Matcher lineMatch = linePattern.matcher(name);
 
         if (clientMatch.find()) {
+            String num = clientMatch.group(1);
+            Integer connection = (Integer.parseInt(num) + 1) / 2;
             props.putIfAbsent(PORT_TYPE, OdtnPortType.CLIENT.value());
-            builder.withPortNumber(PortNumber.portNumber(Long.parseLong(clientMatch.group(1)), name));
+            props.putIfAbsent(CONNECTION_ID, "connection:" + connection.toString());
+            builder.withPortNumber(PortNumber.portNumber(Long.parseLong(num), name));
             builder.type(Type.PACKET);
         } else if (lineMatch.find()) {
+            String num = lineMatch.group(1);
             props.putIfAbsent(PORT_TYPE, OdtnPortType.LINE.value());
-            builder.withPortNumber(PortNumber.portNumber(100 + Long.parseLong(lineMatch.group(1)), name));
+            props.putIfAbsent(CONNECTION_ID, "connection:" + num);
+            builder.withPortNumber(PortNumber.portNumber(100 + Long.parseLong(num), name));
             builder.type(Type.OCH);
         } else {
             return null;
diff --git a/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscoveryTest.java b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscoveryTest.java
index f86945c..e9f87a9 100644
--- a/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscoveryTest.java
+++ b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscoveryTest.java
@@ -29,7 +29,7 @@
 import static org.junit.Assert.assertThat;
 import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_NAME;
 import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_TYPE;
-import static org.onosproject.odtn.utils.tapi.TapiInstanceBuilder.ODTN_PORT_TYPE;
+import static org.onosproject.odtn.utils.tapi.TapiObjectHandler.ODTN_PORT_TYPE;
 
 public class InfineraOpenConfigDeviceDiscoveryTest {
 
