diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandler.java
new file mode 100755
index 0000000..c608038
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigAssignmentHandler.java
@@ -0,0 +1,61 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.DefaultAssignment;
+
+import org.onosproject.yang.model.KeyLeaf;
+
+/**
+ * Utility class to deal with OPENCONFIG Assignment ModelObject & Annotation.
+ */
+public final class OpenConfigAssignmentHandler
+        extends OpenConfigObjectHandler<DefaultAssignment> {
+
+    private static final String OPENCONFIG_NAME = "assignment";
+    private static final String KEY_LEAF_NAME = "index";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigAssignmentHandler Constructor.
+     *
+     * @param keyValue String of target OPENCONFIG's key
+     * @param parent OpenConfigLogicalChannelAssignmentsHandler of
+     *               parent OPENCONFIG(logical-channel-assignments)
+     */
+    public OpenConfigAssignmentHandler(String keyValue,
+                                       OpenConfigLogicalChannelAssignmentsHandler parent) {
+        modelObject = new DefaultAssignment();
+        modelObject.index(keyValue);
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE,
+                      new KeyLeaf(KEY_LEAF_NAME, NAME_SPACE, keyValue),
+                      parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addAssignment(this);
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfAssignmentHandler having Config to be set for modelObject
+     * @return OpenConfigAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigAssignmentHandler addConfig(OpenConfigConfigOfAssignmentHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandler.java
new file mode 100755
index 0000000..3ab6d8e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigChannelHandler.java
@@ -0,0 +1,72 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.DefaultChannel;
+
+import org.onosproject.yang.model.KeyLeaf;
+
+/**
+ * Utility class to deal with OPENCONFIG Channel ModelObject & Annotation.
+ */
+public final class OpenConfigChannelHandler
+        extends OpenConfigObjectHandler<DefaultChannel> {
+
+    private static final String OPENCONFIG_NAME = "channel";
+    private static final String KEY_LEAF_NAME = "index";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigChannelHandler Constructor.
+     *
+     * @param keyValue String of target OPENCONFIG's key
+     * @param parent OpenConfigLogicalChannelsHandler of parent OPENCONFIG(logical-channels)
+     */
+    public OpenConfigChannelHandler(String keyValue, OpenConfigLogicalChannelsHandler parent) {
+        modelObject = new DefaultChannel();
+        modelObject.index(keyValue);
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE,
+                      new KeyLeaf(KEY_LEAF_NAME, NAME_SPACE, keyValue),
+                      parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addChannel(this);
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfChannelHandler having Config to be set for modelObject
+     * @return OpenConfigChannelHandler of target OPENCONFIG
+     */
+    public OpenConfigChannelHandler addConfig(OpenConfigConfigOfChannelHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+
+    /**
+     * Add LogicalChannelAssignments to modelObject of target OPENCONFIG.
+     *
+     * @param logicalChannelAssignments OpenConfigLogicalChannelAssignmentsHandler having
+     *                                  LogicalChannelAssignments to be set for modelObject
+     * @return OpenConfigChannelHandler of target OPENCONFIG
+     */
+    public OpenConfigChannelHandler addLogicalChannelAssignments(
+           OpenConfigLogicalChannelAssignmentsHandler logicalChannelAssignments) {
+        modelObject.logicalChannelAssignments(logicalChannelAssignments.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandler.java
new file mode 100755
index 0000000..4cb2b18
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentHandler.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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.components.DefaultComponent;
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20170708.openconfigplatformtransceiver.components.component.DefaultAugmentedOcPlatformComponent;
+
+import org.onosproject.yang.model.KeyLeaf;
+
+/**
+ * Utility class to deal with OPENCONFIG Componet ModelObject & Annotation.
+ */
+public final class OpenConfigComponentHandler
+        extends OpenConfigObjectHandler<DefaultComponent> {
+
+    private static final String OPENCONFIG_NAME = "component";
+    private static final String KEY_LEAF_NAME = "name";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform";
+
+    private DefaultAugmentedOcPlatformComponent augmentedOcPlatformComponent;
+
+    /**
+     * OpenConfigComponentHandler Constructor.
+     *
+     * @param keyValue String of target OPENCONFIG's key
+     * @param parent OpenConfigComponentsHandler of parent OPENCONFIG(components)
+     */
+    public OpenConfigComponentHandler(String keyValue, OpenConfigComponentsHandler parent) {
+        modelObject = new DefaultComponent();
+        modelObject.name(keyValue);
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE,
+                      new KeyLeaf(KEY_LEAF_NAME, NAME_SPACE, keyValue),
+                      parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+        augmentedOcPlatformComponent = new DefaultAugmentedOcPlatformComponent();
+
+        parent.addComponent(this);
+    }
+
+    /**
+     * Add Transceiver to modelObject of target OPENCONFIG.
+     *
+     * @param transceiver OpenConfigTransceiverHandler having Transceiver to be set for modelObject
+     * @return OpenConfigComponentHandler of target OPENCONFIG
+     */
+    public OpenConfigComponentHandler addTransceiver(OpenConfigTransceiverHandler transceiver) {
+        augmentedOcPlatformComponent.transceiver(transceiver.getModelObject());
+        modelObject.addAugmentation(augmentedOcPlatformComponent);
+        return this;
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfComponentHandler having Config to be set for modelObject
+     * @return OpenConfigComponentHandler of target OPENCONFIG
+     */
+    public OpenConfigComponentHandler addConfig(OpenConfigConfigOfComponentHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandler.java
new file mode 100755
index 0000000..1dc568c
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigComponentsHandler.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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.DefaultComponents;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+import com.google.common.collect.ImmutableList;
+
+import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
+import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
+import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
+import static org.onosproject.odtn.utils.YangToolUtil.toResourceData;
+import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
+
+/**
+ * Utility class to deal with OPENCONFIG Componets ModelObject & Annotation.
+ */
+public final class OpenConfigComponentsHandler
+        extends OpenConfigObjectHandler<DefaultComponents> {
+
+    private static final String OPENCONFIG_NAME = "components";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform";
+
+    /**
+     * OpenConfigComponentsHandler Constructor.
+     */
+    public OpenConfigComponentsHandler() {
+        modelObject = new DefaultComponents();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, null);
+        annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+    }
+
+    /**
+     * Add Component to modelObject of target OPENCONFIG.
+     *
+     * @param component OpenConfigComponentHandler having Component to be set for modelObject
+     * @return OpenConfigComponentsHandler of target OPENCONFIG
+     */
+    public OpenConfigComponentsHandler addComponent(OpenConfigComponentHandler component) {
+        modelObject.addToComponent(component.getModelObject());
+        return this;
+    }
+
+    /**
+     * Get List<CharSequence> of target OPENCONFIG.
+     *
+     * @return List<CharSequence> of target OPENCONFIG
+     */
+    public List<CharSequence> getListCharSequence() {
+        return ImmutableList.of(toDataNode((ModelObject) getModelObject())).stream()
+                            .map(node -> toCharSequence(toXmlCompositeStream(
+                                         toCompositeData(toResourceData(
+                                                         ResourceId.builder().build(), node),
+                                         annotatedNodeInfos))))
+                            .collect(Collectors.toList());
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandler.java
new file mode 100755
index 0000000..7c7ade2
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfAssignmentHandler.java
@@ -0,0 +1,78 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmentconfig.AssignmentTypeEnum;
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmenttop.logicalchannelassignments.assignment.DefaultConfig;
+
+import java.math.BigDecimal;
+
+/**
+ * Utility class to deal with OPENCONFIG Assignment/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfAssignmentHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigConfigOfAssignmentHandler Constructor.
+     *
+     * @param parent OpenConfigAssignmentHandler of parent OPENCONFIG(assignment)
+     */
+    public OpenConfigConfigOfAssignmentHandler(OpenConfigAssignmentHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add child OPENCONFIG(assignment-type).
+     *
+     * @param assignmentType AssignmentTypeEnum to be set for modelObject
+     * @return OpenConfigConfigOfAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfAssignmentHandler addAssignmentType(
+                                               AssignmentTypeEnum assignmentType) {
+        modelObject.assignmentType(assignmentType);
+        return this;
+    }
+
+    /**
+     * Add child OPENCONFIG(logical-channel).
+     *
+     * @param logicalChannel String to be set for modelObject
+     * @return OpenConfigConfigOfAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfAssignmentHandler addLogicalChannel(String logicalChannel) {
+        modelObject.logicalChannel(logicalChannel);
+        return this;
+    }
+
+    /**
+     * Add child OPENCONFIG(allocation).
+     *
+     * @param allocation BigDecimal to be set for modelObject
+     * @return OpenConfigConfigOfAssignmentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfAssignmentHandler addAllocation(BigDecimal allocation) {
+        modelObject.allocation(allocation);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandler.java
new file mode 100755
index 0000000..f422121
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfChannelHandler.java
@@ -0,0 +1,52 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanneltop.logicalchannels.channel.DefaultConfig;
+
+/**
+ * Utility class to deal with OPENCONFIG Channel/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfChannelHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigConfigOfAssignmentHandler Constructor.
+     *
+     * @param parent OpenConfigChannelHandler of parent OPENCONFIG(channel)
+     */
+    public OpenConfigConfigOfChannelHandler(OpenConfigChannelHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add child OPENCONFIG(index).
+     *
+     * @param index String to be set for modelObject
+     * @return OpenConfigConfigOfChannelHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfChannelHandler addIndex(String index) {
+        modelObject.index(index);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandler.java
new file mode 100755
index 0000000..09eb63e
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfComponentHandler.java
@@ -0,0 +1,52 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.components.component.DefaultConfig;
+
+/**
+ * Utility class to deal with OPENCONFIG Componet/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfComponentHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform";
+
+    /**
+     * OpenConfigConfigOfComponentHandler Constructor.
+     *
+     * @param parent OpenConfigTransceiverHandler of parent OPENCONFIG(component)
+     */
+    public OpenConfigConfigOfComponentHandler(OpenConfigComponentHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add name to modelObject of target OPENCONFIG.
+     *
+     * @param name String to be set for modelObject
+     * @return OpenConfigConfigOfComponentHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfComponentHandler addName(String name) {
+        modelObject.name(name);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandler.java
new file mode 100755
index 0000000..8a271fd
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigConfigOfTransceiverHandler.java
@@ -0,0 +1,52 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20170708.openconfigplatformtransceiver.porttransceivertop.transceiver.DefaultConfig;
+
+/**
+ * Utility class to deal with OPENCONFIG Transceiver/Config ModelObject & Annotation.
+ */
+public final class OpenConfigConfigOfTransceiverHandler
+        extends OpenConfigObjectHandler<DefaultConfig> {
+
+    private static final String OPENCONFIG_NAME = "config";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform/transceiver";
+
+    /**
+     * OpenConfigConfigOfTransceiverHandler Constructor.
+     *
+     * @param parent OpenConfigTransceiverHandler of parent OPENCONFIG(tranceiver)
+     */
+    public OpenConfigConfigOfTransceiverHandler(OpenConfigTransceiverHandler parent) {
+        modelObject = new DefaultConfig();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addConfig(this);
+    }
+
+    /**
+     * Add enabled to modelObject of target OPENCONFIG.
+     *
+     * @param enabled boolean to be set for modelObject
+     * @return OpenConfigConfigOfTransceiverHandler of target OPENCONFIG
+     */
+    public OpenConfigConfigOfTransceiverHandler addEnabled(boolean enabled) {
+        modelObject.enabled(enabled);
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandler.java
new file mode 100755
index 0000000..5432b8f
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelAssignmentsHandler.java
@@ -0,0 +1,53 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanassignmenttop.DefaultLogicalChannelAssignments;
+
+/**
+ * Utility class to deal with OPENCONFIG LogicalChannelAssignments ModelObject & Annotation.
+ */
+public final class OpenConfigLogicalChannelAssignmentsHandler
+        extends OpenConfigObjectHandler<DefaultLogicalChannelAssignments> {
+
+    private static final String OPENCONFIG_NAME = "logical-channel-assignments";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigLogicalChannelAssignmentsHandler Constructor.
+     *
+     * @param parent OpenConfigChannelHandler of parent OPENCONFIG(channel)
+     */
+    public OpenConfigLogicalChannelAssignmentsHandler(OpenConfigChannelHandler parent) {
+        modelObject = new DefaultLogicalChannelAssignments();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addLogicalChannelAssignments(this);
+    }
+
+    /**
+     * Add Assignment to modelObject of target OPENCONFIG.
+     *
+     * @param assignment OpenConfigAssignmentHandler having Assignment to be set for modelObject
+     * @return OpenConfigLogicalChannelAssignmentsHandler of target OPENCONFIG
+     */
+    public OpenConfigLogicalChannelAssignmentsHandler addAssignment(
+                                                      OpenConfigAssignmentHandler assignment) {
+        modelObject.addToAssignment(assignment.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandler.java
new file mode 100755
index 0000000..7e3eb32
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigLogicalChannelsHandler.java
@@ -0,0 +1,52 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminallogicalchanneltop.DefaultLogicalChannels;
+
+/**
+ * Utility class to deal with OPENCONFIG LogicalChannels ModelObject & Annotation.
+ */
+public final class OpenConfigLogicalChannelsHandler
+        extends OpenConfigObjectHandler<DefaultLogicalChannels> {
+
+    private static final String OPENCONFIG_NAME = "logical-channels";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigLogicalChannelsHandler Constructor.
+     *
+     * @param parent OpenConfigTerminalDeviceHandler of parent OPENCONFIG(terminal-device)
+     */
+    public OpenConfigLogicalChannelsHandler(OpenConfigTerminalDeviceHandler parent) {
+        modelObject = new DefaultLogicalChannels();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addLogicalChannels(this);
+    }
+
+    /**
+     * Add Channel to modelObject of target OPENCONFIG.
+     *
+     * @param channel OpenConfigChannelHandler having Channel to be set for modelObject
+     * @return OpenConfigLogicalChannelsHandler of target OPENCONFIG
+     */
+    public OpenConfigLogicalChannelsHandler addChannel(OpenConfigChannelHandler channel) {
+        modelObject.addToChannel(channel.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigObjectHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigObjectHandler.java
new file mode 100644
index 0000000..16958b6
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigObjectHandler.java
@@ -0,0 +1,135 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import org.onosproject.yang.runtime.Annotation;
+import org.onosproject.yang.runtime.DefaultAnnotatedNodeInfo;
+import org.onosproject.yang.runtime.DefaultAnnotation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.List;
+
+/**
+ * Utility abstract class to deal with OPENCONFIG ModelObject & Annotation.
+ *
+ * @param <O> modelOject to be dealt with
+ */
+public abstract class OpenConfigObjectHandler<O extends ModelObject> {
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+    protected O modelObject;
+    protected ResourceId resourceId;
+    protected List<AnnotatedNodeInfo> annotatedNodeInfos;
+
+    /**
+     * Get modelObject instance.
+     *
+     * @return ModelObject of target OPENCONFIG
+     */
+    public O getModelObject() {
+        return modelObject;
+    }
+
+    /**
+     * Get resourceId instance.
+     *
+     * @return ResourceId of target OPENCONFIG
+     */
+    public ResourceId getResourceId() {
+        return resourceId;
+    }
+
+    /**
+     * Set resourceId instance.
+     *
+     * @param openconfigName String of target OPENCONFIG name
+     * @param openconfigNameSpace String of target OPENCONFIG namespace
+     * @param keyLeaf KeyLeaf of target OPENCONFIG
+     * @param pBuilder ResourceId.Builder of parent OPENCONFIG
+     */
+    protected void setResourceId(String openconfigName, String openconfigNameSpace,
+                                        KeyLeaf keyLeaf, ResourceId.Builder pBuilder) {
+        ResourceId.Builder ridBuilder = ResourceId.builder();
+        if (pBuilder != null) {
+            ridBuilder = pBuilder.addBranchPointSchema(openconfigName, openconfigNameSpace);
+        } else {
+            ridBuilder = ridBuilder.addBranchPointSchema(openconfigName,
+                                                         openconfigNameSpace);
+        }
+
+        if (keyLeaf != null) {
+            ridBuilder = ridBuilder.addKeyLeaf(
+                             keyLeaf.leafSchema().name(),
+                             keyLeaf.leafSchema().namespace(),
+                             keyLeaf.leafValue());
+        }
+
+        resourceId = ridBuilder.build();
+    }
+
+    /**
+     * Get ridBuilder instance.
+     *
+     * @return ResourceId.Builder of target OPENCONFIG
+     */
+    public ResourceId.Builder getResourceIdBuilder() {
+        try {
+            return resourceId.copyBuilder();
+        } catch (CloneNotSupportedException e) {
+            log.error("Exception thrown", e);
+            return null;
+        }
+    }
+
+    /**
+     * Add Annotation for annotaedNodeinfos.
+     *
+     * @param key String of Annotation's key
+     * @param value String of Annotation's value
+     */
+    public void addAnnotation(String key, String value) {
+        AnnotatedNodeInfo.Builder builder = DefaultAnnotatedNodeInfo.builder();
+
+        AnnotatedNodeInfo preAnnotate = annotatedNodeInfos.stream()
+                                        .filter(annotatedNodeInfo -> annotatedNodeInfo.resourceId()
+                                                                     .equals(resourceId))
+                                        .findFirst()
+                                        .orElse(null);
+
+        if (preAnnotate != null) {
+             annotatedNodeInfos.remove(preAnnotate);
+             for (Annotation annotation : preAnnotate.annotations()) {
+                  builder.addAnnotation(annotation);
+             }
+        }
+
+        annotatedNodeInfos.add(builder.addAnnotation(new DefaultAnnotation(key, value))
+                                      .resourceId(resourceId)
+                                      .build());
+    }
+
+    /**
+     * Get annotatedNodeInfos instance.
+     *
+     * @return List<AnnotatedNodeInfo> of all OPENCONFIG
+     */
+    public List<AnnotatedNodeInfo> getAnnotatedNodeInfoList() {
+        return annotatedNodeInfos;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandler.java
new file mode 100755
index 0000000..728a596
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTerminalDeviceHandler.java
@@ -0,0 +1,78 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigterminaldevice.rev20161222.openconfigterminaldevice.terminaldevicetop.DefaultTerminalDevice;
+
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.AnnotatedNodeInfo;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.stream.Collectors;
+import com.google.common.collect.ImmutableList;
+
+import static org.onosproject.odtn.utils.YangToolUtil.toCharSequence;
+import static org.onosproject.odtn.utils.YangToolUtil.toCompositeData;
+import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
+import static org.onosproject.odtn.utils.YangToolUtil.toResourceData;
+import static org.onosproject.odtn.utils.YangToolUtil.toXmlCompositeStream;
+
+/**
+ * Utility class to deal with OPENCONFIG TerminalDevice ModelObject & Annotation.
+ */
+public final class OpenConfigTerminalDeviceHandler
+        extends OpenConfigObjectHandler<DefaultTerminalDevice> {
+
+    private static final String OPENCONFIG_NAME = "terminal-device";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/terminal-device";
+
+    /**
+     * OpenConfigTerminalDeviceHandler Constructor.
+     */
+    public OpenConfigTerminalDeviceHandler() {
+        modelObject = new DefaultTerminalDevice();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, null);
+        annotatedNodeInfos = new ArrayList<AnnotatedNodeInfo>();
+    }
+
+    /**
+     * Add LogicalChannels to modelObject of target OPENCONFIG.
+     *
+     * @param logicalChannels OpenConfigLogicalChannelsHandler having LogicalChannels to be set for
+     *                        modelObject
+     * @return OpenConfigTerminalDeviceHandler of target OPENCONFIG
+     */
+    public OpenConfigTerminalDeviceHandler addLogicalChannels(
+                                           OpenConfigLogicalChannelsHandler logicalChannels) {
+        modelObject.logicalChannels(logicalChannels.getModelObject());
+        return this;
+    }
+
+    /**
+     * Get List<CharSequence> of target OPENCONFIG.
+     *
+     * @return List<CharSequence> of target OPENCONFIG
+     */
+    public List<CharSequence> getListCharSequence() {
+        return ImmutableList.of(toDataNode((ModelObject) getModelObject())).stream()
+                            .map(node -> toCharSequence(toXmlCompositeStream(
+                                         toCompositeData(toResourceData(
+                                                         ResourceId.builder().build(), node),
+                                         annotatedNodeInfos))))
+                            .collect(Collectors.toList());
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandler.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandler.java
new file mode 100755
index 0000000..562cb25
--- /dev/null
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/OpenConfigTransceiverHandler.java
@@ -0,0 +1,52 @@
+/*
+ * 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.openconfig;
+
+import org.onosproject.yang.gen.v1.openconfigplatformtransceiver.rev20170708.openconfigplatformtransceiver.porttransceivertop.DefaultTransceiver;
+
+/**
+ * Utility class to deal with OPENCONFIG Transceiver ModelObject & Annotation.
+ */
+public final class OpenConfigTransceiverHandler
+        extends OpenConfigObjectHandler<DefaultTransceiver> {
+
+    private static final String OPENCONFIG_NAME = "transceiver";
+    private static final String NAME_SPACE = "http://openconfig.net/yang/platform/transceiver";
+
+    /**
+     * OpenConfigTransceiverHandler Constructor.
+     *
+     * @param parent OpenConfigComponentHandler of parent OPENCONFIG(component)
+     */
+    public OpenConfigTransceiverHandler(OpenConfigComponentHandler parent) {
+        modelObject = new DefaultTransceiver();
+        setResourceId(OPENCONFIG_NAME, NAME_SPACE, null, parent.getResourceIdBuilder());
+        annotatedNodeInfos = parent.getAnnotatedNodeInfoList();
+
+        parent.addTransceiver(this);
+    }
+
+    /**
+     * Add Config to modelObject of target OPENCONFIG.
+     *
+     * @param config OpenConfigConfigOfTransceiverHandler having Config to be set for modelObject
+     * @return OpenConfigTransceiverHandler of target OPENCONFIG
+     */
+    public OpenConfigTransceiverHandler addConfig(OpenConfigConfigOfTransceiverHandler config) {
+        modelObject.config(config.getModelObject());
+        return this;
+    }
+}
diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java
old mode 100644
new mode 100755
index 66ca6cd..17220e0
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/openconfig/Transceiver.java
@@ -15,8 +15,6 @@
  */
 package org.onosproject.odtn.utils.openconfig;
 
-import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
-
 import java.util.List;
 
 import org.onosproject.yang.gen.v1.openconfigplatform.rev20161222.openconfigplatform.platformcomponenttop.DefaultComponents;
@@ -32,6 +30,8 @@
 import com.google.common.annotations.Beta;
 import com.google.common.collect.ImmutableList;
 
+import static org.onosproject.odtn.utils.YangToolUtil.toDataNode;
+
 /**
  * Utility methods dealing with OpenConfig transceiver.
  * <p>
@@ -40,27 +40,6 @@
 @Beta
 public abstract class Transceiver {
 
-    public static List<DataNode> enable(String componentName, boolean enable) {
-
-        DefaultComponents components = new DefaultComponents();
-
-        Component component = PlainPlatform.componentWithName(componentName);
-        components.addToComponent(component);
-
-        // augmented 'component' shim
-        DefaultAugmentedOcPlatformComponent tcomponent = new DefaultAugmentedOcPlatformComponent();
-
-        DefaultTransceiver transceiver = new DefaultTransceiver();
-
-        Config configt = new DefaultConfig();
-        configt.enabled(enable); // phase 1.0 flag
-        transceiver.config(configt);
-        tcomponent.transceiver(transceiver);
-        component.addAugmentation(tcomponent);
-
-        return ImmutableList.of(toDataNode(components));
-    }
-
     public static List<DataNode> preconf(String componentName) {
         DefaultComponents components = new DefaultComponents();
 
