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
new file mode 100644
index 0000000..aa8e553
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNepRef.java
@@ -0,0 +1,27 @@
+/*
+ * 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;
+
+public class DcsBasedTapiNepRef extends TapiNepRef {
+
+    public DcsBasedTapiNepRef(Uuid topologyId, Uuid nodeId, Uuid nepId) {
+        super(topologyId.toString(), nodeId.toString(), nepId.toString());
+    }
+
+}
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
new file mode 100644
index 0000000..5e3c79b
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/DcsBasedTapiNodeRef.java
@@ -0,0 +1,26 @@
+/*
+ * 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;
+
+public class DcsBasedTapiNodeRef extends TapiNodeRef {
+
+    public DcsBasedTapiNodeRef(Uuid topologyId, Uuid nodeId) {
+        super(topologyId.toString(), nodeId.toString());
+    }
+}
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
new file mode 100644
index 0000000..2d24dc4
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiContextBuilder.java
@@ -0,0 +1,55 @@
+/*
+ * 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.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+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 ModelObjectData build() {
+        ModelObjectId objId = ModelObjectId.builder().build();
+        return getModelObjectData(context, objId);
+    }
+
+    @Override
+    public ModelObject getModelObject() {
+        return context;
+    }
+
+    @Override
+    public Uuid getUuid() {
+        return null;
+    }
+}
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
new file mode 100644
index 0000000..834c927
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiGlobalClassUtil.java
@@ -0,0 +1,111 @@
+/*
+ * 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.globalclass.DefaultName;
+import org.onosproject.yang.gen.v1.tapicommon.rev20180307.tapicommon.globalclass.Name;
+import org.onosproject.yang.model.ModelObject;
+
+import java.lang.reflect.InvocationTargetException;
+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> tapi-common@2018-03-07.yang
+ * grouping global-class {
+ *   leaf uuid {
+ *     type uuid;
+ *   }
+ *   list name {
+ *     key 'value-name';
+ *     uses name-and-value;
+ *   }
+ * }
+ *
+ * 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 TapiGlobalClassUtil {
+
+    private static final Logger log = getLogger(TapiGlobalClassUtil.class);
+
+    private TapiGlobalClassUtil() {
+    }
+
+    /**
+     * Generate and set Uuid for the ModelObject.
+     * @param obj ModelObject
+     * @param <T> type of ModelObject
+     * @return generated uuid
+     */
+    public static <T extends ModelObject> Uuid setUuid(T obj) {
+        Uuid uuid = Uuid.of(UUID.randomUUID().toString());
+
+        @SuppressWarnings("unchecked")
+        Class<T> cls = (Class<T>) obj.getClass();
+        try {
+            Method method = cls.getMethod("uuid", Uuid.class);
+            method.invoke(obj, uuid);
+        } 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
+     */
+    public static <T extends ModelObject> void setNameList(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/TapiInstanceBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
new file mode 100644
index 0000000..ecb07f1
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
@@ -0,0 +1,59 @@
+/*
+ * 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.DefaultModelObjectData;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+
+/**
+ * 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";
+
+    /**
+     * Generate DCS modelObjectData.
+     * @return ModelObjectData to be built
+     */
+    public abstract ModelObjectData build();
+
+    /**
+     * Get modelObject instance.
+     * @return ModelObject of build target
+     */
+    public abstract ModelObject getModelObject();
+
+    /**
+     * Get modelObject uuid.
+     * @return Uuid of build target
+     */
+    public abstract Uuid getUuid();
+
+
+    ModelObjectData getModelObjectData(ModelObject obj, ModelObjectId objId) {
+        return DefaultModelObjectData.builder()
+                .addModelObject(obj)
+                .identifier(objId)
+                .build();
+    }
+}
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
new file mode 100644
index 0000000..93fbe5b
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiLinkBuilder.java
@@ -0,0 +1,83 @@
+/*
+ * 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.tapitopology.rev20180307.tapitopology.link.DefaultNodeEdgePoint;
+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;
+
+/**
+ * Utility builder class for TAPI link creation with DCS.
+ */
+public final class TapiLinkBuilder extends TapiInstanceBuilder {
+
+    private Uuid topologyUuid;
+    private DefaultLink link = new DefaultLink();
+
+    private TapiLinkBuilder() {
+        setUuid(link);
+    }
+
+    public static TapiLinkBuilder builder() {
+        return new TapiLinkBuilder();
+    }
+
+    public TapiLinkBuilder setTopologyUuid(Uuid topologyUuid) {
+        this.topologyUuid = topologyUuid;
+        return this;
+    }
+
+    public TapiLinkBuilder setNep(TapiNepRef nepRef) {
+        DefaultNodeEdgePoint nep = new DefaultNodeEdgePoint();
+        nep.topologyId(nepRef.getTopologyId());
+        nep.nodeId(nepRef.getNodeId());
+        nep.ownedNodeEdgePointId(nepRef.getNepId());
+        link.addToNodeEdgePoint(nep);
+        return this;
+    }
+
+    @Override
+    public ModelObjectData build() {
+
+        TopologyKeys topologyKey = new TopologyKeys();
+        topologyKey.uuid(topologyUuid);
+        ModelObjectId objId = ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .addChild(DefaultTopology.class, topologyKey)
+                .build();
+        return getModelObjectData(link, objId);
+    }
+
+    @Override
+    public ModelObject getModelObject() {
+        return link;
+    }
+
+    @Override
+    public Uuid getUuid() {
+        return link.uuid();
+    }
+
+}
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
new file mode 100644
index 0000000..3524d63
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepBuilder.java
@@ -0,0 +1,118 @@
+/*
+ * 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 static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setNameList;
+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.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+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 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());
+        return this;
+    }
+
+    public TapiNepBuilder setSip(Uuid sipUuid) {
+        DefaultMappedServiceInterfacePoint mappedSip = new DefaultMappedServiceInterfacePoint();
+        mappedSip.serviceInterfacePointId(sipUuid);
+        nep.addToMappedServiceInterfacePoint(mappedSip);
+        return this;
+    }
+
+    public ConnectPoint getConnectPoint() {
+        return cp;
+    }
+
+    @Override
+    public ModelObject getModelObject() {
+        return nep;
+    }
+
+    @Override
+    public Uuid getUuid() {
+        return nep.uuid();
+    }
+
+    @Override
+    public ModelObjectData build() {
+        setNameList(nep, kvs);
+
+        TopologyKeys topologyKey = new TopologyKeys();
+        topologyKey.uuid(topologyUuid);
+
+        NodeKeys nodeKey = new NodeKeys();
+        nodeKey.uuid(nodeUuid);
+
+        ModelObjectId objId = 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
new file mode 100644
index 0000000..a28d53d
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNepRef.java
@@ -0,0 +1,99 @@
+/*
+ * 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.net.ConnectPoint;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Objects.equal;
+import static java.util.Objects.hash;
+
+public class TapiNepRef {
+
+    private final UUID topologyId;
+    private final UUID nodeId;
+    private final UUID nepId;
+    private UUID sipId;
+    private ConnectPoint cp;
+
+    public String getTopologyId() {
+        return topologyId.toString();
+    }
+
+    public String getNodeId() {
+        return nodeId.toString();
+    }
+
+    public String getNepId() {
+        return nepId.toString();
+    }
+
+    public String getSipId() {
+        return sipId.toString();
+    }
+
+    public ConnectPoint getConnectPoint() {
+        return cp;
+    }
+
+    public TapiNepRef setSipId(String sipId) {
+        this.sipId = UUID.fromString(sipId);
+        return this;
+    }
+
+    public TapiNepRef setConnectPoint(ConnectPoint cp) {
+        this.cp = cp;
+        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)
+                .add("nodeId", nodeId)
+                .add("nepId", nepId)
+                .add("sipId", sipId)
+                .add("connectPoint", cp)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof TapiNepRef)) {
+            return false;
+        }
+        TapiNepRef that = (TapiNepRef) o;
+        return equal(topologyId, that.topologyId) &&
+                equal(nodeId, that.nodeId) &&
+                equal(nepId, that.nepId);
+    }
+
+    @Override
+    public int hashCode() {
+        return hash(topologyId, nodeId, nepId);
+    }
+
+}
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
new file mode 100644
index 0000000..868df72
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeBuilder.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.HashMap;
+import java.util.Map;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setNameList;
+import static org.onosproject.odtn.utils.tapi.TapiGlobalClassUtil.setUuid;
+
+import org.onosproject.net.DeviceId;
+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.OwnedNodeEdgePoint;
+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;
+
+/**
+ * Utility builder class for TAPI node creation with DCS.
+ */
+public final class TapiNodeBuilder extends TapiInstanceBuilder {
+
+    private Uuid topologyUuid;
+    private DefaultNode node = new DefaultNode();
+    private Map<String, String> kvs = new HashMap<>();
+
+    private TapiNodeBuilder() {
+        setUuid(node);
+    }
+
+    public static TapiNodeBuilder builder() {
+        return new TapiNodeBuilder();
+    }
+
+    public TapiNodeBuilder setTopologyUuid(Uuid topologyUuid) {
+        this.topologyUuid = topologyUuid;
+        return this;
+    }
+
+    public TapiNodeBuilder setNep(OwnedNodeEdgePoint nep) {
+        node.addToOwnedNodeEdgePoint(nep);
+        return this;
+    }
+
+    public TapiNodeBuilder setDeviceId(DeviceId deviceId) {
+        kvs.put(DEVICE_ID, deviceId.toString());
+        return this;
+    }
+
+    @Override
+    public ModelObject getModelObject() {
+        return node;
+    }
+
+    @Override
+    public Uuid getUuid() {
+        return node.uuid();
+    }
+
+    @Override
+    public ModelObjectData build() {
+        setNameList(node, kvs);
+
+        TopologyKeys topologyKey = new TopologyKeys();
+        topologyKey.uuid(topologyUuid);
+        ModelObjectId objId = 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
new file mode 100644
index 0000000..0fd762b
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiNodeRef.java
@@ -0,0 +1,75 @@
+/*
+ * 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.net.DeviceId;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Objects.equal;
+import static java.util.Objects.hash;
+
+public class TapiNodeRef {
+
+    private final UUID topologyId;
+    private final UUID nodeId;
+    private DeviceId deviceId;
+
+    public String getNodeId() {
+        return nodeId.toString();
+    }
+
+    public DeviceId getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(DeviceId deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public TapiNodeRef(String topologyId, String nodeId) {
+        this.topologyId = UUID.fromString(topologyId);
+        this.nodeId = UUID.fromString(nodeId);
+    }
+
+    public String toString() {
+        return toStringHelper(getClass())
+//                .add("topologyId", topologyId)
+                .add("nodeId", nodeId)
+                .add("deviceId", deviceId)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof TapiNodeRef)) {
+            return false;
+        }
+        TapiNodeRef nodeRef = (TapiNodeRef) o;
+        return equal(topologyId, nodeRef.topologyId) &&
+                equal(nodeId, nodeRef.nodeId);
+    }
+
+    @Override
+    public int hashCode() {
+        return hash(topologyId, nodeId);
+    }
+
+}
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
new file mode 100644
index 0000000..6ec62ff
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiResolver.java
@@ -0,0 +1,136 @@
+/*
+ * 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
new file mode 100644
index 0000000..a12a425
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiSipBuilder.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 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.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;
+
+/**
+ * Utility builder class for TAPI sip creation with DCS.
+ */
+public final class TapiSipBuilder extends TapiInstanceBuilder {
+
+    private DefaultServiceInterfacePoint sip = new DefaultServiceInterfacePoint();
+    private Map<String, String> kvs = new HashMap<>();
+
+    private TapiSipBuilder() {
+        setUuid(sip);
+    }
+
+    public static TapiSipBuilder builder() {
+        return new TapiSipBuilder();
+    }
+
+    /**
+     * Check this builder dealing with port for SIP or not.
+     * @param port onos port
+     * @return Is this builder for SIP or not
+     */
+    public static boolean isSip(Port port) {
+        // 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)) {
+            throw new IllegalStateException("Not allowed to use this port as SIP.");
+        }
+        ConnectPoint cp = new ConnectPoint(port.element().id(), port.number());
+        kvs.put(ONOS_CP, cp.toString());
+        sip.addToLayerProtocolName(LayerProtocolName.of(DSR));
+        return this;
+    }
+
+    @Override
+    public ModelObjectData build() {
+        setNameList(sip, kvs);
+        ModelObjectId objId = ModelObjectId.builder()
+                .addChild(DefaultContext.class)
+                .build();
+        return getModelObjectData(sip, objId);
+    }
+
+    @Override
+    public ModelObject getModelObject() {
+        return sip;
+    }
+
+    @Override
+    public Uuid getUuid() {
+        return sip.uuid();
+    }
+}
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
new file mode 100644
index 0000000..82e83d7
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiTopologyBuilder.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 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.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;
+
+/**
+ * Utility builder class for TAPI topology creation with DCS.
+ */
+public final class TapiTopologyBuilder extends TapiInstanceBuilder {
+
+    private DefaultTopology topology;
+
+    private TapiTopologyBuilder(DefaultTopology topology) {
+        this.topology = topology;
+        setUuid(this.topology);
+    }
+
+    public static TapiTopologyBuilder builder(DefaultTopology topology) {
+        return new TapiTopologyBuilder(topology);
+    }
+
+
+    @Override
+    public ModelObjectData build() {
+
+        DefaultAugmentedTapiCommonContext topologyContext = new DefaultAugmentedTapiCommonContext();
+        topologyContext.addToTopology(topology);
+
+        ModelObjectId objId = ModelObjectId.builder().addChild(DefaultContext.class).build();
+        return getModelObjectData(topologyContext, objId);
+    }
+
+    @Override
+    public ModelObject getModelObject() {
+        return topology;
+    }
+
+    @Override
+    public Uuid getUuid() {
+        return topology.uuid();
+    }
+
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/package-info.java
new file mode 100644
index 0000000..8d71ec1
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/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.
+ */
+
+/**
+ * Utilities to deal with onos-yang-tools TAPI objects.
+ */
+package org.onosproject.odtn.utils.tapi;
\ No newline at end of file
