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 aa8e553..12df8cb 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
@@ -16,12 +16,18 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.node.OwnedNodeEdgePoint;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
 
-public class DcsBasedTapiNepRef extends TapiNepRef {
+public final class DcsBasedTapiNepRef extends TapiNepRef {
 
-    public DcsBasedTapiNepRef(Uuid topologyId, Uuid nodeId, Uuid nepId) {
-        super(topologyId.toString(), nodeId.toString(), nepId.toString());
+    private DcsBasedTapiNepRef(Topology topology, Node node, OwnedNodeEdgePoint nep) {
+        super(topology.uuid().toString(), node.uuid().toString(), nep.uuid().toString());
+    }
+
+    public static DcsBasedTapiNepRef create(Topology topology, Node node, OwnedNodeEdgePoint nep) {
+        return new DcsBasedTapiNepRef(topology, node, 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 5e3c79b..cfc38e2 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
@@ -16,11 +16,16 @@
 
 package org.onosproject.odtn.utils.tapi;
 
-import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.Node;
+import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.Topology;
 
-public class DcsBasedTapiNodeRef extends TapiNodeRef {
+public final class DcsBasedTapiNodeRef extends TapiNodeRef {
 
-    public DcsBasedTapiNodeRef(Uuid topologyId, Uuid nodeId) {
-        super(topologyId.toString(), nodeId.toString());
+    private DcsBasedTapiNodeRef(Topology topology, Node node) {
+        super(topology.uuid().toString(), node.uuid().toString());
+    }
+
+    public static DcsBasedTapiNodeRef create(Topology topology, Node node) {
+        return new DcsBasedTapiNodeRef(topology, node);
     }
 }
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
index 2d24dc4..720d436 100644
--- 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
@@ -18,8 +18,6 @@
 
 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.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -38,13 +36,13 @@
     }
 
     @Override
-    public ModelObjectData build() {
-        ModelObjectId objId = ModelObjectId.builder().build();
-        return getModelObjectData(context, objId);
+    public ModelObjectId getModelObjectId() {
+        return ModelObjectId.builder().build();
     }
 
     @Override
-    public ModelObject getModelObject() {
+    @SuppressWarnings("unchecked")
+    public DefaultContext getModelObject() {
         return context;
     }
 
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 834c927..2af7fed 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
@@ -91,7 +91,7 @@
      * @param kvs key-value map
      * @param <T> type of ModelObject
      */
-    public static <T extends ModelObject> void setNameList(T obj, Map<String, String> kvs) {
+    public static <T extends ModelObject> void addNameList(T obj, Map<String, String> kvs) {
 
         @SuppressWarnings("unchecked")
         Class<T> cls = (Class<T>) obj.getClass();
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
index fa4a903..dc4fd10 100644
--- 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
@@ -16,11 +16,26 @@
 
 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.
@@ -33,29 +48,80 @@
 
     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 ModelObjectData to be built
+     *
+     * @return ModelObjectId of build target
      */
-    public abstract ModelObjectData build();
+    public abstract ModelObjectId getModelObjectId();
 
     /**
      * Get modelObject instance.
+     *
+     * @param <T> build target class
      * @return ModelObject of build target
      */
-    public abstract ModelObject getModelObject();
+    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();
 
-    ModelObjectData getModelObjectData(ModelObject obj, ModelObjectId objId) {
         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/TapiLinkBuilder.java
index 93fbe5b..31107ae 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/TapiLinkBuilder.java
@@ -22,8 +22,6 @@
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultLink;
 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.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
 
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
@@ -49,7 +47,7 @@
         return this;
     }
 
-    public TapiLinkBuilder setNep(TapiNepRef nepRef) {
+    public TapiLinkBuilder addNep(TapiNepRef nepRef) {
         DefaultNodeEdgePoint nep = new DefaultNodeEdgePoint();
         nep.topologyId(nepRef.getTopologyId());
         nep.nodeId(nepRef.getNodeId());
@@ -59,19 +57,19 @@
     }
 
     @Override
-    public ModelObjectData build() {
+    public ModelObjectId getModelObjectId() {
 
         TopologyKeys topologyKey = new TopologyKeys();
         topologyKey.uuid(topologyUuid);
-        ModelObjectId objId = ModelObjectId.builder()
+        return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
                 .addChild(DefaultTopology.class, topologyKey)
                 .build();
-        return getModelObjectData(link, objId);
     }
 
     @Override
-    public ModelObject getModelObject() {
+    @SuppressWarnings("unchecked")
+    public DefaultLink getModelObject() {
         return link;
     }
 
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
index 3524d63..1148511 100644
--- 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
@@ -19,9 +19,8 @@
 import java.util.HashMap;
 import java.util.Map;
 import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Port;
 
-import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setNameList;
+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;
@@ -32,8 +31,6 @@
 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.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -65,18 +62,13 @@
         return this;
     }
 
-    public TapiNepBuilder setPort(Port port) {
-        cp = new ConnectPoint(port.element().id(), port.number());
-        kvs.put(ONOS_CP, cp.toString());
-        return this;
-    }
-
     public TapiNepBuilder setConnectPoint(ConnectPoint cp) {
         kvs.put(ONOS_CP, cp.toString());
+        addNameList(nep, kvs);
         return this;
     }
 
-    public TapiNepBuilder setSip(Uuid sipUuid) {
+    public TapiNepBuilder addSip(Uuid sipUuid) {
         DefaultMappedServiceInterfacePoint mappedSip = new DefaultMappedServiceInterfacePoint();
         mappedSip.serviceInterfacePointId(sipUuid);
         nep.addToMappedServiceInterfacePoint(mappedSip);
@@ -88,7 +80,8 @@
     }
 
     @Override
-    public ModelObject getModelObject() {
+    @SuppressWarnings("unchecked")
+    public DefaultOwnedNodeEdgePoint getModelObject() {
         return nep;
     }
 
@@ -98,21 +91,18 @@
     }
 
     @Override
-    public ModelObjectData build() {
-        setNameList(nep, kvs);
-
+    public ModelObjectId getModelObjectId() {
         TopologyKeys topologyKey = new TopologyKeys();
         topologyKey.uuid(topologyUuid);
 
         NodeKeys nodeKey = new NodeKeys();
         nodeKey.uuid(nodeUuid);
 
-        ModelObjectId objId = ModelObjectId.builder()
+        return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
                 .addChild(DefaultTopology.class, topologyKey)
                 .addChild(DefaultNode.class, nodeKey)
                 .build();
-        return getModelObjectData(nep, objId);
     }
 
 }
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 a28d53d..d837362 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,6 +16,7 @@
 
 package org.onosproject.odtn.utils.tapi;
 
+import java.util.Optional;
 import java.util.UUID;
 import org.onosproject.net.ConnectPoint;
 
@@ -28,8 +29,18 @@
     private final UUID topologyId;
     private final UUID nodeId;
     private final UUID nepId;
-    private UUID sipId;
-    private ConnectPoint cp;
+    private UUID sipId = null;
+    private ConnectPoint cp = null;
+
+    TapiNepRef(String topologyId, String nodeId, String nepId) {
+        this.topologyId = UUID.fromString(topologyId);
+        this.nodeId = UUID.fromString(nodeId);
+        this.nepId = UUID.fromString(nepId);
+    }
+
+    public static TapiNepRef create(String topologyId, String nodeId, String nepId) {
+        return new TapiNepRef(topologyId, nodeId, nepId);
+    }
 
     public String getTopologyId() {
         return topologyId.toString();
@@ -44,7 +55,9 @@
     }
 
     public String getSipId() {
-        return sipId.toString();
+        return Optional.ofNullable(sipId)
+                .map(UUID::toString)
+                .orElse(null);
     }
 
     public ConnectPoint getConnectPoint() {
@@ -61,12 +74,6 @@
         return this;
     }
 
-    public TapiNepRef(String topologyId, String nodeId, String nepId) {
-        this.topologyId = UUID.fromString(topologyId);
-        this.nodeId = UUID.fromString(nodeId);
-        this.nepId = UUID.fromString(nepId);
-    }
-
     public String toString() {
         return toStringHelper(getClass())
 //                .add("topologyId", topologyId)
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/TapiNodeBuilder.java
index 868df72..21e812c 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/TapiNodeBuilder.java
@@ -18,7 +18,7 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setNameList;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.addNameList;
 import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
 
 import org.onosproject.net.DeviceId;
@@ -28,8 +28,6 @@
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topology.DefaultNode;
 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.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -39,7 +37,6 @@
 
     private Uuid topologyUuid;
     private DefaultNode node = new DefaultNode();
-    private Map<String, String> kvs = new HashMap<>();
 
     private TapiNodeBuilder() {
         setUuid(node);
@@ -54,18 +51,21 @@
         return this;
     }
 
-    public TapiNodeBuilder setNep(OwnedNodeEdgePoint nep) {
+    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;
     }
 
     @Override
-    public ModelObject getModelObject() {
+    @SuppressWarnings("unchecked")
+    public DefaultNode getModelObject() {
         return node;
     }
 
@@ -75,16 +75,13 @@
     }
 
     @Override
-    public ModelObjectData build() {
-        setNameList(node, kvs);
-
+    public ModelObjectId getModelObjectId() {
         TopologyKeys topologyKey = new TopologyKeys();
         topologyKey.uuid(topologyUuid);
-        ModelObjectId objId = ModelObjectId.builder()
+        return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
                 .addChild(DefaultTopology.class, topologyKey)
                 .build();
-        return getModelObjectData(node, objId);
     }
 
 }
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 0fd762b..ae2a968 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
@@ -29,6 +29,15 @@
     private final UUID nodeId;
     private DeviceId deviceId;
 
+    TapiNodeRef(String topologyId, String nodeId) {
+        this.topologyId = UUID.fromString(topologyId);
+        this.nodeId = UUID.fromString(nodeId);
+    }
+
+    public static TapiNodeRef create(String topologyId, String nodeId) {
+        return new TapiNodeRef(topologyId, nodeId);
+    }
+
     public String getNodeId() {
         return nodeId.toString();
     }
@@ -37,13 +46,9 @@
         return deviceId;
     }
 
-    public void setDeviceId(DeviceId deviceId) {
+    public TapiNodeRef setDeviceId(DeviceId deviceId) {
         this.deviceId = deviceId;
-    }
-
-    public TapiNodeRef(String topologyId, String nodeId) {
-        this.topologyId = UUID.fromString(topologyId);
-        this.nodeId = UUID.fromString(nodeId);
+        return this;
     }
 
     public String toString() {
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiResolver.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiResolver.java
deleted file mode 100644
index 6ec62ff..0000000
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiResolver.java
+++ /dev/null
@@ -1,136 +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.ArrayList;
-import java.util.List;
-import java.util.NoSuchElementException;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.ElementId;
-import org.slf4j.Logger;
-import static org.slf4j.LoggerFactory.getLogger;
-
-
-/**
- * TAPI instance resolver.
- * FIXME: This resolver should provide DCS read cache
- */
-public class TapiResolver {
-
-    private final Logger log = getLogger(getClass());
-
-    private List<TapiNodeRef> tapiNodeRefList = new ArrayList<>();
-    private List<TapiNepRef> tapiNepRefList = new ArrayList<>();
-
-
-    /**
-     * Check existence of TAPI node associated with deviceId.
-     * @param deviceId search key
-     * @return boolean
-     */
-    public boolean hasNodeRef(ElementId deviceId) {
-        return tapiNodeRefList.stream()
-                .anyMatch(node -> node.getDeviceId().equals(deviceId));
-    }
-
-    /**
-     * Check existence of TAPI nep associated with ConnectPoint.
-     * @param cp search key
-     * @return TapiNepRef
-     */
-    public boolean hasNepRef(ConnectPoint cp) {
-        return tapiNepRefList.stream()
-                .anyMatch(nep -> nep.getConnectPoint().equals(cp));
-    }
-
-    /**
-     * Check existence of TAPI nep associated with TAPI sipId.
-     * @param sipId search key
-     * @return TapiNepRef
-     */
-    public boolean hasNepRef(String sipId) {
-        return tapiNepRefList.stream()
-                .anyMatch(nep -> nep.getSipId().equals(sipId));
-    }
-
-    /**
-     * Resolve TAPI node associated with deviceId.
-     * @param deviceId search key
-     * @return TapiNodeRef
-     */
-    public TapiNodeRef getNodeRef(ElementId deviceId) {
-        TapiNodeRef ret = null;
-        try {
-            ret = tapiNodeRefList.stream()
-                    .filter(node -> node.getDeviceId().equals(deviceId))
-                    .findFirst().get();
-        } catch (NoSuchElementException e) {
-            log.error("Node not found associated with {}", deviceId);
-            throw e;
-        }
-        return ret;
-    }
-
-    /**
-     * Resolve TAPI nep associated with ConnectPoint.
-     * @param cp search key
-     * @return TapiNepRef
-     */
-    public TapiNepRef getNepRef(ConnectPoint cp) {
-        TapiNepRef ret = null;
-        try {
-            ret = tapiNepRefList.stream()
-                    .filter(nep -> nep.getConnectPoint().equals(cp))
-                    .findFirst().get();
-        } catch (NoSuchElementException e) {
-            log.error("Nep not found associated with {}", cp);
-            throw e;
-        }
-        return ret;
-    }
-
-    /**
-     * Resolve TAPI nep associated with TAPI sipId.
-     * @param sipId search key
-     * @return TapiNepRef
-     */
-    public TapiNepRef getNepRef(String sipId) {
-        TapiNepRef ret = null;
-        try {
-            ret = tapiNepRefList.stream()
-                    .filter(nep -> nep.getSipId().equals(sipId))
-                    .findFirst().get();
-        } catch (NoSuchElementException e) {
-            log.error("Nep not found associated with {}", sipId);
-            throw e;
-        }
-        return ret;
-    }
-
-    public TapiResolver addNodeRef(TapiNodeRef nodeRef) {
-        tapiNodeRefList.add(nodeRef);
-        log.info("Nodes: {}", tapiNodeRefList);
-        return this;
-    }
-
-    public TapiResolver addNepRef(TapiNepRef nepRef) {
-        tapiNepRefList.add(nepRef);
-        log.info("Neps: {}", tapiNepRefList);
-        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
index a12a425..5e24b33 100644
--- 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
@@ -19,18 +19,15 @@
 import java.util.HashMap;
 import java.util.Map;
 import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Port;
 
 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.setNameList;
+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.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -39,7 +36,6 @@
 public final class TapiSipBuilder extends TapiInstanceBuilder {
 
     private DefaultServiceInterfacePoint sip = new DefaultServiceInterfacePoint();
-    private Map<String, String> kvs = new HashMap<>();
 
     private TapiSipBuilder() {
         setUuid(sip);
@@ -51,36 +47,35 @@
 
     /**
      * Check this builder dealing with port for SIP or not.
-     * @param port onos port
+     * @param cp onos connectPoint
      * @return Is this builder for SIP or not
      */
-    public static boolean isSip(Port port) {
+    public static boolean isSip(ConnectPoint cp) {
         // FIXME modify this method to appropriate way
-        ConnectPoint cp = new ConnectPoint(port.element().id(), port.number());
         return cp.toString().contains("TRANSCEIVER");
     }
 
-    public TapiSipBuilder setPort(Port port) {
-        if (!isSip(port)) {
+    public TapiSipBuilder setConnectPoint(ConnectPoint cp) {
+        if (!isSip(cp)) {
             throw new IllegalStateException("Not allowed to use this port as SIP.");
         }
-        ConnectPoint cp = new ConnectPoint(port.element().id(), port.number());
+        Map<String, String> kvs = new HashMap<>();
         kvs.put(ONOS_CP, cp.toString());
+        addNameList(sip, kvs);
         sip.addToLayerProtocolName(LayerProtocolName.of(DSR));
         return this;
     }
 
     @Override
-    public ModelObjectData build() {
-        setNameList(sip, kvs);
-        ModelObjectId objId = ModelObjectId.builder()
+    public ModelObjectId getModelObjectId() {
+        return ModelObjectId.builder()
                 .addChild(DefaultContext.class)
                 .build();
-        return getModelObjectData(sip, objId);
     }
 
     @Override
-    public ModelObject getModelObject() {
+    @SuppressWarnings("unchecked")
+    public DefaultServiceInterfacePoint getModelObject() {
         return sip;
     }
 
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/TapiTopologyBuilder.java
index 82e83d7..4c96133 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/TapiTopologyBuilder.java
@@ -22,8 +22,6 @@
 import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.Uuid;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.context.DefaultAugmentedTapiCommonContext;
 import org.onosproject.yang.gen.v1.tapitopology.rev20180307.tapitopology.topologycontext.DefaultTopology;
-import org.onosproject.yang.model.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
 
 /**
@@ -44,17 +42,17 @@
 
 
     @Override
-    public ModelObjectData build() {
+    public ModelObjectId getModelObjectId() {
 
         DefaultAugmentedTapiCommonContext topologyContext = new DefaultAugmentedTapiCommonContext();
         topologyContext.addToTopology(topology);
 
-        ModelObjectId objId = ModelObjectId.builder().addChild(DefaultContext.class).build();
-        return getModelObjectData(topologyContext, objId);
+        return ModelObjectId.builder().addChild(DefaultContext.class).build();
     }
 
     @Override
-    public ModelObject getModelObject() {
+    @SuppressWarnings("unchecked")
+    public DefaultTopology getModelObject() {
         return topology;
     }
 
