diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/DataNodeListener.java b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/DataNodeListener.java
new file mode 100644
index 0000000..dd498c9
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/DataNodeListener.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2017-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.yang.runtime.helperutils;
+
+import org.onosproject.yang.model.DataNode;
+
+/**
+ * Abstraction of an entity which provide call back methods which are called
+ * by data node walker while walking the data tree.
+ * <p>
+ * This interface needs to be implemented by protocol implementing listener's
+ * based call backs while data walk.
+ */
+public interface DataNodeListener {
+
+    /**
+     * Data node's entry, it will be called during a node entry.
+     * All the related information about the node can be obtain from the node.
+     *
+     * @param node data node
+     */
+    //TODO add additional context which may contain information like location
+    // of multi instance node in map to later let json serializer use this.
+    void enterDataNode(DataNode node);
+
+    /**
+     * Data node's exit, it will be called during a node exit.
+     * All the related information about the node can be obtain from the node.
+     *
+     * @param node data node
+     */
+    //TODO add additional context which may contain information like location
+    // of multi instance node in map to later let json serializer use this.
+    void exitDataNode(DataNode node);
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/DefaultDataNodeWalker.java b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/DefaultDataNodeWalker.java
new file mode 100644
index 0000000..eaebb54
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/DefaultDataNodeWalker.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2017-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.yang.runtime.helperutils;
+
+
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.NodeKey;
+
+import java.util.Map;
+
+/**
+ * Represents implementation of data node walker, which walks the data tree.
+ */
+public final class DefaultDataNodeWalker {
+
+    // Forbid construction.
+    private DefaultDataNodeWalker() {
+    }
+
+    /**
+     * Walks the data node tree from given node.
+     *
+     * @param listener data node listener implemented by the protocol
+     * @param node     root node of data tree
+     */
+    public static void walk(DataNodeListener listener, DataNode node) {
+
+        listener.enterDataNode(node);
+        // Walking all child's of given root node.
+        walkChildNode(listener, node);
+        listener.exitDataNode(node);
+    }
+
+    /**
+     * Walks the all child nodes of given root node.
+     *
+     * @param listener data node listener implemented by the protocol
+     * @param node     root node of data tree
+     */
+    private static void walkChildNode(DataNodeListener listener, DataNode node) {
+        Map<NodeKey, DataNode> childMap;
+        if (node instanceof InnerNode) {
+            childMap = ((InnerNode) node).childNodes();
+            for (Map.Entry<NodeKey, DataNode> entry : childMap.entrySet()) {
+                DataNode n = entry.getValue();
+                listener.enterDataNode(n);
+                if (n instanceof InnerNode) {
+                    walkChildNode(listener, n);
+                }
+                listener.exitDataNode(n);
+            }
+        }
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/ExtResourceIdBldr.java b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/ExtResourceIdBldr.java
index 6db16ab..4d06677 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/ExtResourceIdBldr.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/ExtResourceIdBldr.java
@@ -55,8 +55,6 @@
      */
     void traveseToParent() {
         if (curKeyBuilder != null) {
-            curKeyBuilder = null;
-        } else {
             curKeyBuilder = builders.get(builders.size() - 1);
             builders.remove(builders.size() - 1);
         }
@@ -109,14 +107,13 @@
                     ridBldr.addKeyLeaf(sId.name(), sId.namespace(),
                                        kl.leafValue());
                 }
-                continue;
             } else if (k instanceof LeafListKey) {
                 sId = k.schemaId();
                 ridBldr.addLeafListBranchPoint(sId.name(), sId.namespace(),
                                                ((LeafListKey) k).value());
-                continue;
+            } else {
+                ridBldr.addBranchPointSchema(sId.name(), sId.namespace());
             }
-            ridBldr.addBranchPointSchema(sId.name(), sId.namespace());
         }
         return ridBldr;
     }
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/SerializerHelper.java b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/SerializerHelper.java
index 3245a56..4449d5c 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/SerializerHelper.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/SerializerHelper.java
@@ -19,6 +19,7 @@
 import org.onosproject.yang.compiler.datamodel.YangLeaf;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.LeafNode;
 import org.onosproject.yang.model.LeafSchemaContext;
 import org.onosproject.yang.model.ListSchemaContext;
 import org.onosproject.yang.model.ResourceId;
@@ -112,7 +113,6 @@
             }
             DataNode.Type type = child.getType();
             updateResourceId(builder, name, value, child, type);
-            builder.appInfo(child);
         } catch (IllegalArgumentException e) {
             throw new IllegalArgumentException(e.getMessage());
         }
@@ -125,9 +125,12 @@
      * with key's value.
      * <p>
      * Builder and name are mandatory inputs, In case namespace is null,
-     * namespace of last key in the keylist of resource identifier builder will
+     * namespace of last key in the key list of resource identifier builder will
      * be used. Value should only be provided for leaf-list/list.
      * <p>
+     * In case of list its mandatory to pass either all key values of list or
+     * non of them (wild card to support get operation).
+     * <p>
      * This API will also carry out necessary schema related validations.
      *
      * @param builder   resource identifier builder
@@ -159,27 +162,29 @@
                 // Adding list node.
                 String v = null;
                 builder = addToResourceId(builder, name, namespace, v);
-                Set<String> keyLeafs = ((ListSchemaContext) child)
-                        .getKeyLeaf();
-                try {
-                    checkElementCount(name, keyLeafs.size(), value.size());
-                } catch (IllegalArgumentException e) {
-                    throw new IllegalArgumentException(e.getMessage());
-                }
+                if (value != null && value.size() != 0) {
+                    Set<String> keyLeafs = ((ListSchemaContext) child)
+                            .getKeyLeaf();
+                    try {
+                        checkElementCount(name, keyLeafs.size(), value.size());
+                    } catch (IllegalArgumentException e) {
+                        throw new IllegalArgumentException(e.getMessage());
+                    }
 
-                // After validation adding the key nodes under the list node.
-                Iterator<String> sklIter = keyLeafs.iterator();
-                Iterator<String> kvlIter = value.iterator();
-                String keyEleName;
+                    // After validation adding the key nodes under the list node.
+                    Iterator<String> sklIter = keyLeafs.iterator();
+                    Iterator<String> kvlIter = value.iterator();
+                    String keyEleName;
 
-                while (kvlIter.hasNext()) {
-                    String val = kvlIter.next();
-                    keyEleName = sklIter.next();
-                    SchemaContext keyChild = getChildSchemaContext(
-                            (SchemaContext) builder.appInfo(), keyEleName,
-                            namespace);
-                    valObject = ((LeafSchemaContext) keyChild).fromString(val);
-                    builder.addKeyLeaf(keyEleName, namespace, valObject);
+                    while (kvlIter.hasNext()) {
+                        String val = kvlIter.next();
+                        keyEleName = sklIter.next();
+                        SchemaContext keyChild = getChildSchemaContext(
+                                (SchemaContext) builder.appInfo(), keyEleName,
+                                namespace);
+                        valObject = ((LeafSchemaContext) keyChild).fromString(val);
+                        builder.addKeyLeaf(keyEleName, namespace, valObject);
+                    }
                 }
             } else {
                 throw new IllegalArgumentException(
@@ -188,6 +193,7 @@
         } catch (IllegalArgumentException e) {
             throw new IllegalArgumentException(e.getMessage());
         }
+
         builder.appInfo(child);
         return builder;
     }
@@ -211,8 +217,9 @@
         info.setResourceIdBuilder(null);
         info.setParentResourceIdBldr(rIdBldr);
         SchemaId sId = node.getSchemaId();
+        // Creating a dummy node
         InnerNode.Builder dBldr = InnerNode.builder(
-                sId.name(), sId.namespace());
+                sId.name(), sId.namespace()).type(node.getType());
         dBldr.appInfo(info);
         return dBldr;
     }
@@ -264,23 +271,30 @@
                                       String name, String namespace,
                                       String value, DataNode.Type type) {
         try {
+            Object valObject;
             SchemaContext node;
             ExtResourceIdBldr rIdBldr;
             HelperContext nodeInfo;
+            boolean initWithRId = false;
             HelperContext info = (HelperContext) builder.appInfo();
             ExtResourceIdBldr curBldr = info.getResourceIdBuilder();
-            boolean isCreate = false;
+
             if (curBldr != null) {
                 rIdBldr = info.getResourceIdBuilder();
                 node = (SchemaContext) rIdBldr.appInfo();
-                isCreate = true;
+                nodeInfo = new HelperContext();
+                initWithRId = true;
             } else {
+                // If data node is initialized by resource id.
                 node = (SchemaContext) info.getParentResourceIdBldr().appInfo();
                 rIdBldr = info.getParentResourceIdBldr();
+                nodeInfo = info;
             }
+
             SchemaContext childSchema = getChildSchemaContext(
                     node, name, namespace);
             DataNode.Type nodeType = childSchema.getType();
+
             if (type != null && !nodeType.equals(type)) {
                 throw new IllegalArgumentException(
                         errorMsg(FMT_NOT_EXIST, name));
@@ -289,15 +303,43 @@
             // Updating the namespace
             namespace = childSchema.getSchemaId().namespace();
             updateResourceId(rIdBldr, name, value, childSchema, nodeType);
-            Object valObject;
-            if (isCreate) {
+
+            if (!initWithRId) {
+                /*
+                 * Adding first data node in case of if data node initialized
+                 * with resource id builder.
+                 */
+                // TODO check based on type, handle leaf without value scenario
+                // also handle list without key leaf scenario.
                 switch (nodeType) {
 
-                    case SINGLE_INSTANCE_NODE:
-                    case MULTI_INSTANCE_NODE:
-                        builder = builder.createChildBuilder(name, namespace)
-                                .type(nodeType);
+                    case SINGLE_INSTANCE_LEAF_VALUE_NODE:
+                        if (((YangLeaf) childSchema).isKeyLeaf()) {
+                            throw new IllegalArgumentException(E_RESID);
+                        }
+                        valObject = ((LeafSchemaContext) childSchema)
+                                .fromString(value);
+                        builder = LeafNode.builder(name, namespace).type(nodeType)
+                                .value(valObject);
                         break;
+                    case MULTI_INSTANCE_LEAF_VALUE_NODE:
+                        valObject = ((LeafSchemaContext) childSchema)
+                                .fromString(value);
+                        builder = LeafNode.builder(name, namespace).type(nodeType)
+                                .value(valObject);
+                        builder = builder.addLeafListValue(valObject);
+                        break;
+                    default:
+                    /*
+                     * Can't update the node key in dummy data node as
+                     * keybuilder will be initialized only once when
+                     * InnerNode.builder call is made with name and namespace.
+                     */
+                        builder = InnerNode.builder(name, namespace).type(nodeType);
+                        break;
+                }
+            } else {
+                switch (nodeType) {
                     case SINGLE_INSTANCE_LEAF_VALUE_NODE:
                         valObject = ((LeafSchemaContext) childSchema)
                                 .fromString(value);
@@ -312,19 +354,15 @@
                         valObject = ((LeafSchemaContext) childSchema)
                                 .fromString(value);
                         builder = builder.createChildBuilder(
-                                name, namespace, valObject).type(nodeType)
-                                .addLeafListValue(valObject);
+                                name, namespace, valObject).type(nodeType);
+                        builder = builder.addLeafListValue(valObject);
                         break;
                     default:
-                        throw new IllegalArgumentException(
-                                errorMsg(FMT_NOT_EXIST, name));
+                        builder = builder.createChildBuilder(name, namespace)
+                                .type(nodeType);
                 }
-
-                nodeInfo = new HelperContext();
-            } else {
-                builder.type(nodeType);
-                nodeInfo = info;
             }
+
             nodeInfo.setResourceIdBuilder(rIdBldr);
             builder.appInfo(nodeInfo);
         } catch (IllegalArgumentException e) {
@@ -343,6 +381,9 @@
      */
     public static ResourceId getResourceId(Builder builder) {
         HelperContext info = (HelperContext) builder.appInfo();
+        if (info.getParentResourceIdBldr() != null) {
+            return info.getParentResourceIdBldr().getResourceId();
+        }
         return info.getResourceIdBuilder().getResourceId();
     }
 
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
index 8b8c058..b17981a 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
@@ -29,7 +29,9 @@
 import org.onosproject.yang.model.ResourceId;
 import org.onosproject.yang.model.SchemaContext;
 import org.onosproject.yang.model.SchemaId;
+import org.onosproject.yang.runtime.helperutils.DataNodeListener;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import static org.junit.Assert.assertEquals;
@@ -38,8 +40,9 @@
 import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE;
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.helperutils.DefaultDataNodeWalker.walk;
 
-public final class TestUtils {
+public final class TestUtils implements DataNodeListener {
 
     /**
      * Restricts creation of test utils instance.
@@ -47,6 +50,37 @@
     private TestUtils() {
     }
 
+    public static final String PERIOD = ".";
+
+    // Logger list is used for walker testing.
+    private static final List<String> LOGGER = new ArrayList<>();
+
+    @Override
+    public void enterDataNode(DataNode node) {
+        LOGGER.add("Entry Node is " + node.key().schemaId().name() + PERIOD);
+    }
+
+    @Override
+    public void exitDataNode(DataNode node) {
+        LOGGER.add("Exit Node is " + node.key().schemaId().name() + PERIOD);
+    }
+
+    /**
+     * 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();
+    }
+
     /**
      * Checks the schema context values of given leaf node.
      */
@@ -135,7 +169,12 @@
                     j++;
                 }
             } else if (k instanceof LeafListKey) {
-                val = ((LeafListKey) k).value().toString();
+                if (((LeafListKey) k).value() == null) {
+                    assertNull(valA[j]);
+                    val = null;
+                } else {
+                    val = ((LeafListKey) k).value().toString();
+                }
             }
             if (val != null) {
                 assertEquals(val, valA[j]);
@@ -162,15 +201,19 @@
         assertEquals(id.name(), n);
         assertEquals(id.namespace(), ns);
         if (node instanceof InnerNode) {
-            assertEquals(((InnerNode) node).type(), type);
+            assertEquals(node.type(), type);
             if (isChild) {
                 assertNotNull(((InnerNode) node).childNodes());
             } else {
                 assertNull(((InnerNode) node).childNodes());
             }
         } else {
-            assertEquals(((LeafNode) node).type(), type);
-            assertEquals(((LeafNode) node).value().toString(), value);
+            assertEquals(node.type(), type);
+            if (((LeafNode) node).value() == null) {
+                assertNull(value);
+            } else {
+                assertEquals(((LeafNode) node).value().toString(), value);
+            }
         }
     }
 
@@ -189,4 +232,22 @@
         assertEquals(id.namespace(), ns);
         assertEquals(key.leafValue().toString(), v);
     }
+
+    /**
+     * Walks in the given built data tree and validates it.
+     */
+    public static void walkINTree(DataNode node,
+                                  String[] expected) {
+        resetLogger();
+
+        TestUtils utils = new TestUtils();
+        // Assign root node as starting node to walk the whole tree.
+        walk(utils, node);
+        // 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));
+        }
+    }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeIetfNetTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeIetfNetTest.java
index df125bc..43b75b2 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeIetfNetTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeIetfNetTest.java
@@ -26,6 +26,7 @@
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.exitDataNode;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getResourceId;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
 import static org.onosproject.yang.runtime.impl.schemacontext.SchemaContextTest.IETFNS;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
 
@@ -63,6 +64,38 @@
     String[] nsA;
     String[] valA;
 
+    private static final String[] EXPECTED = {
+            "Entry Node is /.",
+            "Entry Node is networks.",
+            "Entry Node is network.",
+            "Entry Node is network-id.",
+            "Exit Node is network-id.",
+            "Entry Node is supporting-network.",
+            "Entry Node is network-ref.",
+            "Exit Node is network-ref.",
+            "Exit Node is supporting-network.",
+            "Entry Node is node.",
+            "Entry Node is node-id.",
+            "Exit Node is node-id.",
+            "Entry Node is supporting-node.",
+            "Entry Node is network-ref.",
+            "Exit Node is network-ref.",
+            "Entry Node is node-ref.",
+            "Exit Node is node-ref.",
+            "Exit Node is supporting-node.",
+            "Exit Node is node.",
+            "Exit Node is network.",
+            "Exit Node is networks.",
+            "Entry Node is networks-state.",
+            "Entry Node is network.",
+            "Entry Node is network-ref.",
+            "Exit Node is network-ref.",
+            "Entry Node is server-provided.",
+            "Exit Node is server-provided.",
+            "Exit Node is network.",
+            "Exit Node is networks-state.",
+            "Exit Node is /.",
+    };
     /**
      * Test add to data node builder.
      */
@@ -129,15 +162,19 @@
         value = "network5";
         dBlr = addDataNode(dBlr, "network-ref", null, value, null);
         dBlr = exitDataNode(dBlr);
-
         // Adding leaf server-provided
         value = "true";
         dBlr = addDataNode(dBlr, "server-provided", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
 
         //Tree validation
         nA = new String[]{"/", "networks", "network", "network-id", ""};
         nsA = new String[]{null, IETFNS, IETFNS, IETFNS, ""};
         valA = new String[]{"network1", ""};
         validateResourceId(nA, nsA, valA, id);
+        DataNode node = dBlr.build();
+        walkINTree(dBlr.build(), EXPECTED);
     }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeLeafListTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeLeafListTest.java
new file mode 100644
index 0000000..57618b9
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeLeafListTest.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2017-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.yang.runtime.impl.serializerhelper;
+
+import org.junit.Test;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.helperutils.HelperContext;
+import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.addDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getResourceId;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
+
+/**
+ * Tests the serializer helper methods.
+ */
+public class AddToDataNodeLeafListTest {
+
+    public static final String LNS = "yrt:list";
+
+    TestYangSerializerContext context = new TestYangSerializerContext();
+
+    /*
+     * Reference for data node info.
+     */
+    HelperContext info;
+
+    /*
+     * Reference for data node builder.
+     */
+    DataNode.Builder dBlr;
+
+    /*
+     * Reference for resource id.
+     */
+    ResourceId id;
+
+    /*
+     * Reference for the value.
+     */
+    String value;
+
+    /*
+     * Reference for string array to used for resource id testing.
+     */
+    String[] nA;
+    String[] nsA;
+    String[] valA;
+
+    private static final String[] EXPECTED = {
+            "Entry Node is leaf1.",
+            "Exit Node is leaf1."
+    };
+
+    /**
+     * Test add to data node after initializing it with resource builder.
+     */
+    @Test
+    public void addToDataLeafListTest() {
+
+        ResourceId.Builder rIdBlr = initializeResourceId(context);
+        dBlr = initializeDataNode(rIdBlr);
+        value = "0";
+        dBlr = addDataNode(dBlr, "leaf1", LNS, value, null);
+        info = (HelperContext) dBlr.appInfo();
+        id = getResourceId(dBlr);
+
+        //Tree validation
+        nA = new String[]{"/", "leaf1"};
+        nsA = new String[]{null, LNS};
+        valA = new String[]{"0"};
+        validateResourceId(nA, nsA, valA, id);
+
+        DataNode node = dBlr.build();
+        validateDataNode(node, "leaf1", LNS, MULTI_INSTANCE_LEAF_VALUE_NODE,
+                         false, "0");
+        walkINTree(node, EXPECTED);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeList1Test.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeList1Test.java
new file mode 100644
index 0000000..3ce0be0
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeList1Test.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2017-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.yang.runtime.impl.serializerhelper;
+
+import org.junit.Test;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.helperutils.HelperContext;
+import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.addDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.exitDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getResourceId;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
+
+/**
+ * Tests the serializer helper methods.
+ */
+public class AddToDataNodeList1Test {
+
+
+    public static final String LNS = "yrt:list";
+
+    TestYangSerializerContext context = new TestYangSerializerContext();
+
+    /*
+     * Reference for data node info.
+     */
+    HelperContext info;
+
+    /*
+     * Reference for data node builder.
+     */
+    DataNode.Builder dBlr;
+
+    /*
+     * Reference for resource id.
+     */
+    ResourceId id;
+
+    /*
+     * Reference for the value.
+     */
+    String value;
+
+    /*
+     * Reference for string array to used for resource id testing.
+     */
+    String[] nA;
+    String[] nsA;
+    String[] valA;
+
+    private static final String[] EXPECTED = {
+            "Entry Node is l1.",
+            "Entry Node is k1.",
+            "Exit Node is k1.",
+            "Entry Node is k2.",
+            "Exit Node is k2.",
+            "Entry Node is c1.",
+            "Entry Node is leaf_c1.",
+            "Exit Node is leaf_c1.",
+            "Exit Node is c1.",
+            "Entry Node is k3.",
+            "Exit Node is k3.",
+            "Exit Node is l1.",
+    };
+
+    /**
+     * Test add to data node builder.
+     */
+    @Test
+    public void addToDataListTest() throws IOException {
+        ResourceId.Builder rIdBlr = initializeResourceId(context);
+        dBlr = initializeDataNode(rIdBlr);
+
+        dBlr = addDataNode(dBlr, "l1", LNS, value, null);
+        value = "1";
+        dBlr = addDataNode(dBlr, "k1", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "2";
+        dBlr = addDataNode(dBlr, "k2", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "c1", null, value, null);
+        value = "0";
+        dBlr = addDataNode(dBlr, "leaf_c1", null, value, null);
+
+        info = (HelperContext) dBlr.appInfo();
+        id = getResourceId(dBlr);
+        dBlr = exitDataNode(dBlr);
+
+        ResourceId id1 = getResourceId(dBlr);
+        dBlr = exitDataNode(dBlr);
+
+        value = "3";
+        dBlr = addDataNode(dBlr, "k3", null, value, null);
+
+        info = (HelperContext) dBlr.appInfo();
+        ResourceId id2 = getResourceId(dBlr);
+
+        dBlr = exitDataNode(dBlr);
+
+        //Tree validation
+        nA = new String[]{"/", "l1", "k1", "k2", "k3", "c1", "leaf_c1"};
+        nsA = new String[]{null, LNS, LNS, LNS, LNS, LNS, LNS};
+        valA = new String[]{"1", "2", "3", "0"};
+        validateResourceId(nA, nsA, valA, id);
+
+        nA = new String[]{"/", "l1", "k1", "k2", "k3", "c1"};
+        nsA = new String[]{null, LNS, LNS, LNS, LNS, LNS};
+        valA = new String[]{"1", "2", "3"};
+        validateResourceId(nA, nsA, valA, id1);
+
+        nA = new String[]{"/", "l1", "k1", "k2", "k3"};
+        nsA = new String[]{null, LNS, LNS, LNS, LNS};
+        valA = new String[]{"1", "2", "3"};
+        validateResourceId(nA, nsA, valA, id2);
+
+        // Validating the data node.
+        DataNode node = dBlr.build();
+
+        validateDataNode(node, "l1", LNS, MULTI_INSTANCE_NODE,
+                         true, null);
+        Iterator<KeyLeaf> keyIt = ((ListKey) node.key())
+                .keyLeafs().iterator();
+
+        validateLeafDataNode(keyIt.next(), "k1", LNS, "1");
+        validateLeafDataNode(keyIt.next(), "k2", LNS, "2");
+        validateLeafDataNode(keyIt.next(), "k3", LNS, "3");
+
+        Iterator<Map.Entry<NodeKey, DataNode>> it1;
+        it1 = ((InnerNode) node).childNodes().entrySet().iterator();
+        validateDataNode(it1.next().getValue(), "k1", LNS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "1");
+        validateDataNode(it1.next().getValue(), "k2", LNS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "2");
+        DataNode n1 = it1.next().getValue();
+        validateDataNode(n1, "c1", LNS,
+                         SINGLE_INSTANCE_NODE, true, null);
+        validateDataNode(it1.next().getValue(), "k3", LNS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "3");
+
+        Iterator<Map.Entry<NodeKey, DataNode>> it2;
+        it2 = ((InnerNode) n1).childNodes().entrySet().iterator();
+        validateDataNode(it2.next().getValue(), "leaf_c1", LNS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "0");
+        walkINTree(node, EXPECTED);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeListTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeListTest.java
index e5e6579..510ca2e 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeListTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeListTest.java
@@ -41,6 +41,7 @@
 import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
 
 /**
  * Tests the serializer helper methods.
@@ -78,15 +79,38 @@
     String[] nsA;
     String[] valA;
 
+    private static final String[] EXPECTED = {
+            "Entry Node is /.",
+            "Entry Node is l1.",
+            "Entry Node is k1.",
+            "Exit Node is k1.",
+            "Entry Node is k2.",
+            "Exit Node is k2.",
+            "Entry Node is c1.",
+            "Entry Node is leaf_c1.",
+            "Exit Node is leaf_c1.",
+            "Exit Node is c1.",
+            "Entry Node is k3.",
+            "Exit Node is k3.",
+            "Exit Node is l1.",
+            "Entry Node is leaf1.",
+            "Exit Node is leaf1.",
+            "Entry Node is leaf1.",
+            "Exit Node is leaf1.",
+            "Entry Node is leaf1.",
+            "Exit Node is leaf1.",
+            "Entry Node is leaf1.",
+            "Exit Node is leaf1.",
+            "Exit Node is /."
+    };
+
     /**
      * Test add to data node builder.
      */
     @Test
     public void addToDataListTest() throws IOException {
-
-        Object ob;
+        ResourceId id;
         dBlr = initializeDataNode(context);
-
         dBlr = addDataNode(dBlr, "l1", LNS, value, null);
         value = "1";
         dBlr = addDataNode(dBlr, "k1", null, value, null);
@@ -97,7 +121,7 @@
         value = null;
         dBlr = addDataNode(dBlr, "c1", null, value, null);
         value = "0";
-        dBlr = addDataNode(dBlr, "l1", null, value, null);
+        dBlr = addDataNode(dBlr, "leaf_c1", null, value, null);
 
         info = (HelperContext) dBlr.appInfo();
         id = getResourceId(dBlr);
@@ -125,32 +149,33 @@
         value = "3";
         dBlr = addDataNode(dBlr, "leaf1", LNS, value, null);
         dBlr = exitDataNode(dBlr);
-        value = "4";
+        value = null;
         dBlr = addDataNode(dBlr, "leaf1", LNS, value, null);
         ResourceId id3 = getResourceId(dBlr);
         dBlr = exitDataNode(dBlr);
 
         //Tree validation
-        nA = new String[]{"/", "l1", "k1", "k2", "k3", "c1", "l1", ""};
-        nsA = new String[]{null, LNS, LNS, LNS, LNS, LNS, LNS, ""};
-        valA = new String[]{"1", "2", "3", "0", ""};
+        nA = new String[]{"/", "l1", "k1", "k2", "k3", "c1", "leaf_c1"};
+        nsA = new String[]{null, LNS, LNS, LNS, LNS, LNS, LNS};
+        valA = new String[]{"1", "2", "3", "0"};
         validateResourceId(nA, nsA, valA, id);
 
-        nA = new String[]{"/", "l1", "k1", "k2", "k3", "c1", ""};
-        nsA = new String[]{null, LNS, LNS, LNS, LNS, LNS, ""};
-        valA = new String[]{"1", "2", "3", ""};
+        nA = new String[]{"/", "l1", "k1", "k2", "k3", "c1"};
+        nsA = new String[]{null, LNS, LNS, LNS, LNS, LNS};
+        valA = new String[]{"1", "2", "3"};
         validateResourceId(nA, nsA, valA, id1);
 
-        nA = new String[]{"/", "l1", "k1", "k2", "k3", ""};
-        nsA = new String[]{null, LNS, LNS, LNS, LNS, ""};
-        valA = new String[]{"1", "2", "3", ""};
+        nA = new String[]{"/", "l1", "k1", "k2", "k3"};
+        nsA = new String[]{null, LNS, LNS, LNS, LNS};
+        valA = new String[]{"1", "2", "3"};
         validateResourceId(nA, nsA, valA, id2);
 
-        nA = new String[]{"/", "leaf1", ""};
-        nsA = new String[]{null, LNS, ""};
-        valA = new String[]{"4", "2", "3", "0", ""};
+        nA = new String[]{"/", "leaf1"};
+        nsA = new String[]{null, LNS};
+        valA = new String[]{null};
         validateResourceId(nA, nsA, valA, id3);
 
+        // Validating the data node.
         DataNode node = dBlr.build();
         validateDataNode(node, "/", null, SINGLE_INSTANCE_NODE, true, null);
 
@@ -180,7 +205,7 @@
 
         Iterator<Map.Entry<NodeKey, DataNode>> it2;
         it2 = ((InnerNode) n1).childNodes().entrySet().iterator();
-        validateDataNode(it2.next().getValue(), "l1", LNS,
+        validateDataNode(it2.next().getValue(), "leaf_c1", LNS,
                          SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "0");
         validateDataNode(it.next().getValue(), "leaf1", LNS,
                          MULTI_INSTANCE_LEAF_VALUE_NODE, false, "1");
@@ -189,6 +214,7 @@
         validateDataNode(it.next().getValue(), "leaf1", LNS,
                          MULTI_INSTANCE_LEAF_VALUE_NODE, false, "3");
         validateDataNode(it.next().getValue(), "leaf1", LNS,
-                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, "4");
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, null);
+        walkINTree(dBlr.build(), EXPECTED);
     }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeLogisticTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeLogisticTest.java
new file mode 100644
index 0000000..fc088d5
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeLogisticTest.java
@@ -0,0 +1,423 @@
+/*
+ * Copyright 2017-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.yang.runtime.impl.serializerhelper;
+
+import org.junit.Test;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.helperutils.HelperContext;
+import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.addDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.exitDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getResourceId;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
+
+/**
+ * Tests the serializer helper methods.
+ */
+public class AddToDataNodeLogisticTest {
+
+    public static final String LMNG = "yrt.Logistics-manager";
+
+    TestYangSerializerContext context = new TestYangSerializerContext();
+
+    /*
+     * Reference for data node info.
+     */
+    HelperContext info;
+
+    /*
+     * Reference for data node builder.
+     */
+    DataNode.Builder dBlr;
+
+    /*
+     * Reference for resource id.
+     */
+    ResourceId id;
+
+    /*
+     * Reference for the value.
+     */
+    String value;
+
+    /*
+     * Reference for string array to used for resource id testing.
+     */
+    String[] nA;
+    String[] nsA;
+    String[] valA;
+
+    private static final String[] EXPECTED = {
+            "Entry Node is /.",
+
+            "Entry Node is Customs-supervisor.",
+            "Exit Node is Customs-supervisor.",
+
+            "Entry Node is Merchandiser-supervisor.",
+            "Exit Node is Merchandiser-supervisor.",
+
+            "Entry Node is Material-supervisor.",
+            "Entry Node is name.",
+            "Exit Node is name.",
+            "Entry Node is departmentId.",
+            "Exit Node is departmentId.",
+            "Exit Node is Material-supervisor.",
+
+            "Entry Node is Material-supervisor.",
+            "Entry Node is name.",
+            "Exit Node is name.",
+            "Entry Node is departmentId.",
+            "Exit Node is departmentId.",
+            "Exit Node is Material-supervisor.",
+
+            "Entry Node is Material-supervisor.",
+            "Entry Node is name.",
+            "Exit Node is name.",
+            "Entry Node is departmentId.",
+            "Exit Node is departmentId.",
+            "Exit Node is Material-supervisor.",
+
+            "Entry Node is Purchasing-supervisor.",
+
+            "Entry Node is purchasing-specialist.",
+            "Exit Node is purchasing-specialist.",
+
+            "Entry Node is support.",
+            "Exit Node is support.",
+
+            "Entry Node is support.",
+            "Exit Node is support.",
+
+            "Entry Node is support.",
+            "Exit Node is support.",
+
+            "Exit Node is Purchasing-supervisor.",
+
+            "Entry Node is Warehouse-supervisor.",
+            "Exit Node is Warehouse-supervisor.",
+
+            "Entry Node is Warehouse-supervisor.",
+            "Exit Node is Warehouse-supervisor.",
+
+            "Entry Node is Warehouse-supervisor.",
+            "Exit Node is Warehouse-supervisor.",
+
+            "Entry Node is Warehouse-supervisor.",
+            "Exit Node is Warehouse-supervisor.",
+
+            "Entry Node is Trading-supervisor.",
+            "Exit Node is Trading-supervisor.",
+
+            "Entry Node is Employee-id.",
+            "Exit Node is Employee-id.",
+
+            "Entry Node is Employee-id.",
+            "Exit Node is Employee-id.",
+
+            "Entry Node is Employee-id.",
+            "Exit Node is Employee-id.",
+
+            "Entry Node is Employee-id.",
+            "Exit Node is Employee-id.",
+            "Exit Node is /."
+    };
+
+    /**
+     * Test add to data node builder logistic manager module.
+     */
+    @Test
+    public void addToDataTest() {
+
+        dBlr = getLogisticModuleDataNode();
+
+        walkINTree(dBlr.build(), EXPECTED);
+        // Validating the data node.
+        DataNode node = dBlr.build();
+        validateDataNode(node, "/", null, SINGLE_INSTANCE_NODE, true, null);
+
+        Map<NodeKey, DataNode> childMap = ((InnerNode) node).childNodes();
+        Iterator<Map.Entry<NodeKey, DataNode>> it = childMap.entrySet().iterator();
+        Map.Entry<NodeKey, DataNode> n = it.next();
+        value = "1";
+        validateDataNode(n.getValue(), "Customs-supervisor", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "1";
+        validateDataNode(n.getValue(), "Merchandiser-supervisor", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = null;
+        validateDataNode(n.getValue(), "Material-supervisor", LMNG,
+                         MULTI_INSTANCE_NODE, true, value);
+
+        Iterator<KeyLeaf> keyIt = ((ListKey) n.getKey()).keyLeafs().iterator();
+        validateLeafDataNode(keyIt.next(), "name", LMNG, "abc");
+
+        Iterator<Map.Entry<NodeKey, DataNode>> it1;
+        it1 = ((InnerNode) n.getValue()).childNodes().entrySet().iterator();
+        validateDataNode(it1.next().getValue(), "name", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "abc");
+        validateDataNode(it1.next().getValue(), "departmentId", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "dep-1");
+
+        n = it.next();
+        value = null;
+        validateDataNode(n.getValue(), "Material-supervisor", LMNG,
+                         MULTI_INSTANCE_NODE, true, value);
+
+        keyIt = ((ListKey) n.getKey()).keyLeafs().iterator();
+        validateLeafDataNode(keyIt.next(), "name", LMNG, "abc1");
+        it1 = ((InnerNode) n.getValue()).childNodes().entrySet().iterator();
+        validateDataNode(it1.next().getValue(), "name", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "abc1");
+        validateDataNode(it1.next().getValue(), "departmentId", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "dep-1");
+
+        n = it.next();
+        value = null;
+        validateDataNode(n.getValue(), "Material-supervisor", LMNG,
+                         MULTI_INSTANCE_NODE, true, value);
+
+        keyIt = ((ListKey) n.getKey()).keyLeafs().iterator();
+        validateLeafDataNode(keyIt.next(), "name", LMNG, "abc2");
+        it1 = ((InnerNode) n.getValue()).childNodes().entrySet().iterator();
+        validateDataNode(it1.next().getValue(), "name", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "abc2");
+        validateDataNode(it1.next().getValue(), "departmentId", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "dep-1");
+
+        n = it.next();
+        value = null;
+        validateDataNode(n.getValue(), "Purchasing-supervisor", LMNG,
+                         SINGLE_INSTANCE_NODE, true, value);
+
+        it1 = ((InnerNode) n.getValue()).childNodes().entrySet().iterator();
+        validateDataNode(it1.next().getValue(), "purchasing-specialist", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "xyz");
+        validateDataNode(it1.next().getValue(), "support", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, "helpdesk");
+        validateDataNode(it1.next().getValue(), "support", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, "helpdesk1");
+        validateDataNode(it1.next().getValue(), "support", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, "helpdesk2");
+
+        n = it.next();
+        value = "1";
+        validateDataNode(n.getValue(), "Warehouse-supervisor", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "2";
+        validateDataNode(n.getValue(), "Warehouse-supervisor", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "3";
+        validateDataNode(n.getValue(), "Warehouse-supervisor", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "4";
+        validateDataNode(n.getValue(), "Warehouse-supervisor", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "1";
+        validateDataNode(n.getValue(), "Trading-supervisor", LMNG,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "1";
+        validateDataNode(n.getValue(), "Employee-id", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "2";
+        validateDataNode(n.getValue(), "Employee-id", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "3";
+        validateDataNode(n.getValue(), "Employee-id", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+
+        n = it.next();
+        value = "4";
+        validateDataNode(n.getValue(), "Employee-id", LMNG,
+                         MULTI_INSTANCE_LEAF_VALUE_NODE, false, value);
+    }
+
+    /**
+     * Returns the logistic module data tree.
+     */
+    public DataNode.Builder getLogisticModuleDataNode() {
+        dBlr = initializeDataNode(context);
+
+        value = "1";
+        dBlr = addDataNode(dBlr, "Customs-supervisor", LMNG, value, null);
+        id = getResourceId(dBlr);
+        nA = new String[]{"/", "Customs-supervisor"};
+        nsA = new String[]{null, LMNG};
+        valA = new String[]{"1"};
+        validateResourceId(nA, nsA, valA, id);
+        dBlr = exitDataNode(dBlr);
+
+        dBlr = addDataNode(dBlr, "Merchandiser-supervisor", LMNG, value, null);
+        info = (HelperContext) dBlr.appInfo();
+        id = getResourceId(dBlr);
+        nA = new String[]{"/", "Merchandiser-supervisor"};
+        nsA = new String[]{null, LMNG};
+        valA = new String[]{"1"};
+        validateResourceId(nA, nsA, valA, id);
+
+        dBlr = exitDataNode(dBlr);
+
+        value = null;
+        dBlr = addDataNode(dBlr, "Material-supervisor", LMNG, value, null);
+
+        value = "abc";
+        dBlr = addDataNode(dBlr, "name", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "dep-1";
+        dBlr = addDataNode(dBlr, "departmentId", null, value, null);
+        info = (HelperContext) dBlr.appInfo();
+        id = getResourceId(dBlr);
+        nA = new String[]{"/", "Material-supervisor", "name", "departmentId"};
+        nsA = new String[]{null, LMNG, LMNG, LMNG};
+        valA = new String[]{"abc", "dep-1"};
+        validateResourceId(nA, nsA, valA, id);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+
+        id = getResourceId(dBlr);
+        nA = new String[]{"/"};
+        nsA = new String[]{null};
+        valA = new String[]{};
+        validateResourceId(nA, nsA, valA, id);
+
+        value = null;
+        dBlr = addDataNode(dBlr, "Material-supervisor", LMNG, value, null);
+
+        value = "abc1";
+        dBlr = addDataNode(dBlr, "name", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "dep-1";
+        dBlr = addDataNode(dBlr, "departmentId", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+
+        value = null;
+        dBlr = addDataNode(dBlr, "Material-supervisor", LMNG, value, null);
+
+        value = "abc2";
+        dBlr = addDataNode(dBlr, "name", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "dep-1";
+        dBlr = addDataNode(dBlr, "departmentId", null, value, null);
+        id = getResourceId(dBlr);
+        nA = new String[]{"/", "Material-supervisor", "name", "departmentId"};
+        nsA = new String[]{null, LMNG, LMNG, LMNG};
+        valA = new String[]{"abc2", "dep-1"};
+        validateResourceId(nA, nsA, valA, id);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+
+        value = null;
+        dBlr = addDataNode(dBlr, "Purchasing-supervisor", LMNG, value, null);
+
+        value = "xyz";
+        dBlr = addDataNode(dBlr, "purchasing-specialist", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "helpdesk";
+        dBlr = addDataNode(dBlr, "support", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "helpdesk1";
+        dBlr = addDataNode(dBlr, "support", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "helpdesk2";
+        dBlr = addDataNode(dBlr, "support", null, value, null);
+        id = getResourceId(dBlr);
+        nA = new String[]{"/", "Purchasing-supervisor", "support"};
+        nsA = new String[]{null, LMNG, LMNG};
+        valA = new String[]{"helpdesk2"};
+        validateResourceId(nA, nsA, valA, id);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+
+        value = "1";
+        dBlr = addDataNode(dBlr, "Warehouse-supervisor", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "2";
+        dBlr = addDataNode(dBlr, "Warehouse-supervisor", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "3";
+        dBlr = addDataNode(dBlr, "Warehouse-supervisor", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "4";
+        dBlr = addDataNode(dBlr, "Warehouse-supervisor", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "1";
+        dBlr = addDataNode(dBlr, "Trading-supervisor", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "1";
+        dBlr = addDataNode(dBlr, "Employee-id", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "2";
+        dBlr = addDataNode(dBlr, "Employee-id", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "3";
+        dBlr = addDataNode(dBlr, "Employee-id", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "4";
+        dBlr = addDataNode(dBlr, "Employee-id", LMNG, value, null);
+        dBlr = exitDataNode(dBlr);
+        return dBlr;
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeRidTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeRidTest.java
index f2a38ad..e578cdf 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeRidTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToDataNodeRidTest.java
@@ -22,11 +22,13 @@
 import org.onosproject.yang.runtime.helperutils.HelperContext;
 import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
 
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.addDataNode;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.addToResourceId;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getResourceId;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
 
 /**
@@ -75,15 +77,19 @@
         rIdBlr = addToResourceId(rIdBlr, "l1", LNS, value);
         rIdBlr = addToResourceId(rIdBlr, "c1", LNS, value);
         dBlr = initializeDataNode(rIdBlr);
-        value = "0";
-        dBlr = addDataNode(dBlr, "l1", null, value, null);
+        value = null;
+        dBlr = addDataNode(dBlr, "leaf_c1", null, value, null);
         info = (HelperContext) dBlr.appInfo();
         id = getResourceId(dBlr);
 
         //Tree validation
-        nA = new String[]{"/", "l1", "c1", "l1", ""};
-        nsA = new String[]{null, LNS, LNS, LNS, ""};
-        valA = new String[]{"0", ""};
+        nA = new String[]{"/", "l1", "c1", "leaf_c1"};
+        nsA = new String[]{null, LNS, LNS, LNS};
+        valA = new String[]{null};
         validateResourceId(nA, nsA, valA, id);
+
+        DataNode node = dBlr.build();
+        validateDataNode(node, "leaf_c1", LNS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, null);
     }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToResourceIdTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToResourceIdTest.java
index 271a649..bb13fd2 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToResourceIdTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AddToResourceIdTest.java
@@ -66,7 +66,7 @@
     String[] valA;
 
     /**
-     * Test add to data node builder.
+     * Test add to resource id with all list key.
      */
     @Test
     public void addToDataListTest() {
@@ -80,9 +80,27 @@
         ResourceId id = rIdBlr.build();
 
         //Tree validation
-        nA = new String[]{"/", "l1", "k1", "k2", "k3", ""};
-        nsA = new String[]{null, LNS, LNS, LNS, LNS, ""};
-        valA = new String[]{"1", "2", "3", ""};
+        nA = new String[]{"/", "l1", "k1", "k2", "k3"};
+        nsA = new String[]{null, LNS, LNS, LNS, LNS};
+        valA = new String[]{"1", "2", "3"};
+        validateResourceId(nA, nsA, valA, id);
+    }
+
+    /**
+     * Test add to resource id without any key.
+     */
+    @Test
+    public void addToDataList1Test() {
+
+        ResourceId.Builder rIdBlr = initializeResourceId(context);
+        List<String> valueSet = null;
+        rIdBlr = addToResourceId(rIdBlr, "l1", LNS, valueSet);
+        ResourceId id = rIdBlr.build();
+
+        //Tree validation
+        nA = new String[]{"/", "l1"};
+        nsA = new String[]{null, LNS};
+        valA = new String[]{};
         validateResourceId(nA, nsA, valA, id);
     }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/DataNodeInitializationTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/DataNodeInitializationTest.java
index 4c95a74..b5edb5f 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/DataNodeInitializationTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/DataNodeInitializationTest.java
@@ -23,9 +23,13 @@
 import org.onosproject.yang.runtime.helperutils.HelperContext;
 import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
 
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getResourceId;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkRootLevelContext;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
 
 /**
  * Tests the initialize data node methods in serializer helper.
@@ -49,6 +53,19 @@
      */
     DataNode.Builder dBlr;
 
+    /*
+     * Reference for resource id.
+     */
+    ResourceId id;
+
+
+    /*
+     * Reference for string array to used for resource id testing.
+     */
+    String[] nA;
+    String[] nsA;
+    String[] valA;
+
     /**
      * Checks initialize data node using context.
      */
@@ -59,6 +76,13 @@
         info = (HelperContext) dBlr.appInfo();
         checkRootLevelContext((SchemaContext) info.getResourceIdBuilder()
                 .appInfo());
+        id = getResourceId(dBlr);
+        nA = new String[]{"/"};
+        nsA = new String[]{null};
+        valA = new String[]{};
+        validateResourceId(nA, nsA, valA, id);
+        validateDataNode(dBlr.build(), "/", null,
+                         SINGLE_INSTANCE_NODE, true, null);
     }
 
     /**
@@ -72,5 +96,12 @@
         info = (HelperContext) dBlr.appInfo();
         checkRootLevelContext((SchemaContext) info.getParentResourceIdBldr()
                 .appInfo());
+        id = getResourceId(dBlr);
+        nA = new String[]{"/"};
+        nsA = new String[]{null};
+        valA = new String[]{};
+        validateResourceId(nA, nsA, valA, id);
+        validateDataNode(dBlr.build(), "/", null,
+                         SINGLE_INSTANCE_NODE, true, null);
     }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdInitializationTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdInitializationTest.java
index 2ef2864..66e8f31 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdInitializationTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdInitializationTest.java
@@ -23,9 +23,9 @@
 
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.addToResourceId;
 import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
-import static org.onosproject.yang.runtime.impl.schemacontext.SchemaContextTest.IETFNS;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkRootLevelContext;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateResourceId;
+import static org.onosproject.yang.runtime.impl.schemacontext.SchemaContextTest.IETFNS;
 
 /**
  * Tests the initialize resource id methods in serializer helper.
@@ -71,9 +71,9 @@
         rIdBlr = addToResourceId(rIdBlr, "network-id", null, value);
         ResourceId id = rIdBlr.build();
 
-        nA = new String[]{"/", "networks", "network", "network-id", ""};
-        nsA = new String[]{null, IETFNS, IETFNS, IETFNS, ""};
-        valA = new String[]{"network1", ""};
+        nA = new String[]{"/", "networks", "network", "network-id"};
+        nsA = new String[]{null, IETFNS, IETFNS, IETFNS};
+        valA = new String[]{"network1"};
         validateResourceId(nA, nsA, valA, id);
     }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdNegative3Test.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdNegative3Test.java
index a7e39ca..175364a 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdNegative3Test.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ResourceIdNegative3Test.java
@@ -52,7 +52,7 @@
         valueSet.add("2");
         boolean isExpOccurred = false;
         try {
-            rIdBlr = addToResourceId(rIdBlr, "l1", LNS, valueSet);
+            addToResourceId(rIdBlr, "l1", LNS, valueSet);
         } catch (IllegalArgumentException e) {
             isExpOccurred = true;
             assertEquals(e.getMessage(), E_TOO_FEW);
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/Logistics-manager.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/Logistics-manager.yang
new file mode 100644
index 0000000..87c5db6
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/Logistics-manager.yang
@@ -0,0 +1,66 @@
+module Logistics-manager {
+
+    yang-version 1;
+
+    namespace "yrt.Logistics-manager";
+
+    prefix "root";
+
+    organization "ON-LAB";
+
+    description "This module defines for organisation.";
+
+    revision "2016-05-24" {
+        description "Initial revision.";
+    }
+
+    leaf Customs-supervisor {
+        type string;
+        description "name of the customs-supervisor.";
+    }
+
+    leaf Merchandiser-supervisor {
+        type string;
+        description "name of merchandiser-supervisor";
+    }
+
+    list Material-supervisor {
+        key "name";
+        leaf name {
+            type string;
+            description "name of logistics-supervisor";
+        }
+
+        leaf departmentId {
+            type string;
+            description "name of department";
+        }
+    }
+
+    container Purchasing-supervisor {
+        leaf purchasing-specialist {
+            type string;
+            description "name of the purchasing-specialist person";
+        }
+
+        leaf-list support {
+            type string;
+            description "name of the support person";
+        }
+    }
+
+    leaf-list Warehouse-supervisor {
+        type string;
+        description "name of the warehouse-supervisor's";
+    }
+
+    leaf Trading-supervisor {
+        type string;
+        description "name of the trading-supervisor";
+    }
+
+    leaf-list Employee-id {
+        type string;
+        description "list of the employee id";
+    }
+}
\ No newline at end of file
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/list.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/list.yang
index 122ce11..2ff07dc 100644
--- a/runtime/src/test/resources/schemaProviderTestYangFiles/list.yang
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/list.yang
@@ -29,7 +29,7 @@
             }
 
             container c1 {
-                leaf l1 {
+                leaf leaf_c1 {
                   type string;
                 }
             }
