[ONOS-5962]YANG Runtime: ModelConverter's createModel implementation

Change-Id: I8377ad86d0b0b60f96c4d8d40517cede66c5fc27
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
index 1328185..4509e59 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
@@ -88,7 +88,8 @@
         extends YangNode
         implements YangLeavesHolder, YangDesc, YangReference, Parsable,
         CollisionDetector, YangReferenceResolver, RpcNotificationContainer,
-        YangFeatureHolder, YangIsFilterContentNodes, YangNamespace, YangDeviationHolder {
+        YangFeatureHolder, YangIsFilterContentNodes, YangNamespace,
+        YangDeviationHolder {
 
     private static final long serialVersionUID = 806201610L;
 
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
index e2d7e00..0dd728a 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
@@ -1017,7 +1017,7 @@
             // setting the schema Id
             schemaId = new SchemaId(getName(), getNameSpace()
                     .getModuleNamespace());
-        } else if (this instanceof YangCase) {
+        } else if (this instanceof YangCase || this instanceof YangAugment) {
             ((YangLeavesHolder) this).setLeafParentContext();
         }
     }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNotification.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNotification.java
index 0255a2a..fba7fd9 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNotification.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNotification.java
@@ -19,12 +19,17 @@
 import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.model.SchemaId;
+import org.onosproject.yang.model.SingleInstanceNodeContext;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.Collections.unmodifiableList;
 import static org.onosproject.yang.compiler.datamodel.YangNodeType.NOTIFICATION_NODE;
 import static org.onosproject.yang.compiler.datamodel.YangSchemaNodeType.YANG_SINGLE_INSTANCE_NODE;
@@ -32,7 +37,11 @@
 import static org.onosproject.yang.compiler.datamodel.exceptions.ErrorMessages.COLLISION_DETECTION;
 import static org.onosproject.yang.compiler.datamodel.exceptions.ErrorMessages.NOTIFICATION;
 import static org.onosproject.yang.compiler.datamodel.exceptions.ErrorMessages.getErrorMsgCollision;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.E_ID;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.FMT_NOT_EXIST;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.errorMsg;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getNodeIdFromSchemaId;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getParentSchemaContext;
 import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.NOTIFICATION_DATA;
 
@@ -88,7 +97,8 @@
 public abstract class YangNotification
         extends YangNode
         implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector,
-        YangAugmentableNode, YangIfFeatureHolder, InvalidOpTypeHolder {
+        YangAugmentableNode, YangIfFeatureHolder, InvalidOpTypeHolder,
+        SingleInstanceNodeContext {
 
     private static final long serialVersionUID = 806201611L;
 
@@ -128,7 +138,8 @@
      * Create a notification node.
      */
     public YangNotification() {
-        super(NOTIFICATION_NODE, new HashMap<>());
+        super(NOTIFICATION_NODE, new HashMap<>(),
+              DataNode.Type.SINGLE_INSTANCE_NODE);
         listOfLeaf = new LinkedList<>();
         listOfLeafList = new LinkedList<>();
         ifFeatureList = new LinkedList<>();
@@ -329,4 +340,24 @@
     public void cloneAugmentInfo() {
         yangAugmentedInfo = new ArrayList<>();
     }
+
+    @Override
+    public SchemaContext getChildContext(SchemaId schemaId) {
+
+        checkNotNull(schemaId, E_ID);
+        YangSchemaNodeIdentifier id = getNodeIdFromSchemaId(
+                schemaId, getNameSpace().getModuleNamespace());
+        try {
+            YangSchemaNode node = getChildSchema(id).getSchemaNode();
+            if (node instanceof SchemaDataNode) {
+                return node;
+            } else {
+                throw new IllegalArgumentException(errorMsg(FMT_NOT_EXIST,
+                                                            schemaId.name(),
+                                                            getName()));
+            }
+        } catch (DataModelException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
index e1bac7f..1569ef8 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
@@ -97,7 +97,8 @@
         extends YangNode
         implements YangLeavesHolder, YangDesc, YangReference, Parsable,
         CollisionDetector, YangReferenceResolver, RpcNotificationContainer,
-        YangFeatureHolder, YangIsFilterContentNodes, YangNamespace, YangDeviationHolder {
+        YangFeatureHolder, YangIsFilterContentNodes, YangNamespace,
+        YangDeviationHolder {
 
     private static final long serialVersionUID = 806201614L;
 
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/builtindatatype/ObjectProvider.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/builtindatatype/ObjectProvider.java
index 85dc23d..0b1c3b5 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/builtindatatype/ObjectProvider.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/builtindatatype/ObjectProvider.java
@@ -80,7 +80,9 @@
             case BOOLEAN:
                 return Boolean.parseBoolean(leafValue);
             case BINARY:
-                return Base64.getDecoder().decode(leafValue);
+                byte[] data = Base64.getDecoder().decode(leafValue);
+                String str = new String(data);
+                return str;
             case BITS:
             case IDENTITYREF:
             case ENUMERATION:
@@ -93,8 +95,12 @@
                         .getDataTypeExtendedInfo()).getEffectiveDataType();
                 return getObject(refType, leafValue, refType.getDataType());
             case DERIVED:
-                return getObject(null, leafValue, ((YangDerivedInfo) typeInfo
-                        .getDataTypeExtendedInfo()).getEffectiveBuiltInType());
+                // referred typedef's list of type will always has only one type
+                YangType rt = ((YangDerivedInfo) typeInfo
+                        .getDataTypeExtendedInfo()).getReferredTypeDef()
+                        .getTypeList().get(0);
+                return getObject(rt, leafValue, ((YangDerivedInfo)
+                        typeInfo.getDataTypeExtendedInfo()).getEffectiveBuiltInType());
             case UNION:
                 return parseUnionTypeInfo(typeInfo, leafValue);
             default:
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
index b764ead..6a5ed29 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
@@ -59,6 +59,8 @@
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
+import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_IMPL_MASK;
+import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.ADD_TO_LIST_INTERFACE_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
@@ -254,6 +256,8 @@
 
                 insertDataIntoJavaFile(file, getDataFromTempFileHandle(
                         SETTER_FOR_INTERFACE_MASK, getBeanFiles(curNode), path));
+                insertDataIntoJavaFile(file, getDataFromTempFileHandle(
+                        ADD_TO_LIST_INTERFACE_MASK, getBeanFiles(curNode), path));
             } catch (IOException e) {
                 throw new IOException(getErrorMsg(className, INTERFACE));
             }
@@ -500,6 +504,10 @@
             methods.add(getDataFromTempFileHandle(
                     SETTER_FOR_CLASS_MASK, getBeanFiles(curNode), path));
 
+            //Add to list impl method.
+            methods.add(getDataFromTempFileHandle(
+                    ADD_TO_LIST_IMPL_MASK, getBeanFiles(curNode), path));
+
             // Hash code method.
             methods.add(getHashCodeMethodClose(
                     getHashCodeMethodOpen() + getDataFromTempFileHandle(
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
index 3d88b35..c853fef 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
@@ -1451,17 +1451,17 @@
                     param.put(attr.getAttributeName() + KEYS, retType + KEYS);
                     param.put(attr.getAttributeName() + VALUE_CAPS, retType);
                     return multiAttrMethodSignature(methodName, null, null,
-                                                    className, param,
+                                                    VOID, param,
                                                     INTERFACE_TYPE,
                                                     FOUR_SPACE_INDENTATION);
                 default:
                     return methodSignature(methodName, null, null, ADD_STRING + TO_CAPS,
-                                           className, retType,
+                                           VOID, retType,
                                            INTERFACE_TYPE);
             }
         }
         return methodSignature(methodName, null, null, ADD_STRING + TO_CAPS,
-                               className, getReturnType(attr),
+                               VOID, getReturnType(attr),
                                INTERFACE_TYPE);
     }
 
@@ -1505,7 +1505,7 @@
                     param.put(attr.getAttributeName() + VALUE_CAPS, retType);
                     builder.append(multiAttrMethodSignature(methodName,
                                                             null, PUBLIC,
-                                                            name, param,
+                                                            VOID, param,
                                                             CLASS_TYPE,
                                                             FOUR_SPACE_INDENTATION))
                             .append(getIfConditionForAddToListMethod(attr));
@@ -1518,7 +1518,7 @@
                     builder.append(methodSignature(methodName,
                                                    null, PUBLIC,
                                                    ADD_STRING + TO_CAPS,
-                                                   name, retType,
+                                                   VOID, retType,
                                                    CLASS_TYPE))
                             .append(getIfConditionForAddToListMethod(attr));
                     retString = EIGHT_SPACE_INDENTATION + attrName + PERIOD + ADD_STRING +
@@ -1528,7 +1528,7 @@
             builder.append(methodSignature(ADD_STRING + TO_CAPS +
                                                    getCapitalCase(attrName),
                                            null, PUBLIC, ADD_STRING + TO_CAPS,
-                                           name, retType,
+                                           VOID, retType,
                                            CLASS_TYPE))
                     .append(getIfConditionForAddToListMethod(attr));
             retString = EIGHT_SPACE_INDENTATION + attrName + PERIOD + ADD_STRING +
@@ -1536,8 +1536,6 @@
         }
         builder.append(retString)
                 .append(signatureClose())
-                .append(getReturnString(THIS, EIGHT_SPACE_INDENTATION))
-                .append(signatureClose())
                 .append(methodClose(FOUR_SPACE));
         return builder.toString();
 
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
index 2b2c0ec..050fd52 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
@@ -597,9 +597,7 @@
                     break;
             }
         }
-        javadoc.append(getJavaDocParamLine(
-                attribute, ADD_STRING + TO_CAPS))
-                .append(getJavaDocReturnLine(attribute))
+        javadoc.append(getJavaDocParamLine(attribute, ADD_STRING + TO_CAPS))
                 .append(getJavaDocEndLine());
         return javadoc.toString();
     }
diff --git a/model/src/main/java/org/onosproject/yang/model/LeafModelObject.java b/model/src/main/java/org/onosproject/yang/model/LeafModelObject.java
index 162fc54..028d7e4 100644
--- a/model/src/main/java/org/onosproject/yang/model/LeafModelObject.java
+++ b/model/src/main/java/org/onosproject/yang/model/LeafModelObject.java
@@ -72,4 +72,13 @@
     public void values(List<Object> v) {
         values = v;
     }
+
+    /**
+     * Adds value to list.
+     *
+     * @param v value
+     */
+    public void addValue(Object v) {
+        values.add(v);
+    }
 }
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 8a97560..3bb668b 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
@@ -105,10 +105,19 @@
             ResourceId.Builder builder, String name, String namespace,
             String value) {
         try {
+            SchemaContext parentCont = (SchemaContext) builder.appInfo();
             SchemaContext child = getChildSchemaContext(
-                    (SchemaContext) builder.appInfo(), name, namespace);
+                    parentCont, name, namespace);
+            if (child == null) {
+                throw new IllegalArgumentException(
+                        errorMsg(FMT_NOT_EXIST, name));
+            }
             DataNode.Type type = child.getType();
             updateResourceId(builder, name, value, child, type);
+            if (type == SINGLE_INSTANCE_LEAF_VALUE_NODE &&
+                    ((YangLeaf) child).isKeyLeaf()) {
+                builder.appInfo(parentCont);
+            }
         } catch (IllegalArgumentException e) {
             throw new IllegalArgumentException(e.getMessage());
         }
@@ -287,8 +296,8 @@
                 nodeInfo = info;
             }
 
-            SchemaContext childSchema = getChildSchemaContext(
-                    node, name, namespace);
+            SchemaContext childSchema = getChildSchemaContext(node, name,
+                                                              namespace);
             DataNode.Type nodeType = childSchema.getType();
 
             if (type != null && !nodeType.equals(type)) {
@@ -423,7 +432,7 @@
      * @param namespace namespace of the child node
      * @return schema context
      */
-    private static SchemaContext getChildSchemaContext(
+    public static SchemaContext getChildSchemaContext(
             SchemaContext context, String name, String namespace)
             throws IllegalArgumentException {
         SchemaContext child;
@@ -436,10 +445,6 @@
 
         SchemaId id = new SchemaId(name, namespace);
         child = ((SingleInstanceNodeContext) context).getChildContext(id);
-        if (child == null) {
-            throw new IllegalArgumentException(
-                    errorMsg(FMT_NOT_EXIST, name));
-        }
         return child;
     }
 
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultModelConverter.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultModelConverter.java
index 241304c..77d1b7f 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultModelConverter.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultModelConverter.java
@@ -38,7 +38,8 @@
 
     @Override
     public ModelObjectData createModel(ResourceData data) {
-        return null;
+        DefaultYobBuilder builder = new DefaultYobBuilder(reg);
+        return builder.getYangObject(data);
     }
 
     @Override
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
index 9756603..e679d60 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
@@ -16,8 +16,6 @@
 
 package org.onosproject.yang.runtime.impl;
 
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.model.YangModuleId;
 import org.onosproject.yang.compiler.datamodel.SchemaDataNode;
 import org.onosproject.yang.compiler.datamodel.YangChoice;
 import org.onosproject.yang.compiler.datamodel.YangNode;
@@ -28,6 +26,8 @@
 import org.onosproject.yang.model.SchemaContext;
 import org.onosproject.yang.model.SchemaId;
 import org.onosproject.yang.model.SingleInstanceNodeContext;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModuleId;
 import org.onosproject.yang.runtime.AppModuleInfo;
 import org.onosproject.yang.runtime.ModelRegistrationParam;
 import org.onosproject.yang.runtime.YangModelRegistry;
@@ -580,8 +580,7 @@
             //If namespace if module name.
             node = getForSchemaName(schemaId.namespace());
         }
-        YangSchemaNodeIdentifier id = getNodeIdFromSchemaId(
-                schemaId, namespace);
+        YangSchemaNodeIdentifier id = getNodeIdFromSchemaId(schemaId, namespace);
 
         try {
             if (node != null) {
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYobBuilder.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYobBuilder.java
new file mode 100644
index 0000000..fa0e804
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYobBuilder.java
@@ -0,0 +1,139 @@
+/*
+ * 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;
+
+import org.onosproject.yang.compiler.datamodel.YangLeaf;
+import org.onosproject.yang.compiler.datamodel.YangLeafList;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.LeafListKey;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaId;
+
+import java.util.Iterator;
+import java.util.List;
+
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.nonEmpty;
+import static org.onosproject.yang.runtime.helperutils.DefaultDataNodeWalker.walk;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getChildSchemaContext;
+import static org.onosproject.yang.runtime.impl.YobUtils.FORWARD_SLASH;
+import static org.onosproject.yang.runtime.impl.YobUtils.handleLeafListKey;
+import static org.onosproject.yang.runtime.impl.YobUtils.handleListKey;
+import static org.onosproject.yang.runtime.impl.YobUtils.handleNodeKey;
+
+/**
+ * Represents implementation to build and obtain YANG objects from data node.
+ */
+public class DefaultYobBuilder {
+    private final DefaultYangModelRegistry registry;
+    private YangSchemaNode lastIndexNode;
+
+    /**
+     * Creates an instance of YOB builder.
+     *
+     * @param reg YANG model registry
+     */
+    public DefaultYobBuilder(DefaultYangModelRegistry reg) {
+        registry = reg;
+    }
+
+    /**
+     * Returns the YANG object.
+     *
+     * @param data resource data
+     * @return model object identifier and YANG object
+     */
+    public ModelObjectData getYangObject(ResourceData data) {
+        DefaultModelObjectData.Builder builder = DefaultModelObjectData.builder();
+        ModelObjectId id = null;
+        if (data.resourceId() != null) {
+            id = convertRscIdToMoId(data.resourceId());
+        }
+
+        List<DataNode> dataNodes = data.dataNodes();
+        if (nonEmpty(dataNodes)) {
+            for (DataNode dataNode : dataNodes) {
+                YobListener listener = new YobListener(lastIndexNode, registry);
+                walk(listener, dataNode);
+                List<ModelObject> objList = listener.modelObjectList();
+                if (objList != null) {
+                    for (ModelObject obj : objList) {
+                        builder.addModelObject(obj);
+                    }
+                }
+            }
+        }
+        return builder.identifer(id).build();
+    }
+
+    /**
+     * Converts resource identifier to model object identifier.
+     *
+     * @param id resource identifier
+     * @return model object identifier
+     */
+    private ModelObjectId convertRscIdToMoId(ResourceId id) {
+        ModelObjectId.Builder midb = ModelObjectId.builder();
+
+        if (id != null) {
+            List<NodeKey> nodeKeys = id.nodeKeys();
+            NodeKey key;
+            SchemaId sId;
+            if (nonEmpty(nodeKeys)) {
+                Iterator<NodeKey> it = nodeKeys.iterator();
+                while (it.hasNext()) {
+                    key = it.next();
+                    sId = key.schemaId();
+                    if (sId.name().equals(FORWARD_SLASH)) {
+                        continue;
+                    }
+
+                    YangSchemaNode schemaNode;
+                    if (lastIndexNode == null) {
+                        schemaNode = ((YangSchemaNode) registry.getChildContext(sId));
+                    } else {
+                        schemaNode = ((YangSchemaNode)
+                                getChildSchemaContext(lastIndexNode, sId.name(),
+                                                      sId.namespace()));
+                    }
+
+                    if (key instanceof ListKey) {
+                        midb = handleListKey(midb, registry, schemaNode, key);
+                    } else if (key instanceof LeafListKey) {
+                        LeafListKey llKey = (LeafListKey) key;
+                        midb = handleLeafListKey(midb, registry, schemaNode,
+                                                 llKey);
+                    } else {
+                        midb = handleNodeKey(midb, registry, schemaNode, key);
+                    }
+                    if (!(schemaNode instanceof YangLeaf) || !(schemaNode
+                            instanceof YangLeafList)) {
+                        lastIndexNode = schemaNode;
+                    }
+                }
+            }
+        }
+        return midb.build();
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobConstants.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobConstants.java
new file mode 100644
index 0000000..642d84c
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobConstants.java
@@ -0,0 +1,73 @@
+/*
+ * 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;
+
+/**
+ * Represents common constant utility for YANG object builder.
+ */
+final class YobConstants {
+
+    private YobConstants() {
+    }
+
+    static final String FROM_STRING = "fromString";
+    static final String OP_PARAM = "OpParam";
+    static final String DEFAULT = "Default";
+    static final String ADD_TO = "addTo";
+    static final String OF = "of";
+    static final String PERIOD = ".";
+    static final String ADD_AUGMENT_METHOD = "addAugmentation";
+    static final String YANG = "yang";
+    static final String JAVA_LANG = "java.lang";
+
+    //Error strings
+    static final String E_HAS_NO_CHILD = " does not have child ";
+    static final String E_FAIL_TO_GET_FIELD = "Failed to get field for" +
+            " class: ";
+    static final String L_FAIL_TO_GET_FIELD =
+            "Failed to get field for class: {}";
+    static final String E_FAIL_TO_GET_METHOD =
+            "Failed to get method for class: ";
+    static final String L_FAIL_TO_GET_METHOD =
+            "Failed to get method for class: {}";
+    static final String E_FAIL_TO_LOAD_CLASS =
+            "Failed to load class for class: ";
+    static final String E_FAIL_TO_LOAD_LEAF_IDENTIFIER_CLASS =
+            "Failed to load leaf identifier class";
+    static final String L_FAIL_TO_LOAD_CLASS =
+            "Failed to load class for class: {}";
+    static final String E_DATA_NODE_TYPE_IS_NOT_SUPPORT =
+            "Given data node type is not supported.";
+    static final String E_FAIL_TO_CREATE_OBJ =
+            "Failed to create an object for class: ";
+    static final String L_FAIL_TO_CREATE_OBJ =
+            "Failed to create an object for class: {}";
+    static final String E_REFLECTION_FAIL_TO_CREATE_OBJ =
+            "Reflection failed to create an object for class: ";
+    static final String L_REFLECTION_FAIL_TO_CREATE_OBJ =
+            "Reflection failed to create an object for class: {}";
+    static final String E_FAIL_TO_LOAD_CONSTRUCTOR =
+            "Failed to load constructor for class: {}";
+    static final String E_FAIL_TO_INVOKE_METHOD =
+            "Failed to invoke method for class: ";
+    static final String L_FAIL_TO_INVOKE_METHOD =
+            "Failed to invoke method for class: {}";
+    static final String E_DATA_TYPE_NOT_SUPPORT =
+            "Given data type is not supported.";
+    static final String E_INVALID_IDENTITY_DATA =
+            "Value for identityref data type is invalid";
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandler.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandler.java
new file mode 100644
index 0000000..6b28345
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandler.java
@@ -0,0 +1,81 @@
+/*
+ * 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;
+
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.runtime.YangModelRegistry;
+
+import static org.onosproject.yang.runtime.impl.YobUtils.getClassLoader;
+import static org.onosproject.yang.runtime.impl.YobUtils.getInstanceOfClass;
+import static org.onosproject.yang.runtime.impl.YobUtils.getQualifiedDefaultClass;
+
+/**
+ * Represents a YANG object builder handler to process the data node content and
+ * build yang object.
+ */
+abstract class YobHandler {
+
+    /**
+     * Creates a YANG builder object.
+     *
+     * @param schemaNode schema context
+     * @param reg        YANG model registry
+     * @return YOB workbench for the data node
+     */
+    YobWorkBench createObject(YangSchemaNode schemaNode,
+                              DefaultYangModelRegistry reg) {
+        YangSchemaNode node = schemaNode;
+        while (node.getReferredSchema() != null) {
+            node = node.getReferredSchema();
+        }
+
+        String qualName = getQualifiedDefaultClass(node);
+        ClassLoader classLoader = getClassLoader(node, reg);
+        String setterName = schemaNode.getJavaAttributeName();
+        Object builtObject = getInstanceOfClass(classLoader, qualName);
+        return new YobWorkBench(classLoader, builtObject, setterName,
+                                schemaNode);
+    }
+
+
+    /**
+     * Sets the YANG built object in corresponding parent class method.
+     *
+     * @param dataNode data node
+     * @param childWb  YOB work bench for data node
+     * @param parentWb YOB work bench for parent node
+     * @param reg      YANG model registry
+     */
+    void setInParent(DataNode dataNode,
+                     YobWorkBench childWb,
+                     YobWorkBench parentWb,
+                     DefaultYangModelRegistry reg) {
+        parentWb.setObject(childWb, dataNode, reg);
+    }
+
+    /**
+     * Builds the object.
+     *
+     * @param curWorkbench YOB work bench
+     * @param reg          YANG model registry
+     */
+    void buildObject(YobWorkBench curWorkbench,
+                     YangModelRegistry reg) {
+        curWorkbench.buildObject(reg);
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandlerFactory.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandlerFactory.java
new file mode 100644
index 0000000..d4e73f3
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandlerFactory.java
@@ -0,0 +1,92 @@
+/*
+ * 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;
+
+import org.onosproject.yang.model.DataNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+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.impl.YobConstants.E_DATA_NODE_TYPE_IS_NOT_SUPPORT;
+
+/**
+ * Represents an YANG object builder factory to create different types
+ * of YANG data tree node.
+ */
+final class YobHandlerFactory {
+
+    private static final Logger log =
+            LoggerFactory.getLogger(YobHandlerFactory.class);
+
+    /**
+     * Map of YANG object builder handler.
+     */
+    private static final Map<DataNode.Type, YobHandler> HANDLER_MAP = new
+            HashMap<>();
+
+    /**
+     * Creates instance of YobHandlerFactory.
+     */
+    private YobHandlerFactory() {
+        HANDLER_MAP.put(SINGLE_INSTANCE_NODE, new YobInnerNodeHandler());
+        HANDLER_MAP.put(MULTI_INSTANCE_NODE, new YobInnerNodeHandler());
+        HANDLER_MAP.put(SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                        new YobLeafNodeHandler());
+        HANDLER_MAP.put(MULTI_INSTANCE_LEAF_VALUE_NODE,
+                        new YobLeafListNodeHandler());
+    }
+
+    /**
+     * Returns the corresponding YOB handler for current context.
+     *
+     * @param type data node type
+     * @return handler to create the object
+     * @throws ModelConvertorException if the data node type is not supported in YOB
+     */
+    YobHandler getYobHandlerForContext(DataNode.Type type) {
+        YobHandler yobHandler = HANDLER_MAP.get(type);
+        if (yobHandler == null) {
+            log.error(E_DATA_NODE_TYPE_IS_NOT_SUPPORT);
+            throw new ModelConvertorException(E_DATA_NODE_TYPE_IS_NOT_SUPPORT);
+        }
+        return yobHandler;
+    }
+
+    /**
+     * Returns the YANG object builder factory instance.
+     *
+     * @return YANG object builder factory instance
+     */
+    static YobHandlerFactory instance() {
+        return LazyHolder.INSTANCE;
+    }
+
+    /*
+     * Bill Pugh Singleton pattern. INSTANCE won't be instantiated until the
+     * LazyHolder class is loaded via a call to the instance() method below.
+     */
+    static class LazyHolder {
+        private static final YobHandlerFactory INSTANCE =
+                new YobHandlerFactory();
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobInnerNodeHandler.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobInnerNodeHandler.java
new file mode 100644
index 0000000..22c4172
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobInnerNodeHandler.java
@@ -0,0 +1,23 @@
+/*
+ * 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;
+
+/**
+ * Represents a inner node handler in YANG object builder.
+ */
+class YobInnerNodeHandler extends YobHandler {
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobLeafListNodeHandler.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobLeafListNodeHandler.java
new file mode 100644
index 0000000..81ccd1d
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobLeafListNodeHandler.java
@@ -0,0 +1,117 @@
+/*
+ * 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;
+
+import org.onosproject.yang.compiler.datamodel.YangLeafList;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.compiler.datamodel.YangType;
+import org.onosproject.yang.compiler.datamodel.javadatamodel.JavaQualifiedTypeInfoContainer;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.LeafNode;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
+import static org.onosproject.yang.runtime.impl.YobConstants.ADD_TO;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_INVOKE_METHOD;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_INVOKE_METHOD;
+import static org.onosproject.yang.runtime.impl.YobUtils.getCapitalCase;
+import static org.onosproject.yang.runtime.impl.YobUtils.getChildSchemaNode;
+import static org.onosproject.yang.runtime.impl.YobUtils.setDataFromStringValue;
+
+/**
+ * Represents a multi instance leaf node handler in YANG object builder.
+ */
+class YobLeafListNodeHandler extends YobHandler {
+
+    private static final Logger log =
+            LoggerFactory.getLogger(YobLeafListNodeHandler.class);
+
+    @Override
+    YobWorkBench createObject(YangSchemaNode schemaNode,
+                                     DefaultYangModelRegistry registry) {
+        // For multi instance leaf no need to create an object.
+        return null;
+    }
+
+    /**
+     * Builds the object.
+     *
+     * @param registry YANG schema registry
+     */
+    void buildObject(YobWorkBench curWorkbench,
+                            YangModelRegistry registry) {
+        // For multi instance leaf no need to build an object.
+    }
+
+    @Override
+    void setInParent(DataNode leafNode,
+                            YobWorkBench curWb,
+                            YobWorkBench parentWb,
+                            DefaultYangModelRegistry reg) {
+        Class<?> parentClass = null;
+        try {
+            YangSchemaNode schemaNode = getChildSchemaNode(leafNode,
+                                                           curWb.schemaNode());
+            YangSchemaNode referredSchema = schemaNode;
+            while (referredSchema.getReferredSchema() != null) {
+                referredSchema = referredSchema.getReferredSchema();
+            }
+
+            String setterInParent = referredSchema.getJavaAttributeName();
+            Object parentObj = curWb.getParentObject(reg, schemaNode);
+            parentClass = parentObj.getClass();
+
+            Field leafName = parentClass
+                    .getDeclaredField(setterInParent);
+            ParameterizedType genericListType =
+                    (ParameterizedType) leafName.getGenericType();
+            Class<?> genericListClass;
+            if (((YangLeafList) referredSchema)
+                    .getDataType().getDataType() == IDENTITYREF) {
+                ParameterizedType type = (ParameterizedType)
+                        genericListType.getActualTypeArguments()[0];
+                genericListClass = type.getClass().getClass();
+            } else {
+                genericListClass = (Class<?>) genericListType.getActualTypeArguments()[0];
+            }
+
+            Method setterMethod = parentClass.getDeclaredMethod(
+                    ADD_TO + getCapitalCase(setterInParent), genericListClass);
+
+            JavaQualifiedTypeInfoContainer javaQualifiedType =
+                    (JavaQualifiedTypeInfoContainer) referredSchema;
+            YangType<?> yangType =
+                    ((YangLeafList) javaQualifiedType).getDataType();
+            setDataFromStringValue(yangType.getDataType(),
+                                   ((LeafNode) leafNode).value(), setterMethod,
+                                   parentObj, referredSchema,
+                                   curWb.schemaNode());
+        } catch (NoSuchMethodException | InvocationTargetException |
+                IllegalAccessException | NoSuchFieldException e) {
+            log.error(L_FAIL_TO_INVOKE_METHOD, parentClass.getName());
+            throw new ModelConvertorException(E_FAIL_TO_INVOKE_METHOD + parentClass
+                    .getName());
+        }
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobLeafNodeHandler.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobLeafNodeHandler.java
new file mode 100644
index 0000000..f407d13
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobLeafNodeHandler.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;
+
+import org.onosproject.yang.compiler.datamodel.YangLeaf;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.LeafNode;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_INVOKE_METHOD;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_INVOKE_METHOD;
+import static org.onosproject.yang.runtime.impl.YobUtils.getChildSchemaNode;
+import static org.onosproject.yang.runtime.impl.YobUtils.setDataFromStringValue;
+
+/**
+ * Represents a single instance leaf node handler in YANG object builder.
+ */
+class YobLeafNodeHandler extends YobHandler {
+
+    private static final Logger log =
+            LoggerFactory.getLogger(YobLeafNodeHandler.class);
+
+    @Override
+    YobWorkBench createObject(YangSchemaNode schemaNode,
+                                     DefaultYangModelRegistry registry) {
+        // For single instance leaf no need to create an object.
+        return null;
+    }
+
+    /**
+     * Builds the object.
+     *
+     * @param registry YANG schema registry
+     */
+    void buildObject(YobWorkBench curWorkbench,
+                            YangModelRegistry registry) {
+        // For single instance leaf no need to build an object.
+    }
+
+    @Override
+    void setInParent(DataNode leafNode,
+                            YobWorkBench curWb,
+                            YobWorkBench parentWb,
+                            DefaultYangModelRegistry registry) {
+        Class<?> parentClass = null;
+        try {
+            YangSchemaNode schemaNode = getChildSchemaNode(leafNode, curWb
+                    .schemaNode());
+            YangSchemaNode referredSchema = schemaNode;
+            while (referredSchema.getReferredSchema() != null) {
+                referredSchema = referredSchema.getReferredSchema();
+            }
+
+            String setterInParent = referredSchema.getJavaAttributeName();
+            Object parentObj = curWb.getParentObject(registry, schemaNode);
+            parentClass = parentObj.getClass();
+            YangDataTypes dataType = ((YangLeaf) referredSchema).getDataType()
+                    .getDataType();
+            if (((LeafNode) leafNode).value() != null ||
+                    dataType == YangDataTypes.EMPTY) {
+                Field leafName = parentClass.getDeclaredField(setterInParent);
+                Method setterMethod = parentClass.getDeclaredMethod(setterInParent,
+                                                                    leafName.getType());
+
+                setDataFromStringValue(dataType,
+                                       ((LeafNode) leafNode).value(),
+                                       setterMethod, parentObj, referredSchema,
+                                       curWb.schemaNode());
+            }
+        } catch (NoSuchMethodException | InvocationTargetException |
+                IllegalAccessException | NoSuchFieldException e) {
+            log.error(L_FAIL_TO_INVOKE_METHOD, parentClass.getName());
+            throw new ModelConvertorException(E_FAIL_TO_INVOKE_METHOD + parentClass
+                    .getName());
+        }
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobListener.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobListener.java
new file mode 100644
index 0000000..dd07eb5
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobListener.java
@@ -0,0 +1,203 @@
+/*
+ * 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;
+
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.model.SchemaId;
+import org.onosproject.yang.runtime.helperutils.DataNodeListener;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Stack;
+
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getChildSchemaContext;
+import static org.onosproject.yang.runtime.impl.YobHandlerFactory.instance;
+import static org.onosproject.yang.runtime.impl.YobUtils.FORWARD_SLASH;
+import static org.onosproject.yang.runtime.impl.YobUtils.buildLeafModelObject;
+
+/**
+ * Represents implementation of YANG object builder listener.
+ */
+class YobListener implements DataNodeListener {
+
+    /**
+     * Reference to parent schema.
+     */
+    private YangSchemaNode lastIndexSchema;
+
+    /**
+     * Reference to YOB handler.
+     */
+    private final YobHandlerFactory handlerFactory;
+
+    /**
+     * Reference to YANG model registry.
+     */
+    private final DefaultYangModelRegistry registry;
+
+    /**
+     * Stack of YOB workbench.
+     */
+    private final Stack<YobWorkBench> wbStack;
+
+    /**
+     * List of model objects.
+     */
+    private List<ModelObject> modelObjectList;
+
+
+    /**
+     * Creates an instance of YANG object builder listener.
+     *
+     * @param reg YANG model registry
+     */
+    public YobListener(YangSchemaNode node, DefaultYangModelRegistry reg) {
+        this.lastIndexSchema = node;
+        this.handlerFactory = instance();
+        this.registry = reg;
+        this.wbStack = new Stack<>();
+        this.modelObjectList = new LinkedList<>();
+    }
+
+    /**
+     * Returns the list of model object.
+     *
+     * @return list of model object
+     */
+    public List<ModelObject> modelObjectList() {
+        return modelObjectList;
+    }
+
+    /**
+     * Sets the list of model object.
+     *
+     * @param moList list of model object
+     */
+    public void modelObjectList(List<ModelObject> moList) {
+        modelObjectList = moList;
+    }
+
+    /**
+     * Returns the YOB work bench stack.
+     *
+     * @return YOB work bench stack
+     */
+    public Stack<YobWorkBench> wbStack() {
+        return wbStack;
+    }
+
+
+    /**
+     * Returns the parent schema node.
+     *
+     * @return parent schema node
+     */
+    public YangSchemaNode lastIndexSchema() {
+        return lastIndexSchema;
+    }
+
+    /**
+     * Sets the parent schema node.
+     *
+     * @param schemaNode YANG schema node
+     */
+    public void lastIndexSchema(YangSchemaNode schemaNode) {
+        lastIndexSchema = schemaNode;
+    }
+
+    @Override
+    public void enterDataNode(DataNode node) {
+        SchemaId schemaId = node.key().schemaId();
+        if (schemaId.name().equals(FORWARD_SLASH)) {
+            return;
+        }
+
+        YangSchemaNode schemaNode;
+        if (wbStack.isEmpty() && lastIndexSchema == null) {
+            /*
+             * It is first level child and resource id is null. So get the
+             * schema information from registry.
+             */
+            schemaNode = ((YangSchemaNode) registry.getChildContext(schemaId));
+        } else if (wbStack.isEmpty() && lastIndexSchema != null) {
+            /*
+             * Resource id is not null, lastIndexSchema will have schema node
+             * of last node key in resource id.
+             */
+            schemaNode = ((YangSchemaNode)
+                    getChildSchemaContext(lastIndexSchema, schemaId.name(),
+                                          schemaId.namespace()));
+        } else {
+            /*
+             * get schema context for the node from parent data node's schema
+             * context.
+             */
+            SchemaContext parentContext = wbStack.peek().schemaNode();
+            schemaNode = ((YangSchemaNode)
+                    getChildSchemaContext(parentContext, schemaId.name(),
+                                          schemaId.namespace()));
+        }
+
+        // get YOB handler based on node type
+        YobHandler nodeHandler = handlerFactory.getYobHandlerForContext(node.type());
+
+        // Create object for the data node
+        YobWorkBench workBench = nodeHandler.createObject(schemaNode, registry);
+        if (workBench != null) {
+            wbStack.push(workBench);
+        }
+    }
+
+    @Override
+    public void exitDataNode(DataNode node) {
+        SchemaId schemaId = node.key().schemaId();
+        if (schemaId.name().equals(FORWARD_SLASH)) {
+            return;
+        }
+
+        YobWorkBench curWb;
+        YobWorkBench parentWb = null;
+        if (node instanceof InnerNode) {
+            if (wbStack.size() == 1) {
+                curWb = wbStack.pop();
+                YobHandler nodeHandler = handlerFactory.getYobHandlerForContext(node.type());
+                nodeHandler.buildObject(curWb, registry);
+                modelObjectList.add(((ModelObject) curWb.getBuiltObject()));
+                return;
+            } else {
+                curWb = wbStack.pop();
+                parentWb = wbStack.peek();
+            }
+        } else {
+            if (wbStack.isEmpty()) {
+                ModelObject obj = buildLeafModelObject(node, lastIndexSchema, registry);
+                modelObjectList.add(obj);
+                return;
+            }
+            curWb = wbStack.peek();
+        }
+
+        YobHandler nodeHandler = handlerFactory.getYobHandlerForContext(node.type());
+        nodeHandler.buildObject(curWb, registry);
+        nodeHandler.setInParent(node, curWb, parentWb, registry);
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobUtils.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobUtils.java
new file mode 100644
index 0000000..1e43f47
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobUtils.java
@@ -0,0 +1,895 @@
+/*
+ * 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;
+
+import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
+import org.onosproject.yang.compiler.datamodel.YangDerivedInfo;
+import org.onosproject.yang.compiler.datamodel.YangIdentity;
+import org.onosproject.yang.compiler.datamodel.YangIdentityRef;
+import org.onosproject.yang.compiler.datamodel.YangLeaf;
+import org.onosproject.yang.compiler.datamodel.YangLeafList;
+import org.onosproject.yang.compiler.datamodel.YangLeafRef;
+import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNodeContextInfo;
+import org.onosproject.yang.compiler.datamodel.YangType;
+import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.KeyInfo;
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.LeafIdentifier;
+import org.onosproject.yang.model.LeafListKey;
+import org.onosproject.yang.model.LeafModelObject;
+import org.onosproject.yang.model.LeafNode;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.MultiInstanceObject;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.model.SchemaId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.onosproject.yang.compiler.datamodel.YangSchemaNodeType.YANG_AUGMENT_NODE;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.nonEmpty;
+import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getCamelCase;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.getChildSchemaContext;
+import static org.onosproject.yang.runtime.impl.YobConstants.DEFAULT;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_DATA_TYPE_NOT_SUPPORT;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_CREATE_OBJ;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_LOAD_CLASS;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_LOAD_CONSTRUCTOR;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_LOAD_LEAF_IDENTIFIER_CLASS;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_INVALID_IDENTITY_DATA;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_REFLECTION_FAIL_TO_CREATE_OBJ;
+import static org.onosproject.yang.runtime.impl.YobConstants.FROM_STRING;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_CREATE_OBJ;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_LOAD_CLASS;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_REFLECTION_FAIL_TO_CREATE_OBJ;
+import static org.onosproject.yang.runtime.impl.YobConstants.OF;
+import static org.onosproject.yang.runtime.impl.YobConstants.OP_PARAM;
+import static org.onosproject.yang.runtime.impl.YobConstants.PERIOD;
+
+/**
+ * Utils to support object creation.
+ */
+final class YobUtils {
+
+    private static final Logger log = LoggerFactory.getLogger(YobUtils.class);
+    public static final String FORWARD_SLASH = "/";
+    private static final String ENUM_LEAF_IDENTIFIER = "$LeafIdentifier";
+
+    // no instantiation
+    private YobUtils() {
+    }
+
+    /**
+     * Sets data from string value in parent method.
+     *
+     * @param type         refers to YANG data type
+     * @param value        value argument is used to set the value in method
+     * @param parentSetter Invokes the underlying method represented
+     *                     by this parentSetter
+     * @param parentObj    the parentObject is to invoke the underlying method
+     * @param schemaNode   schema information
+     * @param parentSchema schema information of parent
+     * @throws InvocationTargetException if failed to invoke method
+     * @throws IllegalAccessException    if member cannot be accessed
+     * @throws NoSuchMethodException     if method is not found
+     */
+    static void setDataFromStringValue(YangDataTypes type,
+                                       Object value,
+                                       Method parentSetter,
+                                       Object parentObj,
+                                       YangSchemaNode schemaNode,
+                                       YangSchemaNode parentSchema)
+            throws InvocationTargetException, IllegalAccessException,
+            NoSuchMethodException {
+        switch (type) {
+            case INT8:
+            case UINT8:
+            case INT16:
+            case UINT16:
+            case INT32:
+            case UINT32:
+            case INT64:
+            case UINT64:
+            case BOOLEAN:
+            case EMPTY:
+            case STRING:
+                parentSetter.invoke(parentObj, value);
+                break;
+            case BINARY:
+                parentSetter.invoke(parentObj, ((String) value).getBytes());
+                break;
+            case BITS:
+                parseBitSetTypeInfo(parentSetter, parentObj, value,
+                                    schemaNode, parentSchema);
+                break;
+            case DECIMAL64:
+                parentSetter.invoke(parentObj, new BigDecimal(value.toString()));
+                break;
+
+            case DERIVED:
+                parseDerivedTypeInfo(parentSetter, parentObj, value.toString(),
+                                     false, schemaNode);
+                break;
+
+            case IDENTITYREF:
+                parseIdentityRefInfo(parentSetter, parentObj, value,
+                                     schemaNode);
+                break;
+
+            case UNION:
+                parseDerivedTypeInfo(parentSetter, parentObj, value.toString(),
+                                     false, schemaNode);
+                break;
+
+            case LEAFREF:
+                parseLeafRefTypeInfo(parentSetter, parentObj, value,
+                                     schemaNode, parentSchema);
+                break;
+
+            case ENUMERATION:
+                parseDerivedTypeInfo(parentSetter, parentObj, value.toString(),
+                                     true, schemaNode);
+                break;
+
+            default:
+                log.error(E_DATA_TYPE_NOT_SUPPORT);
+        }
+    }
+
+    /**
+     * To set data into parent setter method from string value for derived type.
+     *
+     * @param parentSetter the parent setter method to be invoked
+     * @param parentObj    the parent build object on which to invoke the
+     *                     method
+     * @param value        value to be set in method
+     * @param isEnum       flag to check whether type is enum or derived
+     * @param leaf         schema node
+     * @throws InvocationTargetException if failed to invoke method
+     * @throws IllegalAccessException    if member cannot be accessed
+     * @throws NoSuchMethodException     if the required method is not found
+     */
+    static void parseDerivedTypeInfo(Method parentSetter,
+                                     Object parentObj,
+                                     String value,
+                                     boolean isEnum,
+                                     YangSchemaNode leaf)
+            throws InvocationTargetException, IllegalAccessException,
+            NoSuchMethodException {
+        Class<?> childSetClass = null;
+        Constructor<?> childConstructor = null;
+        Object childValue = null;
+        Object childObject = null;
+        Method childMethod = null;
+        while (leaf.getReferredSchema() != null) {
+            leaf = leaf.getReferredSchema();
+        }
+
+        String qualifiedClassName = leaf.getJavaPackage() + PERIOD +
+                getCapitalCase(leaf.getJavaClassNameOrBuiltInType());
+        ClassLoader classLoader = parentObj.getClass().getClassLoader();
+        try {
+            childSetClass = classLoader.loadClass(qualifiedClassName);
+        } catch (ClassNotFoundException e) {
+            log.error(L_FAIL_TO_LOAD_CLASS, qualifiedClassName);
+        }
+
+        if (!isEnum) {
+            if (childSetClass != null) {
+                childConstructor = childSetClass.getDeclaredConstructor();
+            }
+
+            if (childConstructor != null) {
+                childConstructor.setAccessible(true);
+            }
+
+            try {
+                if (childConstructor != null) {
+                    childObject = childConstructor.newInstance();
+                }
+            } catch (InstantiationException e) {
+                log.error(E_FAIL_TO_LOAD_CONSTRUCTOR, qualifiedClassName);
+            }
+            if (childSetClass != null) {
+                childMethod = childSetClass
+                        .getDeclaredMethod(FROM_STRING, String.class);
+            }
+        } else {
+            if (childSetClass != null) {
+                childMethod = childSetClass.getDeclaredMethod(OF, String.class);
+            }
+        }
+        if (childMethod != null) {
+            childValue = childMethod.invoke(childObject, value);
+        }
+        parentSetter.invoke(parentObj, childValue);
+    }
+
+    /**
+     * To set data into parent setter method from string value for bits type.
+     *
+     * @param parentSetterMethod the parent setter method to be invoked
+     * @param parentObject       the parent build object on which to invoke the
+     *                           method
+     * @param leafValue          value to be set in method
+     * @param leaf               schema information
+     * @param parentSchema       schema information of parent
+     * @throws InvocationTargetException if failed to invoke method
+     * @throws IllegalAccessException    if member cannot be accessed
+     * @throws NoSuchMethodException     if the required method is not found
+     */
+    static void parseBitSetTypeInfo(Method parentSetterMethod,
+                                    Object parentObject,
+                                    Object leafValue,
+                                    YangSchemaNode leaf,
+                                    YangSchemaNode parentSchema)
+            throws InvocationTargetException, IllegalAccessException,
+            NoSuchMethodException {
+        Class<?> childSetClass = null;
+        Object childValue = null;
+        Object childObject = null;
+        Method childMethod = null;
+
+        while (leaf.getReferredSchema() != null) {
+            leaf = leaf.getReferredSchema();
+        }
+
+        String qualifiedClassName = parentSchema.getJavaPackage() + PERIOD +
+                parentSchema.getJavaAttributeName().toLowerCase() +
+                PERIOD + getCapitalCase(leaf.getJavaAttributeName());
+
+        ClassLoader classLoader = parentObject.getClass().getClassLoader();
+
+        try {
+            childSetClass = classLoader.loadClass(qualifiedClassName);
+        } catch (ClassNotFoundException e) {
+            log.error(L_FAIL_TO_LOAD_CLASS, qualifiedClassName);
+        }
+
+        if (childSetClass != null) {
+            childMethod = childSetClass.getDeclaredMethod(FROM_STRING, String.class);
+        }
+        if (childMethod != null) {
+            childValue = childMethod.invoke(childObject, leafValue);
+        }
+
+        parentSetterMethod.invoke(parentObject, childValue);
+
+    }
+
+    /**
+     * To set data into parent setter method from string value for leafref type.
+     *
+     * @param parentSetterMethod the parent setter method to be invoked
+     * @param parentObject       the parent build object on which to invoke
+     *                           the method
+     * @param leafValue          leaf value to be set
+     * @param schemaNode         schema information
+     * @param parentSchema       schema information of parent
+     * @throws InvocationTargetException if method could not be invoked
+     * @throws IllegalAccessException    if method could not be accessed
+     * @throws NoSuchMethodException     if method does not exist
+     */
+    static void parseLeafRefTypeInfo(Method parentSetterMethod,
+                                     Object parentObject,
+                                     Object leafValue,
+                                     YangSchemaNode schemaNode,
+                                     YangSchemaNode parentSchema)
+            throws InvocationTargetException, IllegalAccessException,
+            NoSuchMethodException {
+        while (schemaNode.getReferredSchema() != null) {
+            schemaNode = schemaNode.getReferredSchema();
+        }
+
+        YangLeafRef leafRef;
+        if (schemaNode instanceof YangLeaf) {
+            leafRef = (YangLeafRef) ((YangLeaf) schemaNode)
+                    .getDataType().getDataTypeExtendedInfo();
+        } else {
+            leafRef = (YangLeafRef) ((YangLeafList) schemaNode)
+                    .getDataType().getDataTypeExtendedInfo();
+        }
+
+        YangType type = leafRef.getEffectiveDataType();
+        if (type.getDataType() == YangDataTypes.DERIVED &&
+                schemaNode.getJavaPackage().equals(YobConstants.JAVA_LANG)) {
+            /*
+             * If leaf is inside grouping, then its return type will be of type
+             * Object and if its actual type is derived type then get the
+             * effective built-in type and set the value.
+             */
+            YangDerivedInfo derivedInfo = (YangDerivedInfo) leafRef
+                    .getEffectiveDataType()
+                    .getDataTypeExtendedInfo();
+            YobUtils.setDataFromStringValue(derivedInfo.getEffectiveBuiltInType(),
+                                            leafValue, parentSetterMethod,
+                                            parentObject, schemaNode, parentSchema);
+        } else {
+            YobUtils.setDataFromStringValue(type.getDataType(),
+                                            leafValue, parentSetterMethod,
+                                            parentObject,
+                                            schemaNode, parentSchema);
+        }
+
+    }
+
+    /**
+     * Returns class loader.
+     *
+     * @param schemaNode schema information
+     * @param reg        YANG model registry
+     * @return class loader
+     */
+    static ClassLoader getClassLoader(YangSchemaNode schemaNode,
+                                      DefaultYangModelRegistry reg) {
+
+        YangSchemaNode curNode = schemaNode;
+        while (!(curNode instanceof RpcNotificationContainer)) {
+            curNode = ((YangNode) curNode).getParent();
+        }
+
+        Class<?> regClass = reg.getRegisteredClass(curNode);
+        return regClass.getClassLoader();
+    }
+
+    /**
+     * Returns the class loader to be used for the switched context schema node.
+     *
+     * @param curLoader current context class loader
+     * @param context   switched context
+     * @param reg       schema registry
+     * @return class loader to be used for the switched context schema node
+     */
+    static ClassLoader getTargetClassLoader(ClassLoader curLoader,
+                                            YangSchemaNodeContextInfo context,
+                                            DefaultYangModelRegistry
+                                                    reg) {
+        YangSchemaNode augmentSchemaNode = context.getContextSwitchedNode();
+        if (augmentSchemaNode.getYangSchemaNodeType() == YANG_AUGMENT_NODE) {
+            YangSchemaNode moduleNode = ((YangNode) augmentSchemaNode).getParent();
+
+            Class<?> moduleClass = reg.getRegisteredClass(moduleNode);
+            if (moduleClass == null) {
+                throw new ModelConvertorException(E_FAIL_TO_LOAD_CLASS + moduleNode
+                        .getJavaClassNameOrBuiltInType());
+            }
+            return moduleClass.getClassLoader();
+        }
+        return curLoader;
+    }
+
+    /**
+     * Returns the qualified default / op param class.
+     *
+     * @param schemaNode schema node of the required class
+     * @return qualified default / op param class name
+     */
+    static String getQualifiedDefaultClass(YangSchemaNode schemaNode) {
+        String packageName = schemaNode.getJavaPackage();
+        String className = getCapitalCase(
+                schemaNode.getJavaClassNameOrBuiltInType());
+
+        if (schemaNode instanceof RpcNotificationContainer) {
+            return packageName + PERIOD + className + OP_PARAM;
+        }
+
+        return packageName + PERIOD + DEFAULT + className;
+    }
+
+    /**
+     * Returns the qualified interface name.
+     *
+     * @param schemaNode schema node of the required class
+     * @return qualified interface name
+     */
+    static String getQualifiedinterface(YangSchemaNode schemaNode) {
+        String packageName = schemaNode.getJavaPackage();
+        String className = getCapitalCase(
+                schemaNode.getJavaClassNameOrBuiltInType());
+
+        return packageName + PERIOD + className;
+    }
+
+    /**
+     * Returns the capital cased first letter of the given string.
+     *
+     * @param name string to be capital cased
+     * @return capital cased string
+     */
+    static String getCapitalCase(String name) {
+        return name.substring(0, 1).toUpperCase() +
+                name.substring(1);
+    }
+
+    /**
+     * To set data into parent setter method from string value for identity ref.
+     *
+     * @param parentSetterMethod the parent setter method to be invoked
+     * @param parentObject       the parent build object on which to invoke
+     *                           the method
+     * @param leafValue          leaf value to be set
+     * @param schemaNode         schema information
+     * @throws InvocationTargetException if method could not be invoked
+     * @throws IllegalAccessException    if method could not be accessed
+     * @throws NoSuchMethodException     if method does not exist
+     */
+    static void parseIdentityRefInfo(Method parentSetterMethod,
+                                     Object parentObject,
+                                     Object leafValue,
+                                     YangSchemaNode schemaNode)
+            throws InvocationTargetException, IllegalAccessException,
+            NoSuchMethodException {
+        Class<?> childSetClass = null;
+        Object childValue = null;
+        Method childMethod = null;
+
+        while (schemaNode.getReferredSchema() != null) {
+            schemaNode = schemaNode.getReferredSchema();
+        }
+
+        String qualifiedClassName;
+        YangType type;
+        if (schemaNode instanceof YangLeaf) {
+            type = ((YangLeaf) schemaNode).getDataType();
+        } else {
+            type = ((YangLeafList) schemaNode).getDataType();
+        }
+
+        YangIdentityRef identityRef = null;
+        YangIdentity derivedId;
+        if (type.getDataType() == YangDataTypes.LEAFREF && schemaNode
+                .getJavaPackage().equals(YobConstants.JAVA_LANG)) {
+            YangLeafRef leafref = ((YangLeafRef) type.getDataTypeExtendedInfo());
+            YangType effectiveType = leafref.getEffectiveDataType();
+            if (effectiveType.getDataType() == YangDataTypes.IDENTITYREF) {
+                identityRef = ((YangIdentityRef) effectiveType
+                        .getDataTypeExtendedInfo());
+            }
+        } else {
+            identityRef = ((YangIdentityRef) type.getDataTypeExtendedInfo());
+        }
+
+        derivedId = getDerivedIdentity(leafValue.toString(), identityRef
+                .getReferredIdentity());
+        if (derivedId == null) {
+            throw new ModelConvertorException(E_INVALID_IDENTITY_DATA);
+        }
+        qualifiedClassName = derivedId.getJavaPackage() + PERIOD +
+                getCapitalCase(derivedId.getJavaClassNameOrBuiltInType());
+        ClassLoader classLoader = parentObject.getClass().getClassLoader();
+        try {
+            childSetClass = classLoader.loadClass(qualifiedClassName);
+        } catch (ClassNotFoundException e) {
+            log.error(L_FAIL_TO_LOAD_CLASS, qualifiedClassName);
+        }
+
+        if (childSetClass != null) {
+            childMethod = childSetClass
+                    .getDeclaredMethod(FROM_STRING, String.class);
+        }
+
+        if (childMethod != null) {
+            childValue = childMethod.invoke(null, leafValue);
+        }
+
+        parentSetterMethod.invoke(parentObject, childValue);
+    }
+
+    /**
+     * Returns schema node for given data node.
+     *
+     * @param dataNode data node
+     * @param context  schema context
+     * @return child schema node
+     */
+    static YangSchemaNode getChildSchemaNode(DataNode dataNode,
+                                             SchemaContext context) {
+        SchemaId schemaId = dataNode.key().schemaId();
+        SchemaContext schemaContext = getChildSchemaContext(context,
+                                                            schemaId.name(),
+                                                            schemaId.namespace());
+        return ((YangSchemaNode) schemaContext);
+    }
+
+    /**
+     * Builds leaf model object.
+     *
+     * @param dataNode   data node
+     * @param leafHolder schema context
+     * @param reg        YANG model registry
+     * @return leaf model object
+     */
+    static ModelObject buildLeafModelObject(DataNode dataNode,
+                                            YangSchemaNode leafHolder,
+                                            DefaultYangModelRegistry reg) {
+        if (leafHolder == null) {
+            YangSchemaNode schemaNode = ((YangSchemaNode) reg
+                    .getChildContext(dataNode.key().schemaId()));
+            if (schemaNode instanceof YangLeaf) {
+                leafHolder = ((YangSchemaNode) ((YangLeaf) schemaNode)
+                        .getContainedIn());
+            } else {
+                leafHolder = ((YangSchemaNode) ((YangLeafList) schemaNode)
+                        .getContainedIn());
+            }
+        }
+        LeafModelObject leafObj = new LeafModelObject();
+        leafObj.addValue(((LeafNode) dataNode).value());
+        LeafIdentifier leafId = getLeafIdentifier(dataNode.key().schemaId(),
+                                                  leafHolder, reg);
+        leafObj.leafIdentifier(leafId);
+        return leafObj;
+    }
+
+    /**
+     * Returns leaf identifier of the leaf.
+     *
+     * @param id         schema id class loader
+     * @param leafHolder parent of leaf
+     * @param reg        YANG model registry
+     * @return leaf identifier of the leaf
+     */
+    static LeafIdentifier getLeafIdentifier(SchemaId id,
+                                            YangSchemaNode leafHolder,
+                                            DefaultYangModelRegistry
+                                                    reg) {
+        String qualName = getQualifiedDefaultClass(leafHolder);
+        ClassLoader classLoader = getClassLoader(leafHolder, reg);
+        try {
+            Class<InnerModelObject> cls = (Class<InnerModelObject>) classLoader
+                    .loadClass(qualName);
+            Class<?>[] intfs = cls.getInterfaces();
+            Class<?> intf = null;
+            for (Class<?> in : intfs) {
+                if (in.getName()
+                        .equals(getJavaQualifiedInterFaceName(leafHolder))) {
+                    intf = in;
+                    break;
+                }
+            }
+            String leafId;
+            if (intf != null) {
+                leafId = intf.getName() + ENUM_LEAF_IDENTIFIER;
+            } else {
+                throw new ModelConvertorException(E_FAIL_TO_LOAD_LEAF_IDENTIFIER_CLASS);
+            }
+
+            Class<Enum> leafIdentifier =
+                    (Class<Enum>) cls.getClassLoader().loadClass(leafId);
+            Enum[] enumConst = leafIdentifier.getEnumConstants();
+            for (Enum e : enumConst) {
+                if (e.name().equalsIgnoreCase(id.name())) {
+                    return ((LeafIdentifier) e);
+                }
+            }
+        } catch (ClassNotFoundException e) {
+            throw new ModelConvertorException(E_FAIL_TO_LOAD_CLASS);
+        }
+        return null;
+    }
+
+    /**
+     * Returns class.
+     *
+     * @param loader class loader
+     * @param name   class name
+     * @return java class
+     */
+    static Class<?> fetchClassForNode(ClassLoader loader, String name) {
+        try {
+            return loader.loadClass(name);
+        } catch (ClassNotFoundException e) {
+            throw new ModelConvertorException(E_FAIL_TO_LOAD_CLASS + name);
+        }
+    }
+
+    /**
+     * Returns instance of class.
+     *
+     * @param loader class loader
+     * @param name   class name
+     * @return instance of class
+     */
+    static Object getInstanceOfClass(ClassLoader loader, String name) {
+        try {
+            Class<?> defaultClass = loader.loadClass(name);
+            return defaultClass.newInstance();
+        } catch (ClassNotFoundException e) {
+            log.error(L_FAIL_TO_LOAD_CLASS, name);
+            throw new ModelConvertorException(E_FAIL_TO_LOAD_CLASS + name);
+        } catch (NullPointerException e) {
+            log.error(L_REFLECTION_FAIL_TO_CREATE_OBJ, name);
+            throw new ModelConvertorException(E_REFLECTION_FAIL_TO_CREATE_OBJ +
+                                                      name);
+        } catch (InstantiationException | IllegalAccessException e) {
+            log.error(L_FAIL_TO_CREATE_OBJ, name);
+            throw new ModelConvertorException(E_FAIL_TO_CREATE_OBJ + name);
+        }
+    }
+
+    /**
+     * Returns java class name.
+     *
+     * @param node YANG node
+     * @return java class name
+     */
+    static String getJavaQualifiedInterFaceName(YangSchemaNode node) {
+        if (node != null) {
+            return node.getJavaPackage() + PERIOD
+                    + getCapitalCase(node.getJavaClassNameOrBuiltInType());
+        }
+        return null;
+    }
+
+    /**
+     * Returns key class name.
+     *
+     * @param node schema node
+     * @return key class name
+     */
+    static String getKeyClassName(YangSchemaNode node) {
+        if (node != null) {
+            return getJavaQualifiedInterFaceName(node) + "Keys";
+        }
+        return null;
+    }
+
+    /**
+     * Returns key leaf schema.
+     *
+     * @param keyleaf key leaf
+     * @return node YANG schema node
+     */
+    static YangLeaf getKeyLeafSchema(KeyLeaf keyleaf, YangSchemaNode
+            node) {
+        YangList list = ((YangList) node);
+        List<YangLeaf> keyLeaves = list.getListOfLeaf();
+        Iterator<YangLeaf> it = keyLeaves.iterator();
+        while (it.hasNext()) {
+            YangLeaf leaf = it.next();
+            if (leaf.getName().equals(keyleaf.leafSchema().name())) {
+                return leaf;
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * Adds list node key to model object id builder.
+     *
+     * @param midb model object identifier
+     * @param reg  model registry
+     * @param node YANG node
+     * @param key  node key
+     * @return model object id builder
+     */
+    static <T extends InnerModelObject & MultiInstanceObject<K>,
+            K extends KeyInfo<T>> ModelObjectId.Builder handleListKey(
+            ModelObjectId.Builder midb, DefaultYangModelRegistry reg,
+            YangSchemaNode node, NodeKey key) {
+        ListKey listKey = (ListKey) key;
+        List<KeyLeaf> keyLeaves = listKey.keyLeafs();
+        String keyClassName;
+        Class<KeyInfo> keyClass;
+        Object value;
+        String javaName = null;
+        Method setter;
+        if (nonEmpty(keyLeaves)) {
+            String qualName = getQualifiedDefaultClass(node);
+            ClassLoader classLoader = getClassLoader(node, reg);
+            Class<T> listClass = ((Class<T>) fetchClassForNode(classLoader,
+                                                               qualName));
+            K keyObj;
+            if (listClass != null) {
+                keyClassName = getKeyClassName(node);
+                try {
+                    keyClass = (Class<KeyInfo>) listClass.getClassLoader()
+                            .loadClass(keyClassName);
+                    keyObj = (K) keyClass.newInstance();
+                    for (KeyLeaf leaf : keyLeaves) {
+                        YangLeaf leafSchema = getKeyLeafSchema(leaf, node);
+                        YangDataTypes datatype = leafSchema.getDataType()
+                                .getDataType();
+                        javaName = getCamelCase(leaf.leafSchema().name(), null);
+                        Field leafName = keyClass.getDeclaredField(javaName);
+                        setter = keyClass.getDeclaredMethod(javaName,
+                                                            leafName.getType());
+                        value = leaf.leafValue();
+                        setDataFromStringValue(datatype,
+                                               value, setter, keyObj,
+                                               leafSchema, node);
+                        midb = midb.addChild(listClass, keyObj);
+                    }
+                } catch (NoSuchMethodException e) {
+                    throw new ModelConvertorException(
+                            "Failed to load setter method for " +
+                                    javaName + " in key class"
+                                    + keyClassName);
+                } catch (InvocationTargetException e) {
+                    throw new ModelConvertorException(
+                            "Failed to invoke setter method for " +
+                                    javaName + " in key class"
+                                    + keyClassName);
+                } catch (ClassNotFoundException e) {
+                    throw new ModelConvertorException("Failed to load key class"
+                                                              + keyClassName);
+                } catch (IllegalAccessException | InstantiationException e) {
+                    throw new ModelConvertorException("Failed Instantiation of key class"
+                                                              + keyClassName);
+                } catch (NoSuchFieldException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return midb;
+    }
+
+    /**
+     * Adds leaf list node key to model object id builder.
+     *
+     * @param midb       model object identifier
+     * @param reg        model registry
+     * @param schemaNode leaf schema node
+     * @return model object id builder
+     */
+    static ModelObjectId.Builder handleLeafListKey(
+            ModelObjectId.Builder midb, DefaultYangModelRegistry reg,
+            YangSchemaNode schemaNode, LeafListKey key) {
+        Class<?> intf = null;
+        YangSchemaNode parentSchema = ((YangSchemaNode) ((YangLeafList)
+                schemaNode).getContainedIn());
+        String qualName = getQualifiedDefaultClass(parentSchema);
+        ClassLoader classLoader = getClassLoader(parentSchema, reg);
+        Class<?> parentClass = fetchClassForNode(classLoader, qualName);
+        Class<?>[] interfaces = parentClass.getInterfaces();
+        for (Class<?> in : interfaces) {
+            if (in.getName().equals(getJavaQualifiedInterFaceName(parentSchema))) {
+                intf = in;
+                break;
+            }
+        }
+        String leafName;
+        if (intf != null) {
+            leafName = intf.getName() + ENUM_LEAF_IDENTIFIER;
+            try {
+                Class<Enum> leafId =
+                        (Class<Enum>) parentClass.getClassLoader()
+                                .loadClass(leafName);
+                Enum[] enumConst = leafId.getEnumConstants();
+                for (Enum e : enumConst) {
+                    if (e.name().equalsIgnoreCase(key.schemaId().name())) {
+                        midb = midb.addChild(((LeafIdentifier) e), key.value());
+                        return midb;
+                    }
+                }
+            } catch (ClassNotFoundException e) {
+                throw new ModelConvertorException("Failed to load leaf identifier class." +
+                                                          leafName);
+            }
+        }
+        return midb;
+    }
+
+
+    /**
+     * Adds node key for container node or single instance nodes to model
+     * object id builder.
+     *
+     * @param midb model object identifier builder
+     * @param reg  model registry
+     * @param node YANG node
+     * @param key  node key
+     * @return model object builder with single instance node
+     */
+    static ModelObjectId.Builder handleNodeKey(
+            ModelObjectId.Builder midb, DefaultYangModelRegistry reg,
+            YangSchemaNode node, NodeKey key) {
+        if (node != null) {
+            if (!(node instanceof YangLeaf)) {
+                String qualName = getQualifiedDefaultClass(node);
+                ClassLoader classLoader = getClassLoader(node, reg);
+                Class<InnerModelObject> nodeClass = (Class<InnerModelObject>)
+                        fetchClassForNode(classLoader, qualName);
+                if (nodeClass != null) {
+                    midb = midb.addChild(nodeClass);
+                }
+            } else {
+                midb = handleLeafInfo(midb, reg, key, node);
+            }
+        }
+        return midb;
+    }
+
+    /**
+     * Adds node key for leaf node to model object id builder.
+     *
+     * @param midb       model object identifier builder
+     * @param reg        model registry
+     * @param schemaNode YANG schema node
+     * @return model object builder with single instance node
+     */
+    static ModelObjectId.Builder handleLeafInfo(
+            ModelObjectId.Builder midb, DefaultYangModelRegistry reg,
+            NodeKey key, YangSchemaNode schemaNode) {
+        YangSchemaNode parentSchema = ((YangSchemaNode) ((YangLeaf) schemaNode)
+                .getContainedIn());
+        String qualName = getQualifiedDefaultClass(parentSchema);
+        ClassLoader classLoader = getClassLoader(parentSchema, reg);
+        Class<InnerModelObject> nodeClass = (Class<InnerModelObject>)
+                fetchClassForNode(classLoader, qualName);
+        Class<?>[] interfaces = nodeClass.getInterfaces();
+        for (Class<?> intf : interfaces) {
+            String leafId = intf.getName() + ENUM_LEAF_IDENTIFIER;
+            try {
+                Class<Enum> leafIdentifier =
+                        (Class<Enum>) nodeClass.getClassLoader()
+                                .loadClass(leafId);
+                Enum[] enumConst = leafIdentifier.getEnumConstants();
+                for (Enum e : enumConst) {
+                    if (e.name().equalsIgnoreCase(key.schemaId().name())) {
+                        midb = midb.addChild(((LeafIdentifier) e));
+                        return midb;
+                    }
+                }
+            } catch (ClassNotFoundException e) {
+                throw new ModelConvertorException(E_FAIL_TO_LOAD_LEAF_IDENTIFIER_CLASS);
+            }
+        }
+        return midb;
+    }
+
+    /**
+     * Returns derived identity based on the leaf value.
+     *
+     * @param value      leaf value
+     * @param referredId referred identity of leaf
+     * @return derived identity
+     */
+    static YangIdentity getDerivedIdentity(String value,
+                                           YangIdentity referredId) {
+        if (referredId.getJavaClassNameOrBuiltInType().equalsIgnoreCase(value)) {
+            return referredId;
+        }
+
+        List<YangIdentity> extendList = referredId.getExtendList();
+        if (extendList != null && !extendList.isEmpty()) {
+            for (YangIdentity identity : extendList) {
+                if (identity.getYangSchemaNodeIdentifier().getName()
+                        .equalsIgnoreCase(value)) {
+                    return identity;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobWorkBench.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobWorkBench.java
new file mode 100644
index 0000000..8d63640
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobWorkBench.java
@@ -0,0 +1,420 @@
+/*
+ * 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;
+
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNodeContextInfo;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNodeIdentifier;
+import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.runtime.YangModelRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.onosproject.yang.compiler.datamodel.YangSchemaNodeType.YANG_AUGMENT_NODE;
+import static org.onosproject.yang.compiler.datamodel.YangSchemaNodeType.YANG_CHOICE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.impl.YobConstants.ADD_AUGMENT_METHOD;
+import static org.onosproject.yang.runtime.impl.YobConstants.ADD_TO;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_GET_FIELD;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_GET_METHOD;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_INVOKE_METHOD;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_HAS_NO_CHILD;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_GET_FIELD;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_GET_METHOD;
+import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_INVOKE_METHOD;
+import static org.onosproject.yang.runtime.impl.YobUtils.getCapitalCase;
+import static org.onosproject.yang.runtime.impl.YobUtils.getInstanceOfClass;
+import static org.onosproject.yang.runtime.impl.YobUtils.getQualifiedDefaultClass;
+
+/**
+ * Represents the YANG object builder's work bench corresponding to a YANG data
+ * tree node.
+ */
+class YobWorkBench {
+
+    private static final Logger log =
+            LoggerFactory.getLogger(YobWorkBench.class);
+
+    /**
+     * Class loader to be used to load the class.
+     */
+    private ClassLoader classLoader;
+
+    /**
+     * Map of the non schema descendant objects.
+     */
+    private Map<YangSchemaNodeIdentifier, YobWorkBench> attributeMap =
+            new HashMap<>();
+
+    /**
+     * Built object.
+     */
+    private Object builtObject;
+
+    /**
+     * Setter method to be used in parent.
+     */
+    private String setterInParent;
+
+    /**
+     * YANG schema node.
+     */
+    private YangSchemaNode schemaNode;
+
+    /**
+     * Creates an instance of YANG object builder.
+     *
+     * @param classLoader    class loader
+     * @param builtObject    YANG object built
+     * @param setterInParent setter method in parent
+     * @param schemaNode     YANG schema node
+     */
+    YobWorkBench(ClassLoader classLoader,
+                 Object builtObject, String setterInParent,
+                 YangSchemaNode schemaNode) {
+        this.classLoader = classLoader;
+        this.setterInParent = setterInParent;
+        this.builtObject = builtObject;
+        this.schemaNode = schemaNode;
+    }
+
+    /**
+     * Returns the class loader.
+     *
+     * @return class loader
+     */
+    ClassLoader classLoader() {
+        return classLoader;
+    }
+
+    /**
+     * Sets the class loader.
+     *
+     * @param loader class loader
+     */
+    void classLoader(ClassLoader loader) {
+        classLoader = loader;
+    }
+
+    /**
+     * Returns the setter method name.
+     *
+     * @return setter method name
+     */
+    String setterInParent() {
+        return setterInParent;
+    }
+
+    /**
+     * Sets the setter method name.
+     *
+     * @param name setter method name
+     */
+    void setterInParent(String name) {
+        setterInParent = name;
+    }
+
+    /**
+     * Returns the YANG scheme node.
+     *
+     * @return YANG schema node
+     */
+    YangSchemaNode schemaNode() {
+        return schemaNode;
+    }
+
+    /**
+     * Sets the YANG schema node.
+     *
+     * @param node YANG schema node
+     */
+    void schemaNode(YangSchemaNode node) {
+        schemaNode = node;
+    }
+
+    /**
+     * Returns the attribute map.
+     *
+     * @return attribute map
+     */
+    Map<YangSchemaNodeIdentifier, YobWorkBench> attributeMap() {
+        return attributeMap;
+    }
+
+    /**
+     * Sets the attribute map.
+     *
+     * @param attributeMap map of the non schema descendant objects
+     */
+    void attributeMap(Map<YangSchemaNodeIdentifier, YobWorkBench>
+                              attributeMap) {
+        this.attributeMap = attributeMap;
+    }
+
+    /**
+     * Returns the built object.
+     *
+     * @return built object
+     */
+    Object getBuiltObject() {
+        return builtObject;
+    }
+
+    /**
+     * Sets the built object.
+     *
+     * @param obj built object
+     */
+    void setBuiltObject(Object obj) {
+        builtObject = obj;
+    }
+
+    /**
+     * Sets the model object of data node in parent object.
+     *
+     * @param curWb    YOB work bench for data node
+     * @param dataNode data node
+     * @param reg      YANG model registry
+     */
+    void setObject(YobWorkBench curWb, DataNode dataNode,
+                   DefaultYangModelRegistry reg) {
+        Object parentObj = getParentObject(reg, curWb.schemaNode());
+        setObjectInParent(parentObj, curWb.setterInParent(),
+                          curWb.getBuiltObject(), dataNode.type());
+    }
+
+    /**
+     * Sets the model object of data node in parent object.
+     *
+     * @param parentObj parent object
+     * @param setter    setter method name
+     * @param curObj    current object
+     * @param type      data node type
+     */
+    private static void setObjectInParent(Object parentObj, String setter,
+                                          Object curObj, DataNode.Type type) {
+        Class<?> parentClass = parentObj.getClass();
+        String parentClassName = parentClass.getName();
+        try {
+            Class<?> classType = null;
+            Field fieldName = parentClass.getDeclaredField(setter);
+            if (fieldName != null) {
+                classType = fieldName.getType();
+            }
+
+            Method method;
+            if (type == MULTI_INSTANCE_NODE) {
+                if (fieldName != null) {
+                    ParameterizedType genericTypes =
+                            (ParameterizedType) fieldName.getGenericType();
+                    classType = (Class<?>) genericTypes.getActualTypeArguments()[0];
+                }
+                method = parentClass
+                        .getDeclaredMethod(ADD_TO + getCapitalCase(setter), classType);
+            } else {
+                method = parentClass.getDeclaredMethod(setter, classType);
+            }
+
+            method.invoke(parentObj, curObj);
+        } catch (NoSuchFieldException e) {
+            log.error(L_FAIL_TO_GET_FIELD, parentClassName);
+            throw new ModelConvertorException(E_FAIL_TO_GET_FIELD + parentClassName);
+        } catch (NoSuchMethodException e) {
+            log.error(L_FAIL_TO_GET_METHOD, parentClassName);
+            throw new ModelConvertorException(E_FAIL_TO_GET_METHOD + parentClassName);
+        } catch (InvocationTargetException | IllegalAccessException e) {
+            log.error(L_FAIL_TO_INVOKE_METHOD, parentClassName);
+            throw new ModelConvertorException(E_FAIL_TO_INVOKE_METHOD + parentClassName);
+        }
+    }
+
+    /**
+     * Returns the parent builder object in which the child object can be set.
+     *
+     * @param reg        YANG model registry
+     * @param schemaNode descendant schema node for whom the builder is
+     *                   required
+     * @return parent builder object
+     */
+    Object getParentObject(DefaultYangModelRegistry reg,
+                           YangSchemaNode schemaNode) {
+
+        YangSchemaNodeIdentifier targetNode =
+                schemaNode.getYangSchemaNodeIdentifier();
+
+        YobWorkBench curWorkBench = this;
+        YangSchemaNode nonSchemaHolder;
+        do {
+
+            //Current Schema node context
+            YangSchemaNodeContextInfo schemaContext;
+            YangSchemaNode parentSchema = null;
+            try {
+                //Find the new schema context node.
+                parentSchema = curWorkBench.schemaNode();
+                schemaContext = parentSchema.getChildSchema(targetNode);
+
+            } catch (DataModelException e) {
+                throw new ModelConvertorException(parentSchema.getName() +
+                                                          E_HAS_NO_CHILD +
+                                                          targetNode.getName());
+            }
+
+            nonSchemaHolder = schemaContext.getContextSwitchedNode();
+
+            //If the descendant schema node is in switched context
+            if (nonSchemaHolder != null) {
+
+                YangSchemaNodeIdentifier nonSchemaIdentifier =
+                        nonSchemaHolder.getYangSchemaNodeIdentifier();
+
+                //check if the descendant builder container is already available
+                YobWorkBench childWorkBench =
+                        curWorkBench.attributeMap.get(nonSchemaIdentifier);
+
+                if (childWorkBench == null) {
+                    YobWorkBench newWorkBench = getNewChildWorkBench(
+                            schemaContext, targetNode, curWorkBench, reg);
+
+                    curWorkBench.attributeMap.put(nonSchemaIdentifier,
+                                                  newWorkBench);
+                    curWorkBench = newWorkBench;
+                } else {
+                    curWorkBench = childWorkBench;
+                }
+            }
+
+        } while (nonSchemaHolder != null);
+        return curWorkBench.getBuiltObject();
+    }
+
+    /**
+     * Creates a new builder container object corresponding to a context
+     * switch schema node.
+     *
+     * @param childContext schema context of immediate child
+     * @param targetNode   final node whose parent builder is
+     *                     required
+     * @param curWorkBench current context builder container
+     * @param registry     model registry
+     * @return new builder container object corresponding to a context
+     * switch schema node
+     */
+    static YobWorkBench getNewChildWorkBench(
+            YangSchemaNodeContextInfo childContext,
+            YangSchemaNodeIdentifier targetNode, YobWorkBench curWorkBench,
+            DefaultYangModelRegistry registry) {
+
+        YangSchemaNode ctxSwitchedNode = childContext.getContextSwitchedNode();
+        String name;
+
+         /* This is the first child trying to set its object in the
+         current context. */
+        String setterInParent = ctxSwitchedNode.getJavaAttributeName();
+
+        /* If current switched context is choice, then case class needs to be
+         used. */
+        if (ctxSwitchedNode.getYangSchemaNodeType() == YANG_CHOICE_NODE) {
+            try {
+                childContext = ctxSwitchedNode.getChildSchema(targetNode);
+                ctxSwitchedNode = childContext.getContextSwitchedNode();
+                name = getQualifiedDefaultClass(
+                        childContext.getContextSwitchedNode());
+
+            } catch (DataModelException e) {
+                throw new ModelConvertorException(ctxSwitchedNode.getName() +
+                                                          E_HAS_NO_CHILD +
+                                                          targetNode.getName());
+            }
+        } else if (ctxSwitchedNode.getYangSchemaNodeType() ==
+                YANG_AUGMENT_NODE) {
+            name = getQualifiedDefaultClass(ctxSwitchedNode);
+            setterInParent = YobUtils.getQualifiedinterface(ctxSwitchedNode);
+        } else {
+            name = getQualifiedDefaultClass(childContext.getSchemaNode());
+        }
+
+        ClassLoader newClassesLoader = YobUtils.getTargetClassLoader(
+                curWorkBench.classLoader, childContext, registry);
+
+        Object obj = getInstanceOfClass(newClassesLoader, name);
+        return new YobWorkBench(newClassesLoader, obj, setterInParent,
+                                ctxSwitchedNode);
+    }
+
+    static void addInAugmentation(Object builder,
+                                  Object instance) {
+        Class<?> builderClass = builder.getClass();
+        Class<?> baseClass = builderClass.getSuperclass();
+        try {
+            Method method = baseClass.getDeclaredMethod(ADD_AUGMENT_METHOD,
+                                                        InnerModelObject.class);
+            method.invoke(builder, instance);
+        } catch (NoSuchMethodException e) {
+            log.error(L_FAIL_TO_GET_METHOD, ADD_AUGMENT_METHOD);
+            throw new ModelConvertorException(E_FAIL_TO_GET_METHOD + ADD_AUGMENT_METHOD);
+        } catch (InvocationTargetException | IllegalAccessException e) {
+            log.error(L_FAIL_TO_INVOKE_METHOD, ADD_AUGMENT_METHOD);
+            throw new ModelConvertorException(E_FAIL_TO_INVOKE_METHOD + ADD_AUGMENT_METHOD);
+        }
+    }
+
+    /**
+     * Builds the non schema objects and maintain it in the contained schema
+     * node.
+     *
+     * @param reg YANG model registry
+     */
+    void buildNonSchemaAttributes(YangModelRegistry reg) {
+
+        for (Map.Entry<YangSchemaNodeIdentifier, YobWorkBench> entry :
+                attributeMap.entrySet()) {
+            YobWorkBench childWorkBench = entry.getValue();
+            YangSchemaNode childSchema = childWorkBench.schemaNode();
+            childWorkBench.buildObject(reg);
+
+            if (childSchema.getYangSchemaNodeType() == YANG_AUGMENT_NODE) {
+                addInAugmentation(builtObject,
+                                  childWorkBench.getBuiltObject());
+                continue;
+            }
+
+            setObjectInParent(builtObject, childWorkBench.setterInParent,
+                              childWorkBench.getBuiltObject(), SINGLE_INSTANCE_NODE);
+        }
+    }
+
+    /**
+     * Set the operation type attribute and build the object from the builder
+     * object, by invoking the build method.
+     *
+     * @param reg YANG model registry
+     */
+    void buildObject(YangModelRegistry reg) {
+        buildNonSchemaAttributes(reg);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobAugmentTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobAugmentTest.java
new file mode 100644
index 0000000..3572f0c
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobAugmentTest.java
@@ -0,0 +1,225 @@
+/*
+ * 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;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.rev20151208.yrtietfnetwork.DefaultNetworks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.rev20151208.yrtietfnetwork.networks.DefaultNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.rev20151208.yrtietfnetwork.networks.Network;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.topology.rev20151208.yrtnetworktopology.networks.network.DefaultAugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.topology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.topology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.networks.network.link.DefaultAugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.telinkaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.telinkconfig.bundlestacklevel.Bundle;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.telinkconfig.bundlestacklevel.bundle.bundledlinks.BundledLink;
+import org.onosproject.yang.gen.v1.urn.ip.topo.rev20140101.ymsiptopology.node.DefaultAugmentedTopoNode;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.DefaultNode;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.runtime.DefaultResourceData;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+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.initializeDataNode;
+
+/**
+ * Tests the YANG object building for the YANG data nodes based on the non
+ * schema augmented nodes.
+ */
+public class YobAugmentTest {
+    private static final String TOPO_NAME_SPACE = "urn:topo";
+    private static final String IP_TOPO_NAME_SPACE = "urn:ip:topo";
+    private static final String NW_NAME_SPACE = "urn:ietf:params:xml:ns:yang:yrt-ietf-network";
+    private static final String NW_TOPO_NAME_SPACE = "urn:ietf:params:xml:ns:yang:yrt-ietf-network-topology";
+    private static final String TE_TOPO_NAME_SPACE =
+            "urn:ietf:params:xml:ns:yang:yrt-ietf-te-topology";
+    TestYangSerializerContext context = new TestYangSerializerContext();
+    DataNode.Builder dBlr;
+    String value;
+
+    public DataNode buildDataNodeForAugmentedLeaves() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "node", TOPO_NAME_SPACE, value, null);
+
+        value = "id";
+        dBlr = addDataNode(dBlr, "node-id", TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str1";
+        dBlr = addDataNode(dBlr, "router-id", IP_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str2";
+        dBlr = addDataNode(dBlr, "router-ip", IP_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+    public DataNode buildDnForAugmentedList() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "networks", NW_NAME_SPACE, value, null);
+        dBlr = addDataNode(dBlr, "network", NW_NAME_SPACE, value, null);
+        value = "network-id";
+        dBlr = addDataNode(dBlr, "network-id", NW_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "link", NW_TOPO_NAME_SPACE, value, null);
+        value = "link-id";
+        dBlr = addDataNode(dBlr, "link-id", NW_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "source", NW_TOPO_NAME_SPACE, value, null);
+        value = "source-node";
+        dBlr = addDataNode(dBlr, "source-node", NW_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr); // exit source
+        dBlr = exitDataNode(dBlr); // exit link
+        dBlr = exitDataNode(dBlr); // exit network
+        dBlr = exitDataNode(dBlr); // exit networks
+        return dBlr.build();
+    }
+
+    public DataNode buildDnForAugmentedListWithResourceId() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "node", TOPO_NAME_SPACE, value, null);
+
+        value = "id";
+        dBlr = addDataNode(dBlr, "node-id", TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str1";
+        dBlr = addDataNode(dBlr, "router-id", IP_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str2";
+        dBlr = addDataNode(dBlr, "router-ip", IP_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+    public DataNode buildDnForChoiceCase() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "networks", NW_NAME_SPACE, value, null);
+        dBlr = addDataNode(dBlr, "network", NW_NAME_SPACE, value, null);
+        value = "network-id";
+        dBlr = addDataNode(dBlr, "network-id", NW_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "link", NW_TOPO_NAME_SPACE, value, null);
+        value = "link-id";
+        dBlr = addDataNode(dBlr, "link-id", NW_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "te", TE_TOPO_NAME_SPACE, value, null);
+        dBlr = addDataNode(dBlr, "config", TE_TOPO_NAME_SPACE, value, null);
+        dBlr = addDataNode(dBlr, "bundled-links", TE_TOPO_NAME_SPACE, value, null);
+        dBlr = addDataNode(dBlr, "bundled-link", TE_TOPO_NAME_SPACE, value, null);
+        value = "100";
+        dBlr = addDataNode(dBlr, "sequence", TE_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr); // exit sequence
+        value = "101";
+        dBlr = addDataNode(dBlr, "src-tp-ref", TE_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr); // exit src-tp-ref
+        dBlr = exitDataNode(dBlr); // exit list bundled-link
+        dBlr = exitDataNode(dBlr); // exit bundled-links
+        value = "abc";
+        dBlr = addDataNode(dBlr, "te-link-template", TE_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr); // te-link-template
+        dBlr = exitDataNode(dBlr); // config
+        dBlr = exitDataNode(dBlr); // te
+        dBlr = exitDataNode(dBlr); // exit link
+        dBlr = exitDataNode(dBlr); // exit network
+        dBlr = exitDataNode(dBlr); // exit networks
+        return dBlr.build();
+    }
+
+    @Test
+    public void augmentedLeaf() {
+        DataNode dataNode = buildDataNodeForAugmentedLeaves();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode)
+                .build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultNode node = ((DefaultNode) modelObject);
+        assertThat(node.nodeId(), is("id"));
+        DefaultAugmentedTopoNode obj = node
+                .augmentation(DefaultAugmentedTopoNode.class);
+        assertThat(obj.routerId(), is("str1"));
+        assertThat(obj.routerIp(), is("str2"));
+    }
+
+    @Test
+    public void augmentedList() {
+        DataNode dataNode = buildDnForAugmentedList();
+        ResourceData data = DefaultResourceData.builder()
+                .addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultNetworks networks = ((DefaultNetworks) modelObject);
+        Network network = networks.network().get(0);
+        assertThat(network.networkId().toString(), is("network-id"));
+        DefaultAugmentedNdNetwork augNw = ((DefaultNetwork) network)
+                .augmentation(DefaultAugmentedNdNetwork.class);
+        Link link = augNw.link().get(0);
+        assertThat(link.linkId().toString(), is("link-id"));
+        assertThat(link.source().sourceNode().toString(), is("source-node"));
+    }
+
+    @Test
+    public void augmentedChoiceCase() {
+        DataNode dataNode = buildDnForChoiceCase();
+        ResourceData data = DefaultResourceData.builder()
+                .addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultNetworks networks = ((DefaultNetworks) modelObject);
+        Network network = networks.network().get(0);
+        assertThat(network.networkId().toString(), is("network-id"));
+        DefaultAugmentedNdNetwork augNw = ((DefaultNetwork) network)
+                .augmentation(DefaultAugmentedNdNetwork.class);
+        Link link = augNw.link().get(0);
+        assertThat(link.linkId().toString(), is("link-id"));
+        DefaultAugmentedNtLink augLink = ((DefaultLink) link)
+                .augmentation(DefaultAugmentedNtLink.class);
+        Config config = augLink.te().config();
+        assertThat(config.teLinkTemplate().get(0), is("abc"));
+        BundledLink bundledLink = ((Bundle) config.bundleStackLevel())
+                .bundledLinks().bundledLink().get(0);
+        assertThat(bundledLink.srcTpRef(), is("101"));
+        assertThat(bundledLink.sequence(), is(100L));
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobBasicYangConstructTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobBasicYangConstructTest.java
new file mode 100644
index 0000000..be21b0c
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobBasicYangConstructTest.java
@@ -0,0 +1,260 @@
+/*
+ * 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;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.DefaultL1;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.DefaultTop;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.l1.C1;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.top.DefaultYangAutoPrefixInterface;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.top.YangAutoPrefixInterface;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.top.yangautoprefixinterface.Address;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.LeafModelObject;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.DefaultResourceData;
+
+import java.io.IOException;
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onosproject.yang.gen.v1.samplenamespace.Sample.LeafIdentifier.LEAF5;
+import static org.onosproject.yang.gen.v1.samplenamespace.Sample.LeafIdentifier.LEAF6;
+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.exitDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
+
+/**
+ * Tests the YANG object building for the YANG data nodes.
+ */
+public class YobBasicYangConstructTest {
+    private static final String NAME_SPACE = "samplenamespace";
+    TestYangSerializerContext context = new TestYangSerializerContext();
+    private DataNode.Builder dBlr;
+    private String value;
+    private ResourceId.Builder rIdBlr;
+
+    private DataNode buildDataNode() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "top", NAME_SPACE, value, null);
+        value = "100";
+        dBlr = addDataNode(dBlr, "mtu", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "1123";
+        dBlr = addDataNode(dBlr, "color", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "interface", null, value, null);
+        value = "name";
+        dBlr = addDataNode(dBlr, "name", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "address", null, value, null);
+        value = "name";
+        dBlr = addDataNode(dBlr, "name", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr); // exit address
+        dBlr = exitDataNode(dBlr); // exit interface
+        dBlr = exitDataNode(dBlr); // exit top
+
+        value = null;
+        dBlr = addDataNode(dBlr, "l1", NAME_SPACE, value, null);
+        dBlr = addDataNode(dBlr, "c1", NAME_SPACE, value, null);
+        value = "leaf1_value";
+        dBlr = addDataNode(dBlr, "leaf1", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "leaf2_value";
+        dBlr = addDataNode(dBlr, "leaf2", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr); // exit container c1
+        value = "leaf3_value";
+        dBlr = addDataNode(dBlr, "leaf3", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "leaf4_value";
+        dBlr = addDataNode(dBlr, "leaf4", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr); // exit list l1
+        return dBlr.build();
+    }
+
+    private DataNode buildDnForModuleLevelLeaf() {
+        dBlr = initializeDataNode(context);
+        value = "abc";
+        dBlr = addDataNode(dBlr, "leaf5", NAME_SPACE, value, null);
+        return dBlr.build();
+    }
+
+    private DataNode buildDnForModuleLevelLeafList() {
+        dBlr = initializeDataNode(context);
+        value = "def";
+        dBlr = addDataNode(dBlr, "leaf6", NAME_SPACE, value, null);
+        return dBlr.build();
+    }
+
+    private DataNode buildDataNodeWithResourceIdForL1() {
+        ResourceId.Builder builder = buildResourceId();
+        dBlr = initializeDataNode(builder);
+        dBlr = addDataNode(dBlr, "c1", NAME_SPACE, value, null);
+        value = "leaf1_value";
+        dBlr = addDataNode(dBlr, "leaf1", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "leaf2_value";
+        dBlr = addDataNode(dBlr, "leaf2", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+    private ResourceId.Builder buildResourceIdForContainerTop() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "top", NAME_SPACE, value);
+        return rIdBlr;
+    }
+
+    private DataNode buildDataNodeWithResourceIdForLeafL3() {
+        ResourceId.Builder builder = buildResourceId();
+        dBlr = initializeDataNode(builder);
+        value = "leaf3_value";
+        dBlr = addDataNode(dBlr, "leaf3", NAME_SPACE, value, null);
+        return dBlr.build();
+    }
+
+    private ResourceId.Builder buildResourceId() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "l1", NAME_SPACE, value);
+        return rIdBlr;
+    }
+
+    @Test
+    public void testBasicYangConstruct() throws IOException {
+        DataNode dataNode = buildDataNode();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultTop top = ((DefaultTop) modelObject);
+        assertThat(top.mtu(), is("100"));
+        assertThat(top.color().get(0), is("1123"));
+
+        List<YangAutoPrefixInterface> intfList = top.yangAutoPrefixInterface();
+        YangAutoPrefixInterface intf = intfList.get(0);
+        assertThat(intf.name(), is("name"));
+
+        Address address = intf.address();
+        assertThat(address.name(), is("name"));
+
+        modelObject = modelObjectList.get(1);
+        DefaultL1 l1 = ((DefaultL1) modelObject);
+        C1 c1 = l1.c1();
+        assertThat(c1.leaf1(), is("leaf1_value"));
+        assertThat(c1.leaf2().get(0), is("leaf2_value"));
+        assertThat(l1.leaf3(), is("leaf3_value"));
+        assertThat(l1.leaf4().get(0), is("leaf4_value"));
+    }
+
+    @Test
+    public void testModuleLevelLeaf() throws IOException {
+        DataNode dataNode = buildDnForModuleLevelLeaf();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode)
+                .build();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        LeafModelObject obj = ((LeafModelObject) modelObject);
+        assertThat(obj.leafIdentifier(), is(LEAF5));
+        assertThat(obj.values().get(0), is("abc"));
+    }
+
+    @Test
+    public void testModuleLevelLeafList() throws IOException {
+        DataNode dataNode = buildDnForModuleLevelLeafList();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode)
+                .build();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        LeafModelObject obj = ((LeafModelObject) modelObject);
+        assertThat(obj.leafIdentifier(), is(LEAF6));
+        assertThat(obj.values().get(0), is("def"));
+    }
+
+    @Test
+    public void testWithResourceId() {
+        DataNode dataNode = buildDataNodeWithResourceIdForL1();
+        ResourceId.Builder rIdbuilder = buildResourceId();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode)
+                .addDataNode(buildDataNodeWithResourceIdForLeafL3())
+                .resourceId(rIdbuilder.build()).build();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        C1 c1 = ((C1) modelObject);
+        assertThat(c1.leaf1(), is("leaf1_value"));
+        assertThat(c1.leaf2().get(0), is("leaf2_value"));
+    }
+
+    @Test
+    public void testWithRIdForContainerTop() {
+        ResourceId.Builder builder = buildResourceIdForContainerTop();
+        dBlr = initializeDataNode(builder);
+        value = "mtu";
+        dBlr = addDataNode(dBlr, "mtu", NAME_SPACE, value, null);
+        ResourceData.Builder dataBdlr = DefaultResourceData.builder()
+                .addDataNode(dBlr.build());
+        dBlr = initializeDataNode(builder);
+        value = "color";
+        dBlr = addDataNode(dBlr, "color", NAME_SPACE, value, null);
+        dataBdlr = dataBdlr.addDataNode(dBlr.build());
+        dBlr = initializeDataNode(builder);
+        value = null;
+        dBlr = addDataNode(dBlr, "interface", NAME_SPACE, value, null);
+        value = "name";
+        dBlr = addDataNode(dBlr, "name", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        dataBdlr = dataBdlr.addDataNode(dBlr.build()).resourceId(builder.build());
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = yobBuilder.getYangObject(dataBdlr.build());
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        LeafModelObject mtu = ((LeafModelObject) modelObject);
+        assertThat(mtu.values().get(0), is("mtu"));
+        LeafModelObject color = ((LeafModelObject) modelObjectList.get(1));
+        assertThat(color.values().get(0), is("color"));
+        DefaultYangAutoPrefixInterface intf = ((DefaultYangAutoPrefixInterface)
+                modelObjectList.get(2));
+        assertThat(intf.name(), is("name"));
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobChoiceTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobChoiceTest.java
new file mode 100644
index 0000000..a063b8a
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobChoiceTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.telinkconfig.bundlestacklevel.bundle.DefaultBundledLinks;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.DefaultNode;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.node.choice1.Case1a;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.node.choice1.Case1b;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.node.choice1.case1b.choice1b.Case1Bi;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.DefaultResourceData;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+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.exitDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
+
+/**
+ * Tests the YANG object building for the YANG data nodes.
+ */
+public class YobChoiceTest {
+
+    private static final String NAME_SPACE = "urn:topo";
+    private static final String NW_NS = "urn:ietf:params:xml:ns:yang:yrt-ietf-network";
+    private static final String TE_NS = "urn:ietf:params:xml:ns:yang:yrt-ietf-te-topology";
+    private static final String NW_TOPO_NS =
+            "urn:ietf:params:xml:ns:yang:yrt-ietf-network-topology";
+    TestYangSerializerContext context = new TestYangSerializerContext();
+    private DataNode.Builder dBlr;
+    private String value;
+    private ResourceId.Builder rIdBlr;
+
+    public DataNode buildDataNodeForCaseInChoice() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "node", NAME_SPACE, value, null);
+
+        value = "id";
+        dBlr = addDataNode(dBlr, "node-id", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str1";
+        dBlr = addDataNode(dBlr, "leaf1a1", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str2";
+        dBlr = addDataNode(dBlr, "leaf1a2", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+    public DataNode buildDataNodeForRecursiveChoice() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "node", NAME_SPACE, value, null);
+
+        value = "id";
+        dBlr = addDataNode(dBlr, "node-id", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str1";
+        dBlr = addDataNode(dBlr, "leaf1bia", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "str2";
+        dBlr = addDataNode(dBlr, "leaf1bib", NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+    private ResourceId.Builder buildRIdForNodeInsideChoiceCase() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "networks", NW_NS, value);
+        rIdBlr = addToResourceId(rIdBlr, "network", NW_NS, value);
+        value = "network-id";
+        rIdBlr = addToResourceId(rIdBlr, "network-id", NW_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "link", NW_TOPO_NS, value);
+        value = "link-id";
+        rIdBlr = addToResourceId(rIdBlr, "link-id", NW_TOPO_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "te", TE_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "config", TE_NS, value);
+        return rIdBlr;
+    }
+
+    public DataNode buildDnForChoiceCaseWithRid() {
+        ResourceId.Builder rIdBdlr = buildRIdForNodeInsideChoiceCase();
+        dBlr = initializeDataNode(rIdBdlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "bundled-links", TE_NS, value, null);
+        return dBlr.build();
+    }
+
+    @Test
+    public void caseInChoice() {
+        DataNode dataNode = buildDataNodeForCaseInChoice();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode)
+                .build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultNode node = ((DefaultNode) modelObject);
+        assertThat(node.nodeId(), is("id"));
+        assertThat(((Case1a) node.choice1()).leaf1A1(), is("str1"));
+        assertThat(((Case1a) node.choice1()).leaf1A2(), is("str2"));
+    }
+
+    @Test
+    public void recursiveChoice() {
+        DataNode dataNode = buildDataNodeForRecursiveChoice();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode)
+                .build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultNode node = ((DefaultNode) modelObject);
+        assertThat(node.nodeId(), is("id"));
+        assertThat(((Case1Bi) ((Case1b) node.choice1()).choice1b()).leaf1Bia(),
+                   is("str1"));
+        assertThat(((Case1Bi) ((Case1b) node.choice1()).choice1b()).leaf1Bib(),
+                   is("str2"));
+    }
+
+    @Test
+    public void testChoiceCaseWithResourceId() {
+        ResourceId.Builder rIdBdlr = buildRIdForNodeInsideChoiceCase();
+        DataNode dataNode = buildDnForChoiceCaseWithRid();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode)
+                .resourceId(rIdBdlr.build()).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        assertThat(modelObject instanceof DefaultBundledLinks, is(true));
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobGroupingUsesTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobGroupingUsesTest.java
new file mode 100644
index 0000000..13dec1a
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobGroupingUsesTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.rev20151208.yrtietfnetwork.DefaultNetworks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.schedule.rev20160301.yrtietfschedule.schedules.schedules.Schedule;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.networks.DefaultAugmentedNwNetworks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.tetopologiesaugment.te.templates.LinkTemplate;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.runtime.DefaultResourceData;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+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.initializeDataNode;
+
+/**
+ * Tests the YANG object building for the YANG data tree based on the non
+ * schema augmented nodes.
+ */
+public class YobGroupingUsesTest {
+    TestYangSerializerContext context = new TestYangSerializerContext();
+    private static final String NW_NS = "urn:ietf:params:xml:ns:yang:yrt-ietf-network";
+    private static final String TE_NS = "urn:ietf:params:xml:ns:yang:yrt-ietf-te-topology";
+    private DataNode.Builder dBlr;
+    private String value;
+
+
+    public DataNode buildDataNodeForInterFileGrouping() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "networks", NW_NS, value, null);
+        dBlr = addDataNode(dBlr, "te", TE_NS, value, null);
+        dBlr = addDataNode(dBlr, "templates", TE_NS, value, null);
+        dBlr = addDataNode(dBlr, "link-template", TE_NS, value, null);
+        value = "name";
+        dBlr = addDataNode(dBlr, "name", TE_NS, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "te-link-attributes", TE_NS, value, null);
+        dBlr = addDataNode(dBlr, "schedules", TE_NS, value, null);
+        dBlr = addDataNode(dBlr, "schedule", TE_NS, value, null);
+        value = "100";
+        dBlr = addDataNode(dBlr, "schedule-id", TE_NS, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "start";
+        dBlr = addDataNode(dBlr, "start", TE_NS, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "schedule-duration";
+        dBlr = addDataNode(dBlr, "schedule-duration", TE_NS, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "repeat-interval";
+        dBlr = addDataNode(dBlr, "repeat-interval", TE_NS, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr); // schedule
+        dBlr = exitDataNode(dBlr); // schedules
+        dBlr = exitDataNode(dBlr); // te-link-attributes
+        dBlr = exitDataNode(dBlr); // link-template
+        dBlr = exitDataNode(dBlr); // templates
+        dBlr = exitDataNode(dBlr); // te
+        dBlr = exitDataNode(dBlr); // networks
+        return dBlr.build();
+    }
+
+    @Test
+    public void testInterFileGrouping() {
+        DataNode dataNode = buildDataNodeForInterFileGrouping();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultNetworks networks = ((DefaultNetworks) modelObject);
+        DefaultAugmentedNwNetworks augNws = networks
+                .augmentation(DefaultAugmentedNwNetworks.class);
+        LinkTemplate linkTmp = augNws.te().templates().linkTemplate().get(0);
+        assertThat(linkTmp.name().toString(), is("name"));
+        Schedule sh = linkTmp.teLinkAttributes().schedules().schedule().get(0);
+        assertThat(sh.scheduleId(), is(100L));
+        assertThat(sh.start().toString(), is("start"));
+        assertThat(sh.scheduleDuration(), is("schedule-duration"));
+        assertThat(sh.repeatInterval(), is("repeat-interval"));
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobRIdToMoIdConverterTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobRIdToMoIdConverterTest.java
new file mode 100644
index 0000000..aa3938f
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobRIdToMoIdConverterTest.java
@@ -0,0 +1,287 @@
+/*
+ * 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;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.samplenamespace.Sample;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.DefaultL2;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.DefaultTop;
+import org.onosproject.yang.gen.v1.samplenamespace.sample.L2Keys;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.rev20151208.yrtietfnetwork.DefaultNetworks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.rev20151208.yrtietfnetwork.networks.DefaultNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.topology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.network.topology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.link.DefaultSource;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.telinkconfig.bundlestacklevel.bundle.DefaultBundledLinks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.tetopologyaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.yrt.ietf.te.topology.rev20160317.yrtietftetopology.tetopologyaugment.te.DefaultConfig;
+import org.onosproject.yang.model.AtomicPath;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.MultiInstanceLeaf;
+import org.onosproject.yang.model.MultiInstanceNode;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SingleInstanceLeaf;
+import org.onosproject.yang.model.SingleInstanceNode;
+import org.onosproject.yang.runtime.DefaultResourceData;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.addToResourceId;
+import static org.onosproject.yang.runtime.helperutils.SerializerHelper.initializeResourceId;
+
+/**
+ * Tests resource id to model object id convertion.
+ */
+public class YobRIdToMoIdConverterTest {
+    private static final String NAME_SPACE = "samplenamespace";
+    TestYangSerializerContext context = new TestYangSerializerContext();
+    private static final String NW_NS = "urn:ietf:params:xml:ns:yang:yrt-ietf-network";
+    private static final String TE_TOPO_NS =
+            "urn:ietf:params:xml:ns:yang:yrt-ietf-te-topology";
+    private static final String NW_TOPO_NS = "urn:ietf:params:xml:ns:yang:yrt-ietf-network-topology";
+    private String value;
+    private ResourceId.Builder rIdBlr;
+
+    private ResourceId.Builder buildRIdForTopLevelContainer() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "top", NAME_SPACE, value);
+        return rIdBlr;
+    }
+
+    private ResourceId.Builder buildRIdForTopLevelLeaf() {
+        rIdBlr = initializeResourceId(context);
+        value = "null";
+        rIdBlr = addToResourceId(rIdBlr, "leaf5", NAME_SPACE, value);
+        return rIdBlr;
+    }
+
+    private ResourceId.Builder buildRIdForTopLevelLeafList() {
+        rIdBlr = initializeResourceId(context);
+        value = "abc";
+        rIdBlr = addToResourceId(rIdBlr, "leaf6", NAME_SPACE, value);
+        return rIdBlr;
+    }
+
+    private ResourceId.Builder buildRIdForTopLevelList() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "l2", NAME_SPACE, value);
+        value = "abc";
+        rIdBlr = addToResourceId(rIdBlr, "k1", NAME_SPACE, value);
+        return rIdBlr;
+    }
+
+    private ResourceId.Builder buildRIdForGroupingUses() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "networks", NW_NS, value);
+        rIdBlr = addToResourceId(rIdBlr, "network", NW_NS, value);
+        value = "network-id";
+        rIdBlr = addToResourceId(rIdBlr, "network-id", NW_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "te", TE_TOPO_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "config", TE_TOPO_NS, value);
+        return rIdBlr;
+    }
+
+    private ResourceId.Builder buildRIdForNodeInsideChoiceCase() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "networks", NW_NS, value);
+        rIdBlr = addToResourceId(rIdBlr, "network", NW_NS, value);
+        value = "network-id";
+        rIdBlr = addToResourceId(rIdBlr, "network-id", NW_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "link", NW_TOPO_NS, value);
+        value = "link-id";
+        rIdBlr = addToResourceId(rIdBlr, "link-id", NW_TOPO_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "te", TE_TOPO_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "config", TE_TOPO_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "bundled-links", TE_TOPO_NS, value);
+        return rIdBlr;
+    }
+
+    private ResourceId.Builder buildRIdForTopListInsideList() {
+        rIdBlr = initializeResourceId(context);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "networks", NW_NS, value);
+        rIdBlr = addToResourceId(rIdBlr, "network", NW_NS, value);
+        value = "network-id";
+        rIdBlr = addToResourceId(rIdBlr, "network-id", NW_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "link", NW_TOPO_NS, value);
+        value = "link-id";
+        rIdBlr = addToResourceId(rIdBlr, "link-id", NW_TOPO_NS, value);
+        value = null;
+        rIdBlr = addToResourceId(rIdBlr, "source", NW_TOPO_NS, value);
+        return rIdBlr;
+    }
+
+    @Test
+    public void testTopLevelContainer() {
+        ResourceId id = buildRIdForTopLevelContainer().build();
+        ResourceData data = DefaultResourceData.builder()
+                .resourceId(id).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        ModelObjectId mId = modelObjectData.identifier();
+        List<AtomicPath> atomicPaths = mId.atomicPaths();
+        SingleInstanceNode l1 = (SingleInstanceNode) atomicPaths.get(0);
+        assertThat(l1.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(l1.container(), (DefaultTop.class));
+    }
+
+    @Test
+    public void testTopLevelLeaf() {
+        ResourceId id = buildRIdForTopLevelLeaf().build();
+        ResourceData data = DefaultResourceData.builder()
+                .resourceId(id).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        ModelObjectId mId = modelObjectData.identifier();
+        List<AtomicPath> atomicPaths = mId.atomicPaths();
+        SingleInstanceLeaf leaf5 = (SingleInstanceLeaf) atomicPaths.get(0);
+        assertThat(leaf5.type(), is(DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE));
+        assertEquals(leaf5.leafIdentifier(), Sample.LeafIdentifier.LEAF5);
+    }
+
+    @Test
+    public void testTopLevelLeafList() {
+        ResourceId id = buildRIdForTopLevelLeafList().build();
+        ResourceData data = DefaultResourceData.builder()
+                .resourceId(id).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        ModelObjectId mId = modelObjectData.identifier();
+        List<AtomicPath> atomicPaths = mId.atomicPaths();
+        MultiInstanceLeaf leaf6 = (MultiInstanceLeaf) atomicPaths.get(0);
+        assertThat(leaf6.type(), is(DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE));
+        assertEquals(leaf6.leafIdentifier(), Sample.LeafIdentifier.LEAF6);
+    }
+
+    @Test
+    public void testTopLevelList() {
+        ResourceId id = buildRIdForTopLevelList().build();
+        ResourceData data = DefaultResourceData.builder()
+                .resourceId(id).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        ModelObjectId mId = modelObjectData.identifier();
+        List<AtomicPath> atomicPaths = mId.atomicPaths();
+        MultiInstanceNode l2 = (MultiInstanceNode) atomicPaths.get(0);
+        assertThat(l2.type(), is(DataNode.Type.MULTI_INSTANCE_NODE));
+        assertEquals(l2.listClass(), DefaultL2.class);
+        assertThat(((L2Keys) l2.key()).k1(), is("abc"));
+    }
+
+    @Test
+    public void testMoIdForListInsideList() {
+        ResourceId id = buildRIdForTopListInsideList().build();
+        ResourceData data = DefaultResourceData.builder()
+                .resourceId(id).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        ModelObjectId mId = modelObjectData.identifier();
+        List<AtomicPath> atomicPaths = mId.atomicPaths();
+        SingleInstanceNode network = (SingleInstanceNode) atomicPaths.get(0);
+        assertThat(network.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(network.container(), DefaultNetworks.class);
+        MultiInstanceNode networks = (MultiInstanceNode) atomicPaths.get(1);
+        assertThat(networks.type(), is(DataNode.Type.MULTI_INSTANCE_NODE));
+        assertEquals(networks.listClass(), DefaultNetwork.class);
+        MultiInstanceNode lId = (MultiInstanceNode) atomicPaths.get(2);
+        assertThat(lId.type(), is(DataNode.Type.MULTI_INSTANCE_NODE));
+        assertEquals(lId.listClass(), DefaultLink.class);
+        SingleInstanceNode src = (SingleInstanceNode) atomicPaths.get(3);
+        assertThat(src.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(src.container(), DefaultSource.class);
+    }
+
+    @Test
+    public void testMoIdForGroupingUses() {
+        ResourceId id = buildRIdForGroupingUses().build();
+        ResourceData data = DefaultResourceData.builder()
+                .resourceId(id).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        ModelObjectId mId = modelObjectData.identifier();
+        List<AtomicPath> atomicPaths = mId.atomicPaths();
+        SingleInstanceNode network = (SingleInstanceNode) atomicPaths.get(0);
+        assertThat(network.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(network.container(), DefaultNetworks.class);
+        MultiInstanceNode networks = (MultiInstanceNode) atomicPaths.get(1);
+        assertThat(networks.type(), is(DataNode.Type.MULTI_INSTANCE_NODE));
+        assertEquals(networks.listClass(), DefaultNetwork.class);
+        SingleInstanceNode te = (SingleInstanceNode) atomicPaths.get(2);
+        assertThat(te.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(te.container(), DefaultTe.class);
+        SingleInstanceNode config = (SingleInstanceNode) atomicPaths.get(3);
+        assertThat(config.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(config.container(), DefaultConfig.class);
+    }
+
+    @Test
+    public void testMoIdForNodeInsideChoiceCase() {
+        ResourceId id = buildRIdForNodeInsideChoiceCase().build();
+        ResourceData data = DefaultResourceData.builder()
+                .resourceId(id).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        ModelObjectId mId = modelObjectData.identifier();
+        List<AtomicPath> atomicPaths = mId.atomicPaths();
+        SingleInstanceNode network = (SingleInstanceNode) atomicPaths.get(0);
+        assertThat(network.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(network.container(), DefaultNetworks.class);
+        MultiInstanceNode networks = (MultiInstanceNode) atomicPaths.get(1);
+        assertThat(networks.type(), is(DataNode.Type.MULTI_INSTANCE_NODE));
+        assertEquals(networks.listClass(), DefaultNetwork.class);
+        MultiInstanceNode link = (MultiInstanceNode) atomicPaths.get(2);
+        assertThat(link.type(), is(DataNode.Type.MULTI_INSTANCE_NODE));
+        assertEquals(link.listClass(), DefaultLink.class);
+        SingleInstanceNode te = (SingleInstanceNode) atomicPaths.get(3);
+        assertThat(te.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(te.container(), org.onosproject.yang.gen.v1.urn.ietf
+                .params.xml.ns.yang.yrt.ietf.te.topology.rev20160317
+                .yrtietftetopology.telinkaugment.DefaultTe.class);
+        SingleInstanceNode config = (SingleInstanceNode) atomicPaths.get(4);
+        assertThat(config.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(config.container(), org.onosproject.yang.gen.v1.urn.ietf
+                .params.xml.ns.yang.yrt.ietf.te.topology.rev20160317
+                .yrtietftetopology.telinkaugment.te.DefaultConfig.class);
+        SingleInstanceNode bundledlinks = (SingleInstanceNode) atomicPaths
+                .get(5);
+        assertThat(bundledlinks.type(), is(DataNode.Type.SINGLE_INSTANCE_NODE));
+        assertEquals(bundledlinks.container(), DefaultBundledLinks.class);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobSimpleDataTypeTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobSimpleDataTypeTest.java
new file mode 100644
index 0000000..3c2ba15
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobSimpleDataTypeTest.java
@@ -0,0 +1,534 @@
+/*
+ * 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;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.simple.data.types.ll.rev20131112.simpledatatypesll.DefaultCont1;
+import org.onosproject.yang.gen.v1.simple.data.types.rev20131112.simpledatatypes.DefaultCont;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.runtime.DefaultResourceData;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+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.initializeDataNode;
+
+/**
+ * Tests the YANG object building for different data types.
+ */
+public class YobSimpleDataTypeTest {
+
+    TestYangSerializerContext context = new TestYangSerializerContext();
+    private static final String DATA_TYPE_NAME_SPACE = "simple:data:types";
+    private static final String DATA_TYPE_NAME_SPACE_LL =
+            "simple:data:types:ll";
+    private DataNode.Builder dBlr;
+    private String value;
+
+    public DataNode buildDataNodeForSimpleDataTypes() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "cont", DATA_TYPE_NAME_SPACE, value, null);
+
+        value = "-128";
+        dBlr = addDataNode(dBlr, "lfnint8Min", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "127";
+        dBlr = addDataNode(dBlr, "lfnint8Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-32768";
+        dBlr = addDataNode(dBlr, "lfnint16Min", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "32767";
+        dBlr = addDataNode(dBlr, "lfnint16Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-2147483648";
+        dBlr = addDataNode(dBlr, "lfnint32Min", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "2147483647";
+        dBlr = addDataNode(dBlr, "lfnint32Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "10090";
+        dBlr = addDataNode(dBlr, "lfnint64Min", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "100700";
+        dBlr = addDataNode(dBlr, "lfnint64Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "32767";
+        dBlr = addDataNode(dBlr, "lfnuint8Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "2147483647";
+        dBlr = addDataNode(dBlr, "lfnuint16Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "10000";
+        dBlr = addDataNode(dBlr, "lfnuint32Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "32656256558";
+        dBlr = addDataNode(dBlr, "lfuint64Max", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "string1";
+        dBlr = addDataNode(dBlr, "lfstr", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "string2";
+        dBlr = addDataNode(dBlr, "lfstr1", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfbool1", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "false";
+        dBlr = addDataNode(dBlr, "lfbool2", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "false";
+        dBlr = addDataNode(dBlr, "lfbool3", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-922337203685477580.8";
+        dBlr = addDataNode(dBlr, "lfdecimal1", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-92233720368547758.08";
+        dBlr = addDataNode(dBlr, "lfdecimal2", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-9223372036854775.808";
+        dBlr = addDataNode(dBlr, "lfdecimal3", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-922337203685477.5808";
+        dBlr = addDataNode(dBlr, "lfdecimal4", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-9223372036854.775808";
+        dBlr = addDataNode(dBlr, "lfdecimal6", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "enum1";
+        dBlr = addDataNode(dBlr, "lfenum", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "bit1";
+        dBlr = addDataNode(dBlr, "lfbits", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "aGV5";
+        dBlr = addDataNode(dBlr, "lfbinary", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "path";
+        dBlr = addDataNode(dBlr, "lfref1", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "100";
+        dBlr = addDataNode(dBlr, "lfref2", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "";
+        dBlr = addDataNode(dBlr, "lfempty", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "cost";
+        dBlr = addDataNode(dBlr, "lfunion1", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-92233720368547758.08";
+        dBlr = addDataNode(dBlr, "lfunion2", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfunion4", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "color";
+        dBlr = addDataNode(dBlr, "lfunion5", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "b1";
+        dBlr = addDataNode(dBlr, "lfunion7", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "bandwidth";
+        dBlr = addDataNode(dBlr, "lfunion8", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "200";
+        dBlr = addDataNode(dBlr, "lfunion9", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfunion10", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "b1";
+        dBlr = addDataNode(dBlr, "lfunion11", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfunion12", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "b2";
+        dBlr = addDataNode(dBlr, "lfunion13", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "one";
+        dBlr = addDataNode(dBlr, "lfunion14", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "iden";
+        dBlr = addDataNode(dBlr, "identityref1", DATA_TYPE_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+
+    public DataNode buildDnForLeafListSimpleDataTypes() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        dBlr = addDataNode(dBlr, "cont1", DATA_TYPE_NAME_SPACE_LL, value, null);
+
+        value = "-128";
+        dBlr = addDataNode(dBlr, "lfnint8Min", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "127";
+        dBlr = addDataNode(dBlr, "lfnint8Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-32768";
+        dBlr = addDataNode(dBlr, "lfnint16Min", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "32767";
+        dBlr = addDataNode(dBlr, "lfnint16Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-2147483648";
+        dBlr = addDataNode(dBlr, "lfnint32Min", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "2147483647";
+        dBlr = addDataNode(dBlr, "lfnint32Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "10090";
+        dBlr = addDataNode(dBlr, "lfnint64Min", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "100700";
+        dBlr = addDataNode(dBlr, "lfnint64Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "32767";
+        dBlr = addDataNode(dBlr, "lfnuint8Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "2147483647";
+        dBlr = addDataNode(dBlr, "lfnuint16Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "10000";
+        dBlr = addDataNode(dBlr, "lfnuint32Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "32656256558";
+        dBlr = addDataNode(dBlr, "lfuint64Max", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "string1";
+        dBlr = addDataNode(dBlr, "lfstr", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "string2";
+        dBlr = addDataNode(dBlr, "lfstr1", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfbool1", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "false";
+        dBlr = addDataNode(dBlr, "lfbool2", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "false";
+        dBlr = addDataNode(dBlr, "lfbool3", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-922337203685477580.8";
+        dBlr = addDataNode(dBlr, "lfdecimal1", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-92233720368547758.08";
+        dBlr = addDataNode(dBlr, "lfdecimal2", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-9223372036854775.808";
+        dBlr = addDataNode(dBlr, "lfdecimal3", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-922337203685477.5808";
+        dBlr = addDataNode(dBlr, "lfdecimal4", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-9223372036854.775808";
+        dBlr = addDataNode(dBlr, "lfdecimal6", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "enum1";
+        dBlr = addDataNode(dBlr, "lfenum", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "bit1";
+        dBlr = addDataNode(dBlr, "lfbits", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "aGVsbG8=";
+        dBlr = addDataNode(dBlr, "lfbinary", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "path";
+        dBlr = addDataNode(dBlr, "lfref1", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "100";
+        dBlr = addDataNode(dBlr, "lfref2", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "";
+        dBlr = addDataNode(dBlr, "lfempty", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "cost";
+        dBlr = addDataNode(dBlr, "lfunion1", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "-92233720368547758.08";
+        dBlr = addDataNode(dBlr, "lfunion2", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfunion4", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "color";
+        dBlr = addDataNode(dBlr, "lfunion5", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "b1";
+        dBlr = addDataNode(dBlr, "lfunion7", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "bandwidth";
+        dBlr = addDataNode(dBlr, "lfunion8", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "200";
+        dBlr = addDataNode(dBlr, "lfunion9", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfunion10", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "b1";
+        dBlr = addDataNode(dBlr, "lfunion11", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "true";
+        dBlr = addDataNode(dBlr, "lfunion12", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "b2";
+        dBlr = addDataNode(dBlr, "lfunion13", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "one";
+        dBlr = addDataNode(dBlr, "lfunion14", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "iden";
+        dBlr = addDataNode(dBlr, "identityref1", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+    @Test
+    public void allDataTypesTest() {
+        DataNode dataNode = buildDataNodeForSimpleDataTypes();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultCont cont = ((DefaultCont) modelObject);
+        byte value = -128;
+        assertThat(cont.lfnint8Min(), is(value));
+
+        value = 127;
+        assertThat(cont.lfnint8Max(), is(value));
+
+        short val = -32768;
+        assertThat(cont.lfnint16Min(), is(val));
+
+        val = 32767;
+        assertThat(cont.lfnint16Max(), is(val));
+
+        assertThat(cont.lfnint32Min(), is(-2147483648));
+        assertThat(cont.lfnint32Max(), is(2147483647));
+        assertThat(cont.lfnint64Min(), is(10090L));
+        assertThat(cont.lfnint64Max(), is(100700L));
+
+        val = 32767;
+        assertThat(cont.lfnuint8Max(), is(val));
+        assertThat(cont.lfnuint16Max(), is(2147483647));
+        assertThat(cont.lfnuint32Max(), is(10000L));
+        assertThat(cont.lfuint64Max().toString(), is("32656256558"));
+        assertThat(cont.lfstr(), is("string1"));
+        assertThat(cont.lfstr1(), is("string2"));
+        assertThat(cont.lfbool1(), is(true));
+        assertThat(cont.lfbool2(), is(false));
+        assertThat(cont.lfbool3(), is(false));
+        assertThat(cont.lfdecimal1().toString(),
+                   is("-922337203685477580.8"));
+        assertThat(cont.lfdecimal2().toString(),
+                   is("-92233720368547758.08"));
+        assertThat(cont.lfdecimal3().toString(),
+                   is("-9223372036854775.808"));
+        assertThat(cont.lfdecimal4().toString(),
+                   is("-922337203685477.5808"));
+        assertThat(cont.lfdecimal6().toString(),
+                   is("-9223372036854.775808"));
+        assertThat(cont.lfenum().toString(), is("enum1"));
+        assertThat(cont.lfbits().toString(), is("{0}"));
+        String str = new String(cont.lfbinary());
+        assertThat(str, is("hey"));
+        assertThat(cont.lfref1(), is("path"));
+        value = 100;
+        assertThat(cont.lfref2(), is(value));
+        assertThat(cont.lfempty(), is(true));
+        assertThat(cont.lfunion1().toString(), is("cost"));
+        assertThat(cont.lfunion2().toString(), is("-92233720368547758.08"));
+        assertThat(cont.lfunion4().toString(), is("true"));
+        assertThat(cont.lfunion5().toString(), is("color"));
+        assertThat(cont.lfunion7().toString(), is("b1 "));
+        assertThat(cont.lfunion8().toString(), is("bandwidth"));
+        assertThat(cont.lfunion9().toString(), is("200"));
+        assertThat(cont.lfunion10().toString(), is("true"));
+        assertThat(cont.lfunion11().toString(), is("b1 "));
+        assertThat(cont.lfunion12().toString(), is("true"));
+        assertThat(cont.lfunion13().toString(), is("b2 "));
+        assertThat(cont.lfunion14().toString(), is("one"));
+        assertThat(cont.identityref1().getSimpleName(), is("Iden"));
+    }
+
+
+    @Test
+    public void allDataTypesTestForLeafList() {
+        DataNode dataNode = buildDnForLeafListSimpleDataTypes();
+        ResourceData data = DefaultResourceData.builder().addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(
+                (DefaultYangModelRegistry) context.getContext());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultCont1 cont = ((DefaultCont1) modelObject);
+        byte value = -128;
+        assertThat(cont.lfnint8Min().get(0), is(value));
+
+        value = 127;
+        assertThat(cont.lfnint8Max().get(0), is(value));
+
+        short val = -32768;
+        assertThat(cont.lfnint16Min().get(0), is(val));
+
+        val = 32767;
+        assertThat(cont.lfnint16Max().get(0), is(val));
+
+        assertThat(cont.lfnint32Min().get(0), is(-2147483648));
+        assertThat(cont.lfnint32Max().get(0), is(2147483647));
+        assertThat(cont.lfnint64Min().get(0), is(10090L));
+        assertThat(cont.lfnint64Max().get(0), is(100700L));
+
+        val = 32767;
+        assertThat(cont.lfnuint8Max().get(0), is(val));
+        assertThat(cont.lfnuint16Max().get(0), is(2147483647));
+        assertThat(cont.lfnuint32Max().get(0), is(10000L));
+        assertThat(cont.lfuint64Max().get(0).toString(), is("32656256558"));
+        assertThat(cont.lfstr().get(0), is("string1"));
+        assertThat(cont.lfstr1().get(0), is("string2"));
+        assertThat(cont.lfbool1().get(0), is(true));
+        assertThat(cont.lfbool2().get(0), is(false));
+        assertThat(cont.lfbool3().get(0), is(false));
+        assertThat(cont.lfdecimal1().get(0).toString(),
+                   is("-922337203685477580.8"));
+        assertThat(cont.lfdecimal2().get(0).toString(),
+                   is("-92233720368547758.08"));
+        assertThat(cont.lfdecimal3().get(0).toString(),
+                   is("-9223372036854775.808"));
+        assertThat(cont.lfdecimal4().get(0).toString(),
+                   is("-922337203685477.5808"));
+        assertThat(cont.lfdecimal6().get(0).toString(),
+                   is("-9223372036854.775808"));
+        assertThat(cont.lfenum().get(0).toString(), is("enum1"));
+        assertThat(cont.lfbits().get(0).toString(), is("{0}"));
+        String str = new String(cont.lfbinary().get(0));
+        assertThat(str, is("hello"));
+        assertThat(cont.lfref1().get(0), is("path"));
+        value = 100;
+        assertThat(cont.lfref2().get(0), is(value));
+        assertThat(cont.lfempty().get(0), is(true));
+        assertThat(cont.lfunion1().get(0).toString(), is("cost"));
+        assertThat(cont.lfunion2().get(0).toString(), is("-92233720368547758.08"));
+        assertThat(cont.lfunion4().get(0).toString(), is("true"));
+        assertThat(cont.lfunion5().get(0).toString(), is("color"));
+        assertThat(cont.lfunion7().get(0).toString(), is("b1 "));
+        assertThat(cont.lfunion8().get(0).toString(), is("bandwidth"));
+        assertThat(cont.lfunion9().get(0).toString(), is("200"));
+        assertThat(cont.lfunion10().get(0).toString(), is("true"));
+        assertThat(cont.lfunion11().get(0).toString(), is("b1 "));
+        assertThat(cont.lfunion12().get(0).toString(), is("true"));
+        assertThat(cont.lfunion13().get(0).toString(), is("b2 "));
+        assertThat(cont.lfunion14().get(0).toString(), is("one"));
+        assertThat(cont.identityref1().get(0).getSimpleName().toString(),
+                   is("Iden"));
+    }
+}
diff --git a/runtime/src/test/resources/yobTestYangFiles/SampleTest.yang b/runtime/src/test/resources/yobTestYangFiles/SampleTest.yang
new file mode 100644
index 0000000..c59ed74
--- /dev/null
+++ b/runtime/src/test/resources/yobTestYangFiles/SampleTest.yang
@@ -0,0 +1,53 @@
+module sample {
+    yang-version 1;
+    namespace "samplenamespace";
+    prefix "attr";
+    container top {
+        leaf mtu {
+           type string;
+        }
+        leaf-list color {
+           type string;
+        }
+        list interface {
+            key name;
+            leaf name {
+                type string;
+            }
+            container address {
+                leaf name {
+                    type string;
+                }
+            }
+        }
+    }
+    list l1 {
+        config false;
+        container c1 {
+            leaf leaf1 {
+               type string;
+            }
+            leaf-list leaf2 {
+               type string;
+            }
+        }
+        leaf leaf3 {
+            type string;
+        }
+        leaf-list leaf4 {
+            type string;
+        }
+    }
+    list l2 {
+        key k1;
+        leaf k1 {
+            type string;
+        }
+    }
+    leaf leaf5 {
+        type string;
+    }
+    leaf-list leaf6 {
+        type string;
+    }
+}
\ No newline at end of file
diff --git a/runtime/src/test/resources/yobTestYangFiles/ip-topology.yang b/runtime/src/test/resources/yobTestYangFiles/ip-topology.yang
new file mode 100644
index 0000000..cb56c41
--- /dev/null
+++ b/runtime/src/test/resources/yobTestYangFiles/ip-topology.yang
@@ -0,0 +1,28 @@
+module yms-ip-topology {
+    yang-version 1;
+    namespace urn:ip:topo;
+    prefix ip-topo;
+    import yms-topology {
+       prefix topo;
+       revision-date "2014-01-01";
+    }
+    revision 2014-01-01 {
+        description "desc";
+        reference "ref";
+    }
+
+    augment /topo:node{
+        leaf router-id {
+            type string;
+        }
+        leaf router-ip {
+            type string;
+        }
+    }
+
+    augment /topo:node/topo:termination-points/topo:termination-point {
+        leaf ip-address {
+            type string;
+        }
+    }
+}
diff --git a/runtime/src/test/resources/yobTestYangFiles/leafreftest.yang b/runtime/src/test/resources/yobTestYangFiles/leafreftest.yang
new file mode 100644
index 0000000..0905c86
--- /dev/null
+++ b/runtime/src/test/resources/yobTestYangFiles/leafreftest.yang
@@ -0,0 +1,71 @@
+module leafreftest {
+
+    yang-version 1;
+
+    namespace "yob.leafreftest";
+
+    prefix "uniontest";
+
+    organization "ON-LAB";
+
+    description "This module defines for union classifier.";
+
+    revision "2016-05-24" {
+        description "Initial revision.";
+    }
+
+    leaf middlename  {
+        type string;
+    }
+
+    list leafrefList {
+        config false;
+        leaf id {
+            type leafref {
+                path "/middlename";
+            }
+        }
+    }
+
+    typedef percent {
+        type leafref {
+            path "/middlename";
+        }
+    }
+
+    leaf name {
+        type percent;
+    }
+
+    grouping greeting {
+        leaf surname {
+            type leafref {
+                path "/middlename";
+            }
+        }
+    }
+
+    container cont1 {
+        uses greeting;
+    }
+
+    augment "/cont1" {
+        leaf lastname {
+            type leafref {
+                path "/middlename";
+            }
+        }
+    }
+
+    container food {
+        choice snack {
+            case sportsarena {
+                leaf pretzel {
+                    type leafref {
+                        path "/middlename";
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/runtime/src/test/resources/yobTestYangFiles/simple-data-types-leaf-list.yang b/runtime/src/test/resources/yobTestYangFiles/simple-data-types-leaf-list.yang
new file mode 100644
index 0000000..401cdaa
--- /dev/null
+++ b/runtime/src/test/resources/yobTestYangFiles/simple-data-types-leaf-list.yang
@@ -0,0 +1,256 @@
+module simple-data-types-ll {
+  namespace "simple:data:types:ll";
+
+  prefix "smpdtp";
+  revision 2013-11-12 {
+  }
+
+  identity iden {
+  }
+
+  typedef tpdfempty {
+    type empty;
+  }
+
+  typedef tpdfbit {
+     type bits {
+        bit b1;
+        bit b2;
+        bit b3;
+    }
+  }
+
+  typedef tpdfun4 {
+    type boolean;
+  }
+
+  typedef tpdfun3 {
+    type union {
+        type tpdfbit;
+        type tpdfempty;
+    }
+  }
+
+  typedef tpdfun2 {
+    type union {
+        type tpdfun3;
+        type tpdfun4;
+    }
+  }
+
+  typedef tpdfun1 {
+    type union {
+        type uint8;
+        type decimal64 {
+            fraction-digits 2;
+        }
+    }
+  }
+
+  container cont1 {
+     leaf-list lfnint8Min {
+        type int8;
+      }
+      leaf-list lfnint8Max {
+        type int8;
+      }
+      leaf-list lfnint16Min {
+        type int16;
+      }
+      leaf-list lfnint16Max {
+        type int16;
+      }
+      leaf-list lfnint32Min {
+        type int32;
+      }
+      leaf-list lfnint32Max {
+        type int32;
+      }
+      leaf-list lfnint64Min {
+        type int64;
+      }
+      leaf-list lfnint64Max {
+        type int64;
+      }
+      leaf-list lfnuint8Max {
+        type uint8;
+      }
+      leaf-list lfnuint16Max {
+        type uint16;
+      }
+      leaf-list lfnuint32Max {
+        type uint32;
+      }
+      leaf-list lfuint64Max {
+        type uint64;
+      }
+      leaf-list lfstr {
+        type string;
+      }
+      leaf-list lfstr1 {
+        type string;
+      }
+      leaf-list lfbool1 {
+        type boolean;
+      }
+      leaf-list lfbool2 {
+        type boolean;
+      }
+      leaf-list lfbool3 {
+        type boolean;
+      }
+      leaf-list lfdecimal1 {
+        type decimal64 {
+            fraction-digits 1;
+        }
+      }
+      leaf-list lfdecimal2 {
+        type decimal64 {
+            fraction-digits 2;
+        }
+      }
+      leaf-list lfdecimal3 {
+        type decimal64 {
+            fraction-digits 3;
+        }
+      }
+
+      leaf-list lfdecimal4 {
+        type decimal64 {
+            fraction-digits 4;
+        }
+      }
+
+      leaf-list lfdecimal6 {
+        type decimal64 {
+            fraction-digits 6;
+        }
+      }
+
+    leaf-list lfenum {
+      type enumeration {
+        enum enum1;
+        enum enum2;
+        enum enum3;
+        enum enum4;
+      }
+    }
+
+    leaf-list lfbits {
+      type bits {
+        bit bit1;
+        bit bit2;
+        bit bit3;
+        bit bit4;
+      }
+    }
+
+    leaf-list lfbinary {
+        type binary;
+    }  
+
+    leaf-list lfref1 {                  //reference to string type
+        type leafref {
+            path "../lfstr";
+        }
+    }
+
+    leaf-list lfref2 {                  //reference to number type
+        type leafref {
+            path "../lfnint8Max";
+        }
+    }
+
+    leaf-list lfempty {
+        type empty;
+    }
+
+    leaf-list lfunion1 {
+        type union {
+            type uint16;
+            type string;
+        }
+    }
+    leaf-list lfunion2 {
+        type union {
+            type decimal64 {
+                fraction-digits 2;
+            }
+            type string;
+        }
+    }
+
+    leaf-list lfunion4 {
+        type union {
+            type boolean;
+            type string;
+        }
+    }
+
+    leaf-list lfunion5 {
+        type union {
+            type uint16;
+            type string;
+        }
+    }
+
+    leaf-list lfunion7 {
+        type tpdfun3;
+    }
+
+    leaf-list lfunion8 {
+        type union {
+            type uint16;
+            type string;
+        }
+    }
+
+    leaf-list lfunion9 {
+        type union {
+            type uint16;
+            type boolean;
+        }
+    }
+
+    leaf-list lfunion10 {
+        type union {
+            type bits {
+                bit bt1;
+                bit bt2;
+            }
+            type boolean;
+        }
+    }
+
+    leaf-list lfunion11 {
+        type union {
+            type tpdfun1;
+            type tpdfun2;
+        }
+    }
+
+    leaf-list lfunion12 {
+        type tpdfun2;
+    }
+
+    leaf-list lfunion13 {
+        type tpdfbit;    
+    }
+
+    leaf-list lfunion14 {
+        type union {
+            type enumeration {
+                enum zero;
+                enum one;
+            }
+            type uint16;
+        }
+    }
+
+    leaf-list identityref1 {
+        type identityref {
+            base iden;
+        }
+    }
+  }
+}
diff --git a/runtime/src/test/resources/yobTestYangFiles/simple-data-types.yang b/runtime/src/test/resources/yobTestYangFiles/simple-data-types.yang
new file mode 100644
index 0000000..602c37b
--- /dev/null
+++ b/runtime/src/test/resources/yobTestYangFiles/simple-data-types.yang
@@ -0,0 +1,256 @@
+module simple-data-types {
+  namespace "simple:data:types";  
+
+  prefix "smpdtp";
+  revision 2013-11-12 {
+  }
+
+  identity iden {
+  }
+
+  typedef tpdfempty {
+    type empty;
+  }
+
+  typedef tpdfbit {
+     type bits {
+        bit b1;
+        bit b2;
+        bit b3;
+    }
+  }
+
+  typedef tpdfun4 {
+    type boolean;
+  }
+
+  typedef tpdfun3 {
+    type union {
+        type tpdfbit;
+        type tpdfempty;
+    }
+  }
+
+  typedef tpdfun2 {
+    type union {
+        type tpdfun3;
+        type tpdfun4;
+    }
+  }
+
+  typedef tpdfun1 {
+    type union {
+        type uint8;
+        type decimal64 {
+            fraction-digits 2;
+        }
+    }
+  }
+
+  container cont {
+     leaf lfnint8Min {
+        type int8;
+      }
+      leaf lfnint8Max {
+        type int8;
+      }
+      leaf lfnint16Min {
+        type int16;
+      }
+      leaf lfnint16Max {
+        type int16;
+      }
+      leaf lfnint32Min {
+        type int32;
+      }
+      leaf lfnint32Max {
+        type int32;
+      }
+      leaf lfnint64Min {
+        type int64;
+      }
+      leaf lfnint64Max {
+        type int64;
+      }
+      leaf lfnuint8Max {
+        type uint8;
+      }
+      leaf lfnuint16Max {
+        type uint16;
+      }
+      leaf lfnuint32Max {
+        type uint32;
+      }
+      leaf lfuint64Max {
+        type uint64;
+      }
+      leaf lfstr {
+        type string;
+      }
+      leaf lfstr1 {
+        type string;
+      }
+      leaf lfbool1 {
+        type boolean;
+      }
+      leaf lfbool2 {
+        type boolean;
+      }
+      leaf lfbool3 {
+        type boolean;
+      }
+      leaf lfdecimal1 {
+        type decimal64 {
+            fraction-digits 1;
+        }
+      }
+      leaf lfdecimal2 {
+        type decimal64 {
+            fraction-digits 2;
+        }
+      }
+      leaf lfdecimal3 {
+        type decimal64 {
+            fraction-digits 3;
+        }
+      }
+
+      leaf lfdecimal4 {
+        type decimal64 {
+            fraction-digits 4;
+        }
+      }
+
+      leaf lfdecimal6 {
+        type decimal64 {
+            fraction-digits 6;
+        }
+      }
+
+    leaf lfenum {
+      type enumeration {
+        enum enum1;
+        enum enum2;
+        enum enum3;
+        enum enum4;
+      }
+    }
+
+    leaf lfbits {
+      type bits {
+        bit bit1;
+        bit bit2;
+        bit bit3;
+        bit bit4;
+      }
+    }
+
+    leaf lfbinary {
+        type binary;
+    }  
+
+    leaf lfref1 {                  //reference to string type
+        type leafref {
+            path "../lfstr";
+        }
+    }
+
+    leaf lfref2 {                  //reference to number type
+        type leafref {
+            path "../lfnint8Max";
+        }
+    }
+
+    leaf lfempty {
+        type empty;
+    }
+
+    leaf lfunion1 {
+        type union {
+            type uint16;
+            type string;
+        }
+    }
+    leaf lfunion2 {
+        type union {
+            type decimal64 {
+                fraction-digits 2;
+            }
+            type string;
+        }
+    }
+
+    leaf lfunion4 {
+        type union {
+            type boolean;
+            type string;
+        }
+    }
+
+    leaf lfunion5 {
+        type union {
+            type uint16;
+            type string;
+        }
+    }
+
+    leaf lfunion7 {
+        type tpdfun3;
+    }
+
+    leaf lfunion8 {
+        type union {
+            type uint16;
+            type string;
+        }
+    }
+
+    leaf lfunion9 {
+        type union {
+            type uint16;
+            type boolean;
+        }
+    }
+
+    leaf lfunion10 {
+        type union {
+            type bits {
+                bit bt1;
+                bit bt2;
+            }
+            type boolean;
+        }
+    }
+
+    leaf lfunion11 {
+        type union {
+            type tpdfun1;
+            type tpdfun2;
+        }
+    }
+
+    leaf lfunion12 {
+        type tpdfun2;
+    }
+
+    leaf lfunion13 {
+        type tpdfbit;    
+    }
+
+    leaf lfunion14 {
+        type union {
+            type enumeration {
+                enum zero;
+                enum one;
+            }
+            type uint16;
+        }
+    }
+
+    leaf identityref1 {
+        type identityref {
+            base iden;
+        }
+    }
+  }
+}
diff --git a/runtime/src/test/resources/yobTestYangFiles/topology.yang b/runtime/src/test/resources/yobTestYangFiles/topology.yang
new file mode 100644
index 0000000..9837851
--- /dev/null
+++ b/runtime/src/test/resources/yobTestYangFiles/topology.yang
@@ -0,0 +1,90 @@
+
+module yms-topology {
+    yang-version 1;
+    namespace urn:topo;
+    prefix topo;
+    revision 2014-01-01 {
+        description "desc";
+        reference "ref";
+    }
+    list node {
+        key "node-id";
+        leaf node-id{
+           type string;
+        }
+        leaf-list node-prop{
+           type string;
+        }
+        container termination-points{
+            leaf number-of-tp {
+                type int16;
+            }
+            list termination-point {
+                key "tp-id";
+                leaf tp-id {
+                    type string;
+                }
+            }
+        }
+        choice choice1{
+           case case1a{
+               leaf leaf1a1{
+                   type string;
+               }
+               leaf leaf1a2{
+                   type string;
+               }
+           }
+           case case1b{
+               choice choice1b{
+                   case case1bi{
+                       leaf leaf1bia{
+                           type string;
+                       }
+                       leaf leaf1bib{
+                           type string;
+                       }
+                   }
+                   case case1bii{
+                       leaf leaf1biia{
+                           type string;
+                       }
+                       leaf leaf1biib{
+                           type string;
+                       }
+                   }
+               }
+           }
+        }
+    }
+    choice choice2 {
+        case case2a {
+            leaf leaf2a1 {
+                type string;
+            }
+            leaf leaf2a2 {
+                type string;
+            }
+        }
+        case case2b {
+            choice choice3b {
+                case case2bi {
+                    leaf leaf2bia {
+                       type string;
+                    }
+                    leaf leaf2bib {
+                       type string;
+                    }
+                }
+                case case3bii {
+                   leaf leaf3biia {
+                       type string;
+                   }
+                   leaf leaf3biib {
+                      type string;
+                   }
+                }
+            }
+        }
+    }
+}