diff --git a/apps/yms/app/src/test/java/org/onosproject/yms/app/ydt/YdtTestUtils.java b/apps/yms/app/src/test/java/org/onosproject/yms/app/ydt/YdtTestUtils.java
new file mode 100644
index 0000000..f375c1a
--- /dev/null
+++ b/apps/yms/app/src/test/java/org/onosproject/yms/app/ydt/YdtTestUtils.java
@@ -0,0 +1,1792 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.yms.app.ydt;
+
+import org.junit.Rule;
+import org.junit.rules.ExpectedException;
+import org.onosproject.yms.app.ydt.exceptions.YdtException;
+import org.onosproject.yms.app.ysr.TestYangSchemaNodeProvider;
+import org.onosproject.yms.app.ysr.YangSchemaRegistry;
+import org.onosproject.yms.ydt.YdtContext;
+import org.onosproject.yms.ydt.YdtContextOperationType;
+import org.onosproject.yms.ydt.YdtListener;
+import org.onosproject.yms.ydt.YdtType;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A1;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A2;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A2L;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A3;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A4;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A5;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A5L;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A6;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.A6L;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.BACKSLASH;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.BIT;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.BITNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.BOOL;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.BOOLNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT16;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT32;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT64;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSINT8;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT16;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT32;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT64;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.CAPSUINT8;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.COUSTOMNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.EMPNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.EMPTY;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.EMPTYNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.ENUM;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.ENUMNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.E_LEAF;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.IETF;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.IETFNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.INT16NS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.INT32NS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.INT64NS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.INT8NS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.INV;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.LIST;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.LISTNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.LWC;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MATERIALNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT16;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT32;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT64;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MAXUINT8;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MERCHNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MINVALUE;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.MRV;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.NIWMF;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.NWF;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.PERIOD;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.PIWMF;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.PURCHASNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.PWF;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SINT16;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SINT32;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SLINK;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLINT64;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLINT8;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLUINT64;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SMALLUINT8;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.STP;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SUINT16;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.SUINT32;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.TOPONS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.TRADNS;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.TYPE;
+import static org.onosproject.yms.app.ydt.YdtTestConstants.WAREHNS;
+import static org.onosproject.yms.ydt.YdtContextOperationType.DELETE;
+import static org.onosproject.yms.ydt.YdtContextOperationType.MERGE;
+
+public class YdtTestUtils implements YdtListener {
+
+    private static List<String> kValList = new ArrayList<>();
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
+    private static YangSchemaRegistry schemaRegistry;
+
+    private static TestYangSchemaNodeProvider schemaProvider =
+            new TestYangSchemaNodeProvider();
+
+    // Logger list is used for walker testing.
+    private static final List<String> LOGGER = new ArrayList<>();
+
+    /**
+     * Returns the LOGGER with log for testing the YDT walker.
+     *
+     * @return list of logs
+     */
+    public static List<String> getLogger() {
+        return LOGGER;
+    }
+
+    /**
+     * Clear the LOGGER array.
+     */
+    public static void resetLogger() {
+        LOGGER.clear();
+    }
+
+    @Override
+    public void enterYdtNode(YdtContext ydtContext) {
+        LOGGER.add("Entry Node is " + ydtContext.getName() + PERIOD);
+    }
+
+    @Override
+    public void exitYdtNode(YdtContext ydtContext) {
+        LOGGER.add("Exit Node is " + ydtContext.getName() + PERIOD);
+    }
+
+    /**
+     * Returns schema registry of YDT.
+     *
+     * @return schema registry
+     */
+    public static YangSchemaRegistry getSchemaRegistry() {
+        return schemaRegistry;
+    }
+
+    /**
+     * Sets the ydt schema registry.
+     *
+     * @param registry schema registry
+     */
+    public static void setSchemaRegistry(YangSchemaRegistry registry) {
+        schemaRegistry = registry;
+    }
+
+    /**
+     * Returns the ydt builder for food module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench foodArenaYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("foodarena", "food", "ydt.food", MERGE);
+        ydtBuilder.addChild("food", "ydt.food");
+//        ydtBuilder.addChild("snack", null, "ydt.food");
+//        ydtBuilder.addChild("latenight", null, "ydt.food");
+        ydtBuilder.addLeaf("chocolate", "ydt.food", "dark");
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for yms-ietf-network module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench ietfNetwork1Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(IETF, IETF, IETFNS, MERGE);
+        // Adding container
+        ydtBuilder.addChild("networks", null);
+        // Adding list inside container
+        ydtBuilder.addChild("network", null);
+        // Adding key element network Id
+        ydtBuilder.addLeaf("network-id", null, "network1");
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("supporting-network", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("node", null);
+        // Adding key element node-id
+        ydtBuilder.addLeaf("node-id", null, "node1");
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("supporting-node", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network3");
+        ydtBuilder.traverseToParent();
+
+        // Adding key element node-ref
+        ydtBuilder.addLeaf("node-ref", null, "network4");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding container
+        ydtBuilder.addChild("networks-state", null);
+        // Adding list inside container
+        ydtBuilder.addChild("network", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network5");
+        ydtBuilder.traverseToParent();
+        // Adding leaf server-provided
+        ydtBuilder.addLeaf("server-provided", null, "true");
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for yms-ietf-network-topology module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench ietfNetworkTopologyYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(IETF, IETF, IETFNS, MERGE);
+        // Adding container
+        ydtBuilder.addChild("networks", IETFNS, MERGE);
+        // Adding list inside container
+        ydtBuilder.addChild("network", IETFNS, MERGE);
+
+        // Adding key element network Id
+        ydtBuilder.addLeaf("network-id", null, "network1");
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("id1");
+        // adding the augmented node
+        ydtBuilder.addMultiInstanceChild("link", TOPONS, kValList, MERGE);
+        // container source
+        ydtBuilder.addChild("source", TOPONS, MERGE);
+        ydtBuilder.addLeaf("source-node", null, "source1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("source-tp", null, "source2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // container destination
+        ydtBuilder.addChild("destination", TOPONS, MERGE);
+        ydtBuilder.addLeaf("dest-node", null, "dest1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("dest-tp", null, "dest2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("network1");
+        kValList.add("id2");
+        // adding the supporting-link list node
+        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("network2");
+        kValList.add("id3");
+        // adding the supporting-link list another instance
+        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("supporting-network", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("node", null);
+        // Adding key element node-id
+        ydtBuilder.addLeaf("node-id", null, "node1");
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("tp_id1");
+        //adding augmented termination-point list
+        ydtBuilder.addMultiInstanceChild("t-point", TOPONS,
+                                         kValList, MERGE);
+        kValList.clear();
+        kValList.add("network-ref");
+        kValList.add("node-ref");
+        kValList.add("tp-ref");
+        //adding supporting-termination-point
+        ydtBuilder.addMultiInstanceChild(STP, TOPONS, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("supporting-node", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network3");
+        ydtBuilder.traverseToParent();
+
+        // Adding key element node-ref
+        ydtBuilder.addLeaf("node-ref", null, "network4");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("link-id", TOPONS, "id1");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding container
+        ydtBuilder.addChild("networks-state", null);
+        // Adding list inside container
+        ydtBuilder.addChild("network", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network5");
+        ydtBuilder.traverseToParent();
+        // Adding leaf server-provided
+        ydtBuilder.addLeaf("server-provided", null, "true");
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for augmented module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench augmentNetworkYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(IETF, IETF, IETFNS, MERGE);
+        // Adding container
+        ydtBuilder.addChild("networks", IETFNS, MERGE);
+        // Adding list inside container
+        ydtBuilder.addChild("network", IETFNS, MERGE);
+
+        // Adding key element network Id
+        ydtBuilder.addLeaf("network-id", null, "network1");
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("id1");
+        // adding the augmented node
+        ydtBuilder.addMultiInstanceChild("link", TOPONS, kValList, MERGE);
+        // container source
+        ydtBuilder.addChild("source", TOPONS, MERGE);
+        ydtBuilder.addLeaf("source-node", null, "source1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("source-tp", null, "source2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // container destination
+        ydtBuilder.addChild("destination", TOPONS, MERGE);
+        ydtBuilder.addLeaf("dest-node", null, "dest1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("dest-tp", null, "dest2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("network1");
+        kValList.add("id2");
+        // adding the supporting-link list node
+        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("network2");
+        kValList.add("id3");
+        // adding the supporting-link list another instance
+        ydtBuilder.addMultiInstanceChild(SLINK, TOPONS, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("1");
+        ydtBuilder.addMultiInstanceChild("augment1", A1, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("1");
+        kValList.add("2");
+        ydtBuilder.addMultiInstanceChild("augment2", A2, kValList, MERGE);
+
+        ydtBuilder.addChild("augment5", A5, DELETE);
+
+        ydtBuilder.addMultiInstanceChild(A6L, A6, kValList, DELETE);
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("value5", null, "5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addMultiInstanceChild(A5L, A5, kValList, DELETE);
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("augment3", A3, MERGE);
+
+        ydtBuilder.addChild("augment4", A4, DELETE);
+        ydtBuilder.addLeaf("value4", null, "4");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("augment5", A5, MERGE);
+
+        ydtBuilder.addLeaf("leaf6", A6, "6");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("value5", null, "5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("augment6", A6, DELETE);
+        ydtBuilder.addLeaf("value6", null, "6");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("value3", null, "3");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("augment3leaf", A3, "3");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addMultiInstanceChild(A2L, A2, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("supporting-network", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("node", null);
+        // Adding key element node-id
+        ydtBuilder.addLeaf("node-id", null, "node1");
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("tp_id1");
+        //adding augmented termination-point list
+        ydtBuilder.addMultiInstanceChild("t-point", TOPONS,
+                                         kValList, MERGE);
+        kValList.clear();
+        kValList.add("network-ref");
+        kValList.add("node-ref");
+        kValList.add("tp-ref");
+        //adding supporting-termination-point
+        ydtBuilder.addMultiInstanceChild(STP, TOPONS, kValList, MERGE);
+
+        // Adding augmented container1 inside supporting-termination-point
+        augmentTerminationPointYdt(ydtBuilder);
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Adds augments inside supporting-termination-point in augmented module.
+     *
+     * @param ydtBuilder ydt builder which need to be updated
+     */
+    private static void augmentTerminationPointYdt(YangRequestWorkBench ydtBuilder) {
+
+        ydtBuilder.addChild("augment1", A1);
+        ydtBuilder.addLeaf("value1", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("augment1-leaf", A1, "1");
+
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("augment2", A2, MERGE);
+
+        ydtBuilder.addChild("augment3", A3, MERGE);
+        ydtBuilder.addLeaf("value3", null, "3");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("augment4leaf", A4, "4");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("value2", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("1");
+        kValList.add("2");
+        ydtBuilder.addMultiInstanceChild(A2L, A2, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("augment2leaf", A2, "2");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding list inside list
+        ydtBuilder.addChild("supporting-node", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network3");
+        ydtBuilder.traverseToParent();
+
+        // Adding key element node-ref
+        ydtBuilder.addLeaf("node-ref", null, "network4");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("link-id", TOPONS, "id1");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        // Adding container
+        ydtBuilder.addChild("networks-state", null);
+        // Adding list inside container
+        ydtBuilder.addChild("network", null);
+        // Adding key element network-ref
+        ydtBuilder.addLeaf("network-ref", null, "network5");
+        ydtBuilder.traverseToParent();
+        // Adding leaf server-provided
+        ydtBuilder.addLeaf("server-provided", null, "true");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+    }
+
+    /**
+     * Returns the ydt builder for rootlist module with listwithcontainer node
+     * using addMultiInstanceChild interface for adding multi instance node.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench listWithContainerYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
+        kValList.clear();
+        kValList.add("12");
+        kValList.add("12");
+        ydtBuilder.addMultiInstanceChild(LWC, null, kValList, MERGE);
+        ydtBuilder.addLeaf(INV, null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(INV, null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("interface", null);
+        ydtBuilder.addLeaf(INV, null, "12");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("invalid", null, "121");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for rootlist module with listwithcontainer
+     * node using addChild interface for adding multi instance node.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench listWithContainer1Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
+        ydtBuilder.addChild(LWC, null);
+        ydtBuilder.addLeaf("invalid", null, "12");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("invalid1", null, "12");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(INV, null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(INV, null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("interface", null);
+        ydtBuilder.addLeaf(INV, null, "12");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("invalid", null, "121");
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for rootlist module with multiple instances of
+     * listwithcontainer node using addMultiInstanceChild interface for adding
+     * multi instance node.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench listWithContainer2Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
+        kValList.clear();
+        kValList.add("1222");
+        kValList.add("1212");
+        ydtBuilder.addMultiInstanceChild(LWC, null, kValList, MERGE);
+
+        kValList.clear();
+        kValList.add("12");
+        kValList.add("1");
+        ydtBuilder.addMultiInstanceChild(INV, null, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(INV, null, "122");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(INV, null, "2222");
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("1222");
+        kValList.add("1212");
+        ydtBuilder.addMultiInstanceChild(INV, null, kValList, MERGE);
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("interface", null);
+        ydtBuilder.addLeaf(INV, null, "12");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for rootlist module with listwithoutcontainer
+     * node.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench listWithoutContainerYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("list", "rootlist", "ydt.rootlist", MERGE);
+        ydtBuilder.addChild("listwithoutcontainer", null);
+        ydtBuilder.addLeaf(INV, null, "12");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for logisticsmanager module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench logisticsManagerYdt() {
+
+        Set<String> valueSet = new HashSet();
+        valueSet.add("1");
+        valueSet.add("2");
+        valueSet.add("3");
+        valueSet.add("4");
+        valueSet.add("5");
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("logisticsmanager", "customssupervisor",
+                                   null, MERGE);
+        ydtBuilder.addLeaf("supervisor", COUSTOMNS, "abc");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("merchandisersupervisor", MERCHNS, MERGE);
+        ydtBuilder.addLeaf("supervisor", MERCHNS, "abc");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("materialsupervisor", MATERIALNS, MERGE);
+        ydtBuilder.addChild("supervisor", MATERIALNS);
+        ydtBuilder.addLeaf("name", MATERIALNS, "abc");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("departmentId", MATERIALNS, "xyz");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("supervisor", MATERIALNS);
+        ydtBuilder.addLeaf("name", MATERIALNS, "ab");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("departmentId", MATERIALNS, "xy");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("purchasingsupervisor", PURCHASNS, MERGE);
+        ydtBuilder.addChild("supervisor", PURCHASNS);
+        ydtBuilder.addLeaf("purchasing-specialist", PURCHASNS, "abc");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("support", "ydt.purchasing-supervisor", "xyz");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("warehousesupervisor", WAREHNS, MERGE);
+        ydtBuilder.addLeaf("supervisor", WAREHNS, valueSet);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("tradingsupervisor", TRADNS, MERGE);
+        ydtBuilder.addLeaf("supervisor", TRADNS, "abc");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild("employeeid", EMPNS, MERGE);
+        ydtBuilder.addLeaf("employeeid", EMPNS, valueSet);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for bit module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench bitYdt() {
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("builtInType", "bit", "ydt.bit", MERGE);
+        ydtBuilder.addChild("bitList", null);
+        ydtBuilder.addLeaf("bit", null, "disable-nagle");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("bitList", null);
+        ydtBuilder.addLeaf("bit", null, "auto-sense-speed");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("bitList", null);
+        ydtBuilder.addLeaf("bit", null, "ten-Mb-only");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("bitList", null);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for bool module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench booleanYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder("builtInType", "bool", "ydt.boolean", MERGE);
+        ydtBuilder.addChild("booleanList", null);
+        ydtBuilder.addLeaf("boolean", null, "true");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("booleanList", null);
+        ydtBuilder.addLeaf("boolean", null, "false");
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for emptydata module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench emptyTypeYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "builtInType", "emptydata", "ydt.emptydata", MERGE);
+        ydtBuilder.addChild("emptyList", null);
+        ydtBuilder.addLeaf("empty", null, "");
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for enumtest module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench enumYdt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "builtInType", "enumtest", "ydt.enumtest", MERGE);
+        ydtBuilder.addChild("enumList", null);
+        ydtBuilder.addLeaf("enumleaf", null, "ten");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("enumList", null);
+        ydtBuilder.addLeaf("enumleaf", null, "hundred");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("enumList", null);
+        ydtBuilder.addLeaf("enumleaf", null, "thousand");
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for builtin type integer8 module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench integer8Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "builtInType", "integer8", "ydt.integer8", MERGE);
+        ydtBuilder.addLeaf("negInt", null, "-128");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("posInt", null, "127");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("minUInt", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUInt", null, "255");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("UnInteger", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revInteger", null, "-128");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "127");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "255");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for builtin type integer16 module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench integer16Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "builtInType", "integer16", "ydt.integer16", MERGE);
+        ydtBuilder.addLeaf("negInt", null, "-32768");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("posInt", null, "32767");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("minUInt", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUInt", null, "65535");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("UnInteger", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revInteger", null, "-32768");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "32767");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "65535");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for builtin type integer32 module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench integer32Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "builtInType", "integer32", "ydt.integer32", MERGE);
+        ydtBuilder.addLeaf("negInt", null, "-2147483648");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("posInt", null, "2147483647");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("minUInt", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUInt", null, "4294967295");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("UnInteger", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revInteger", null, "-2147483648");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "2147483647");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "4294967295");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for builtin type integer64 module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench integer64Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "builtInType", "integer64", "ydt.integer64", MERGE);
+        ydtBuilder.addLeaf("negInt", null, "-9223372036854775808");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("posInt", null, "9223372036854775807");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("minUInt", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUInt", null, "18446744073709551615");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addLeaf("midUIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minUIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxUIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("integer", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("UnInteger", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("UnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revInteger", null, "-9223372036854775808");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revInteger", null, "9223372036854775807");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "2");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null, YdtType.MULTI_INSTANCE_NODE);
+        ydtBuilder.addLeaf("revUnInteger", null, "18446744073709551615");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder for builtin type decimal64 module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench decimal64Ydt() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "builtInType", "decimal64", "ydt.decimal64", MERGE);
+        ydtBuilder.addLeaf("negInt", null, "-92233720368547758.08");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("posInt", null, "92233720368547758.07");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(NIWMF, null, "-922337203685477580.8");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(PIWMF, null, "922337203685477580.7");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(NWF, null, "-9.223372036854775808");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(PWF, null, "9.223372036854775807");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("midIntWithRange", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("minIntWithRange", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("maxIntWithRange", null, "100");
+        ydtBuilder.traverseToParent();
+
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("decimal", null, "11");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("decimal", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("decimal", null, "40");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("decimal", null, "50");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("decimal", null, "55");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("decimal", null, "100");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revDecimal", null, "-92233720368547758.08");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revDecimal", null, "2.505");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revDecimal", null, "3.14");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revDecimal", null, "10");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revDecimal", null, "20");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revDecimal", null, "92233720368547757");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild(MRV, null);
+        ydtBuilder.addLeaf("revDecimal", null, "92233720368547758.07");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the ydt builder with requested logical root name and module name.
+     *
+     * @param rootName   logical rootNode name
+     * @param moduleName application(module) name
+     * @param nameSpace  namespace of module
+     * @param opType     operation type
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench getYdtBuilder(String rootName, String
+            moduleName, String nameSpace, YdtContextOperationType opType) {
+        setSchemaRegistry(schemaProvider.getDefaultYangSchemaRegistry());
+        YangRequestWorkBench ydtBuilder;
+        schemaProvider.processSchemaRegistry(null);
+        ydtBuilder = new YangRequestWorkBench(
+                rootName, null, null, schemaProvider
+                .getDefaultYangSchemaRegistry(), true);
+        ydtBuilder.addChild(moduleName, nameSpace, opType);
+        return ydtBuilder;
+    }
+
+    /**
+     * Compares the two value sets.
+     */
+    public static void compareValueSet(Set<String> valueSet,
+                                       Set<String> userInputValueSet) {
+        // Check the value against user input.
+        assertTrue("Expected 'valueSet' and 'userInputValueSet' to be equal.",
+                   valueSet.containsAll(userInputValueSet));
+    }
+
+    /**
+     * Returns the ydt builder for Hello_ONOS module.
+     *
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench helloOnos() {
+
+        YangRequestWorkBench ydtBuilder;
+        ydtBuilder = getYdtBuilder(
+                "Hello-ONOS", "Hello_ONOS", "ydt:hello_onos", MERGE);
+        ydtBuilder.addChild("hello-world", null);
+        ydtBuilder.addChild("input", null);
+        ydtBuilder.addLeaf("name", null, "onos");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf("surName", null, "yang");
+        ydtBuilder.traverseToParent();
+
+        kValList.clear();
+        kValList.add("ON");
+        kValList.add("LAB");
+        ydtBuilder.addMultiInstanceChild("stringList", null, kValList,
+                                         MERGE);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+
+        return ydtBuilder;
+    }
+
+    /**
+     * Returns the error message for requested node.
+     *
+     * @param value    value in string format
+     * @param dataType requested data type
+     * @return error string
+     */
+    static String getErrorString(String value, String dataType) {
+        StringBuilder msg = new StringBuilder();
+        switch (dataType) {
+            case SINT16:
+            case SINT32:
+            case SMALLINT8:
+            case SMALLINT64:
+            case SMALLUINT8:
+            case SMALLUINT64:
+            case SUINT16:
+            case SUINT32:
+            case CAPSINT8:
+            case CAPSINT16:
+            case CAPSINT32:
+            case CAPSINT64:
+            case CAPSUINT8:
+            case CAPSUINT16:
+            case CAPSUINT32:
+            case CAPSUINT64:
+            case BIT:
+            case BOOL:
+            case ENUM:
+                msg.append("YANG file error : Input value ").append(BACKSLASH)
+                        .append(value).append(BACKSLASH)
+                        .append(" is not a valid ").append(dataType);
+                break;
+            case EMPTY:
+                msg.append("YANG file error : Input value ").append(BACKSLASH)
+                        .append(value).append(BACKSLASH).append(
+                        " is not allowed for a data type EMPTY");
+                break;
+            case MINVALUE:
+                msg.append("YANG file error : ").append(value)
+                        .append(" is lesser than minimum value ")
+                        .append(MINVALUE).append(PERIOD);
+                break;
+            case MAXUINT8:
+            case MAXUINT16:
+            case MAXUINT32:
+            case MAXUINT64:
+                msg.append("YANG file error : ").append(value)
+                        .append(" is greater than maximum value ")
+                        .append(dataType).append(PERIOD);
+                break;
+            default:
+                return null;
+        }
+        return msg.toString();
+    }
+
+    /**
+     * Validates the error message which is obtained by checking the given
+     * value against its data type restrictions.
+     *
+     * @param name      leaf name
+     * @param nameSpace leaf namespace
+     * @param val       leaf value
+     * @param type      data type suffix string for exception message
+     * @param childName child name
+     */
+    public static void validateErrMsg(String name, String nameSpace,
+                                      String val, String type, String childName) {
+        YangRequestWorkBench ydtBuilder = getTestYdtBuilder(nameSpace);
+        boolean isExpOccurred = false;
+        /*
+         * If childName exist then leaf need to be added under the
+         * child node with the given childName
+         */
+        if (childName != null) {
+            ydtBuilder.addChild(childName, nameSpace);
+        }
+        /*
+         * This try catch is explicitly written to use as utility in other
+         * test cases.
+         */
+        try {
+            ydtBuilder.addLeaf(name, nameSpace, val);
+        } catch (YdtException e) {
+            isExpOccurred = true;
+            assertEquals(e.getMessage(), getErrorString(val, type));
+        }
+        assertEquals(E_LEAF + name, isExpOccurred, true);
+    }
+
+    /**
+     * Returns ydt builder for requested namespace.
+     *
+     * @param namespace namespace of the requested yang data tree
+     * @return ydt builder
+     */
+    public static YangRequestWorkBench getTestYdtBuilder(String namespace) {
+
+        switch (namespace) {
+            case INT8NS:
+                return getYdtBuilder(TYPE, "integer8", INT8NS, MERGE);
+            case INT16NS:
+                return getYdtBuilder(TYPE, "integer16", INT16NS, MERGE);
+            case INT32NS:
+                return getYdtBuilder(TYPE, "integer32", INT32NS, MERGE);
+            case INT64NS:
+                return getYdtBuilder(TYPE, "integer64", INT64NS, MERGE);
+            case BITNS:
+                return getYdtBuilder(TYPE, "bit", BITNS, MERGE);
+            case BOOLNS:
+                return getYdtBuilder(TYPE, "bool", BOOLNS, MERGE);
+            case EMPTYNS:
+                return getYdtBuilder(TYPE, "emptydata", EMPTYNS, MERGE);
+            case ENUMNS:
+                return getYdtBuilder(TYPE, "enumtest", ENUMNS, MERGE);
+            case LISTNS:
+                return getYdtBuilder(LIST, "rootlist", LISTNS, MERGE);
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * Validates the contents of node like name, namespace and operation type.
+     *
+     * @param ydtNode node need to be validate
+     * @param name    name of the node
+     * @param opType  operation type of the node
+     */
+    public static void validateNodeContents(YdtNode ydtNode, String name,
+                                            YdtContextOperationType opType) {
+        assertEquals(ydtNode.getName(), name);
+        assertEquals(ydtNode.getYdtContextOperationType(), opType);
+    }
+
+    /**
+     * Validates the contents of leaf node like name, namespace and operation
+     * type.
+     *
+     * @param ydtNode node need to be validate
+     * @param name    name of the node
+     * @param value   value of the leaf node
+     */
+    public static void validateLeafContents(YdtNode ydtNode, String name,
+                                            String value) {
+        validateNodeContents(ydtNode, name, null);
+        assertEquals(ydtNode.getValue(), value);
+    }
+
+    /**
+     * Validates the contents of leaf-list node like name, namespace and
+     * operation type.
+     *
+     * @param ydtNode  node need to be validate
+     * @param name     name of the node
+     * @param valueSet value of the leaf node
+     */
+    public static void validateLeafListContents(YdtNode ydtNode, String name,
+                                                Set<String> valueSet) {
+        validateNodeContents(ydtNode, name, null);
+        compareValueSet(ydtNode.getValueSet(), valueSet);
+    }
+
+    /**
+     * Validates the contents of ydt application logical node.
+     *
+     * @param ydtAppNode node need to be validate
+     */
+    public static void validateAppLogicalNodeContents(
+            YdtAppContext ydtAppNode) {
+
+        assertNull(ydtAppNode.getOperationType());
+        assertNull(ydtAppNode.getParent());
+        assertNull(ydtAppNode.getNextSibling());
+        assertNull(ydtAppNode.getPreviousSibling());
+        assertNotNull(ydtAppNode.getFirstChild());
+        assertNotNull(ydtAppNode.getLastChild());
+    }
+
+    /**
+     * Validates the contents of ydt application module node.
+     *
+     * @param ydtAppNode node need to be validate
+     * @param name       name of the node
+     * @param opType     operation type of the app node
+     */
+    public static void validateAppModuleNodeContents(
+            YdtAppContext ydtAppNode, String name,
+            YdtAppNodeOperationType opType) {
+
+        assertEquals(ydtAppNode.getModuleContext().getName(), name);
+        assertEquals(ydtAppNode.getOperationType(), opType);
+    }
+
+    /**
+     * Validates the contents of ydt application node like name, namespace
+     * and operation type.
+     *
+     * @param ydtAppNode node need to be validate
+     * @param name       name of the schema node
+     * @param ns         namespace of the schema node
+     * @param opType     operation type of the app node
+     */
+    public static void validateAppNodeContents(
+            YdtAppContext ydtAppNode, String name, String ns,
+            YdtAppNodeOperationType opType) {
+        assertEquals(ydtAppNode.getAugmentingSchemaNode().getName(), name);
+        assertEquals(ydtAppNode.getAugmentingSchemaNode().getNameSpace(), ns);
+        assertEquals(ydtAppNode.getOperationType(), opType);
+    }
+
+    /**
+     * Walks in the given built ydt and validates it.
+     */
+    public static void walkINTree(YangRequestWorkBench ydtBuilder,
+                                  String[] expected) {
+        DefaultYdtWalker ydtWalker = new DefaultYdtWalker();
+        resetLogger();
+
+        YdtTestUtils utils = new YdtTestUtils();
+        // Assign root node as starting node to walk the whole tree.
+        ydtWalker.walk(utils, ydtBuilder.getRootNode());
+        // Logger list is used for walker testing.
+        List<String> logger = getLogger();
+
+        for (int i = 0; i < expected.length; i++) {
+            assertEquals(expected[i], logger.get(i));
+        }
+    }
+}
