diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yab/YangApplicationBroker.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yab/YangApplicationBroker.java
index cb6f7d7..aa76750 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yab/YangApplicationBroker.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yab/YangApplicationBroker.java
@@ -44,6 +44,7 @@
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.yms.app.utils.TraversalType.CHILD;
@@ -67,6 +68,7 @@
     private static final String AUGMENTED = "Augmented";
     private static final String VOID = "void";
     private final YangSchemaRegistry schemaRegistry;
+    private Set<String> augGenMethodSet;
 
     /**
      * Creates a new YANG application broker.
@@ -88,11 +90,14 @@
             throws YabException {
         List<Object> responseObjects = new LinkedList<>();
         YangRequestWorkBench workBench = (YangRequestWorkBench) ydtWorkBench;
+        augGenMethodSet = ((YangRequestWorkBench) ydtWorkBench).getAugGenMethodSet();
 
         for (YdtAppContext appContext = workBench.getAppRootNode().getFirstChild();
              appContext != null; appContext = appContext.getNextSibling()) {
             Object responseObject = processQueryOfApplication(appContext);
-            responseObjects.add(responseObject);
+            if (responseObject != null) {
+                responseObjects.add(responseObject);
+            }
         }
 
         YdtContext rootYdtContext = workBench.getRootNode();
@@ -116,7 +121,7 @@
     public YdtResponse processEdit(YdtBuilder ydtWorkBench)
             throws CloneNotSupportedException, YabException {
         YangRequestWorkBench workBench = (YangRequestWorkBench) ydtWorkBench;
-
+        augGenMethodSet = ((YangRequestWorkBench) ydtWorkBench).getAugGenMethodSet();
         for (YdtAppContext appContext = workBench.getAppRootNode().getFirstChild();
              appContext != null; appContext = appContext.getNextSibling()) {
             processEditOfApplication(appContext);
@@ -229,10 +234,13 @@
                 String methodName = getApplicationMethodName(appContext,
                                                              appName, GET);
 
+                String moduleName = appContext.getAppData()
+                        .getRootSchemaNode().getName();
+
                 // invoke application's getter method
                 outputObject = invokeApplicationsMethod(appManagerObject,
                                                         outputObject,
-                                                        methodName);
+                                                        methodName, moduleName);
             }
 
             /*
@@ -293,9 +301,12 @@
                     String methodName = getApplicationMethodName(appContext,
                                                                  appName, SET);
 
+                    String moduleName = appContext.getAppData()
+                            .getRootSchemaNode().getName();
+
                     // invoke application's setter method
                     invokeApplicationsMethod(appManagerObject, outputObject,
-                                             methodName);
+                                             methodName, moduleName);
                 }
 
                 /*
@@ -366,8 +377,12 @@
                 String methodName = getApplicationMethodName(appContext,
                                                              appName, SET);
 
+                String moduleName = appContext.getAppData().getRootSchemaNode()
+                        .getName();
+
                 // invoke application's setter method
-                invokeApplicationsMethod(appManagerObject, inputObject, methodName);
+                invokeApplicationsMethod(appManagerObject, inputObject,
+                                         methodName, moduleName);
 
                 if (appContext.getPreviousSibling() != null) {
                     curTraversal = SIBLING;
@@ -614,7 +629,8 @@
                 .getAugmentedInfoList()) {
             Object appManagerObject = schemaRegistry
                     .getRegisteredApplication(yangAugment.getParent());
-            if (appManagerObject != null) {
+            if (appManagerObject != null
+                    && augGenMethodSet.add(yangAugment.getSetterMethodName())) {
                 childAppContext = addChildToYdtAppTree(curAppContext,
                                                        yangAugment);
                 processAugmentForChildNode(childAppContext, yangAugment);
@@ -788,7 +804,8 @@
      */
     private Object invokeApplicationsMethod(Object appManagerObject,
                                             Object inputObject,
-                                            String methodName) throws YabException {
+                                            String methodName, String appName)
+            throws YabException {
         checkNotNull(appManagerObject);
         Class<?> appClass = appManagerObject.getClass();
         try {
@@ -798,9 +815,11 @@
                 return methodObject.invoke(appManagerObject, inputObject);
             }
             throw new YabException("No such method in application");
-        } catch (IllegalAccessException | NoSuchMethodException |
-                InvocationTargetException e) {
+        } catch (IllegalAccessException | NoSuchMethodException e) {
             throw new YabException(e);
+        } catch (InvocationTargetException e) {
+            throw new YabException("Invocation exception in service " + appName,
+                                   e.getCause());
         }
     }
 
@@ -869,4 +888,13 @@
             throw new YabException(e);
         }
     }
+
+    /**
+     * Sets the augment setter method name.
+     *
+     * @param augGenMethodSet augment setter method name
+     */
+    public void setAugGenMethodSet(Set<String> augGenMethodSet) {
+        this.augGenMethodSet = augGenMethodSet;
+    }
 }
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobBuilderOrBuiltObject.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobBuilderOrBuiltObject.java
index 6df0724..03af131 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobBuilderOrBuiltObject.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobBuilderOrBuiltObject.java
@@ -20,6 +20,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.onosproject.yms.app.yob.YobConstants.E_BUILDER_IS_NOT_ALREADY_SET;
 import static org.onosproject.yms.app.yob.YobConstants.E_BUILDER_IS_NOT_SET;
 import static org.onosproject.yms.app.yob.YobConstants.E_BUILT_OBJ_IS_NOT_SET;
 import static org.onosproject.yms.app.yob.YobConstants.E_FAIL_TO_CREATE_OBJ;
@@ -27,6 +28,7 @@
 import static org.onosproject.yms.app.yob.YobConstants.E_OBJ_BUILDING_WITHOUT_BUILDER;
 import static org.onosproject.yms.app.yob.YobConstants.E_OBJ_IS_ALREADY_BUILT_NOT_BUILD;
 import static org.onosproject.yms.app.yob.YobConstants.E_OBJ_IS_ALREADY_BUILT_NOT_FETCH;
+import static org.onosproject.yms.app.yob.YobConstants.E_OBJ_IS_ALREADY_BUILT_NOT_SET;
 import static org.onosproject.yms.app.yob.YobConstants.E_OBJ_IS_NOT_SET_NOT_FETCH;
 import static org.onosproject.yms.app.yob.YobConstants.E_REFLECTION_FAIL_TO_CREATE_OBJ;
 import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_CREATE_OBJ;
@@ -73,7 +75,7 @@
             yangDefaultClass =
                     registeredAppClassLoader.loadClass(qualifiedClassName);
             yangBuilderClass = yangDefaultClass.getDeclaredClasses()[0];
-            builderOrBuiltObject = yangBuilderClass.newInstance();
+            setBuilderObject(yangBuilderClass.newInstance());
         } catch (ClassNotFoundException e) {
             log.error(L_FAIL_TO_LOAD_CLASS, qualifiedClassName);
             throw new YobException(E_FAIL_TO_LOAD_CLASS + qualifiedClassName);
@@ -91,8 +93,7 @@
      * Returns the builder object if it is set.
      *
      * @return builder object
-     * @throws YobException if builder object is not available or if it is
-     *                      already built
+     * @throws YobException if builder is not available
      */
     Object getBuilderObject() {
         if (isBuilt) {
@@ -107,6 +108,25 @@
     }
 
     /**
+     * Check if the builder object is being initialized for the first time and
+     * set it.
+     *
+     * @param builderObject new builder object
+     * @throws YobException if built object is not available
+     */
+    private void setBuilderObject(Object builderObject) {
+        if (isBuilt) {
+            throw new YobException(E_OBJ_IS_ALREADY_BUILT_NOT_SET);
+        }
+
+        if (builderOrBuiltObject != null) {
+            throw new YobException(E_BUILDER_IS_NOT_ALREADY_SET);
+        }
+
+        builderOrBuiltObject = builderObject;
+    }
+
+    /**
      * Returns the built object.
      *
      * @return built object
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobConstants.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobConstants.java
index 6ed14267..cf2638e 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobConstants.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobConstants.java
@@ -30,12 +30,16 @@
     static final String DEFAULT = "Default";
     static final String ADD_TO = "addTo";
     static final String VALUE_OF = "valueOf";
-    static final String OPERATION_TYPE = "onosYangNodeOperationType";
-    static final String OP_TYPE = "OnosYangNodeOperationType";
+    static final String OP_TYPE = "OpType";
+    static final String ONOS_YANG_OP_TYPE = "OnosYangOpType";
     static final String OF = "of";
     static final String PERIOD = ".";
     static final String SPACE = " ";
     static final String ADD_AUGMENT_METHOD = "addYangAugmentedInfo";
+    static final String YANG = "yang";
+    static final String JAVA_LANG = "java.lang";
+    static final String LEAF_IDENTIFIER = "LeafIdentifier";
+    static final String SELECT_LEAF = "selectLeaf";
 
     //Error strings
     static final String E_NO_HANDLE_FOR_YDT = "No handler for YDT node";
@@ -78,6 +82,10 @@
             "Builder is not yet set, cannot fetch it";
     static final String E_BUILT_OBJ_IS_NOT_SET =
             "Built object is not set";
+    static final String E_OBJ_IS_ALREADY_BUILT_NOT_SET =
+            "Object is already built, cannot set builder";
+    static final String E_BUILDER_IS_NOT_ALREADY_SET =
+            "Builder is not already set";
     static final String E_OBJ_IS_NOT_SET_NOT_FETCH =
             "Builder is not yet set, cannot fetch it";
     static final String E_OBJ_IS_ALREADY_BUILT_NOT_BUILD =
@@ -88,4 +96,6 @@
             "YANG data tree is missing the data required for YOB";
     static final String E_INVALID_DATA_TREE =
             "YANG tree does not have a application root";
+    static final String E_INVALID_EMPTY_DATA =
+            "Value for empty data type is invalid";
 }
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java
index abb6248..28527ea 100755
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobHandler.java
@@ -47,6 +47,9 @@
                               YangSchemaRegistry registry) {
         String setterName = null;
         YangSchemaNode node = curNode.getYangSchemaNode();
+        while (node.getReferredSchema() != null) {
+            node = node.getReferredSchema();
+        }
 
         String qualName = getQualifiedDefaultClass(node);
         ClassLoader classLoader = YobUtils.getClassLoader(registry, qualName,
@@ -56,7 +59,7 @@
             setterName = node.getJavaAttributeName();
         }
 
-        Object workBench = new YobWorkBench(node, classLoader, qualName,
+        Object workBench = new YobWorkBench(curNode.getYangSchemaNode(), classLoader, qualName,
                                             setterName);
 
         curNode.addAppInfo(YOB, workBench);
@@ -71,8 +74,9 @@
      */
     public void setInParent(YdtExtendedContext ydtNode,
                             YangSchemaRegistry schemaRegistry) {
-        YobWorkBench yobWorkBench = (YobWorkBench) ydtNode.getAppInfo(YOB);
-        yobWorkBench.setObjectInParent(ydtNode);
+        YdtExtendedContext parentNode = (YdtExtendedContext) ydtNode.getParent();
+        YobWorkBench parentWorkbench = (YobWorkBench) parentNode.getAppInfo(YOB);
+        parentWorkbench.setObject(ydtNode, schemaRegistry);
     }
 
     /**
@@ -88,6 +92,6 @@
                             YdtExtendedContext ydtRootNode,
                             YangSchemaRegistry schemaRegistry) {
         YobWorkBench yobWorkBench = (YobWorkBench) ydtNode.getAppInfo(YOB);
-        yobWorkBench.buildObject(ydtNode);
+        yobWorkBench.buildObject(ydtNode.getYdtContextOperationType(), schemaRegistry);
     }
 }
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobMultiInstanceLeafHandler.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobMultiInstanceLeafHandler.java
index c59725a..6d97841 100755
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobMultiInstanceLeafHandler.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobMultiInstanceLeafHandler.java
@@ -33,6 +33,7 @@
 import java.lang.reflect.ParameterizedType;
 import java.util.Set;
 
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 import static org.onosproject.yms.app.ydt.AppType.YOB;
 import static org.onosproject.yms.app.yob.YobConstants.ADD_TO;
@@ -74,6 +75,10 @@
                             YangSchemaRegistry schemaRegistry) {
         Class<?> parentBuilderClass = null;
         YangSchemaNode yangSchemaNode = leafListNode.getYangSchemaNode();
+        while (yangSchemaNode.getReferredSchema() != null) {
+            yangSchemaNode = yangSchemaNode.getReferredSchema();
+        }
+
         YdtExtendedContext parentYdtNode =
                 (YdtExtendedContext) leafListNode.getParent();
         YobWorkBench parentYobWorkBench =
@@ -90,17 +95,25 @@
                         .getDeclaredField(setterInParent);
                 ParameterizedType genericListType =
                         (ParameterizedType) leafName.getGenericType();
-                Class<?> genericListClass =
-                        (Class<?>) genericListType.getActualTypeArguments()[0];
-                Method setterMethod =
-                        parentBuilderClass.getDeclaredMethod(
-                                ADD_TO + getCapitalCase(setterInParent),
-                                genericListClass);
+                Class<?> genericListClass;
+                if (((YangLeafList) leafListNode.getYangSchemaNode())
+                        .getDataType().getDataType() == IDENTITYREF) {
+                    ParameterizedType type = (ParameterizedType)
+                            genericListType.getActualTypeArguments()[0];
+                    genericListClass = type.getClass().getClass();
+                } else {
+                    genericListClass = (Class<?>) genericListType.getActualTypeArguments()[0];
+                }
+
+                Method setterMethod = parentBuilderClass.getDeclaredMethod(
+                        ADD_TO + getCapitalCase(setterInParent), genericListClass);
+
                 JavaQualifiedTypeInfoContainer javaQualifiedType =
                         (JavaQualifiedTypeInfoContainer) yangSchemaNode;
                 YangType<?> yangType =
                         ((YangLeafList) javaQualifiedType).getDataType();
-                YobUtils.setDataFromStringValue(yangType, value, setterMethod,
+                YobUtils.setDataFromStringValue(yangType.getDataType(), value,
+                                                setterMethod,
                                                 builderObject, leafListNode);
             } catch (NoSuchMethodException | InvocationTargetException
                     | IllegalAccessException | NoSuchFieldException e) {
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobSingleInstanceLeafHandler.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobSingleInstanceLeafHandler.java
index 6840684..4d8736b 100755
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobSingleInstanceLeafHandler.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobSingleInstanceLeafHandler.java
@@ -19,6 +19,7 @@
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangSchemaNode;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yms.app.ydt.YdtExtendedContext;
 import org.onosproject.yms.app.yob.exception.YobException;
 import org.onosproject.yms.app.ysr.YangSchemaRegistry;
@@ -69,6 +70,10 @@
 
         try {
             YangSchemaNode schemaNode = leafNode.getYangSchemaNode();
+            while (schemaNode.getReferredSchema() != null) {
+                schemaNode = schemaNode.getReferredSchema();
+            }
+
             String setterInParent = schemaNode.getJavaAttributeName();
             YdtExtendedContext parentNode =
                     (YdtExtendedContext) leafNode.getParent();
@@ -76,13 +81,20 @@
             Object builderObject = workBench
                     .getParentBuilder(leafNode, schemaRegistry);
             builderClass = builderObject.getClass();
-            Field leafName = builderClass.getDeclaredField(setterInParent);
-            Method setterMethod = builderClass
-                    .getDeclaredMethod(setterInParent, leafName.getType());
-            YangType<?> yangType = ((YangLeaf) schemaNode).getDataType();
-            YobUtils.setDataFromStringValue(yangType, leafNode.getValue(),
-                                            setterMethod, builderObject,
-                                            leafNode);
+            if (leafNode.getValue() != null || ((YangLeaf) schemaNode)
+                    .getDataType().getDataType() == YangDataTypes.EMPTY) {
+                Field leafName = builderClass.getDeclaredField(setterInParent);
+                Method setterMethod = builderClass
+                        .getDeclaredMethod(setterInParent, leafName.getType());
+                YangType<?> yangType = ((YangLeaf) schemaNode).getDataType();
+                YobUtils.setDataFromStringValue(yangType.getDataType(), leafNode
+                                                        .getValue(),
+                                                setterMethod, builderObject,
+                                                leafNode);
+            } else {
+                YobUtils.setSelectLeaf(builderClass, leafNode,
+                                       schemaRegistry, builderObject);
+            }
         } catch (NoSuchMethodException | InvocationTargetException |
                 IllegalAccessException | NoSuchFieldException e) {
             log.error(L_FAIL_TO_INVOKE_METHOD, builderClass.getName());
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobUtils.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobUtils.java
index c8256c9..c4cbfc5 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobUtils.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobUtils.java
@@ -17,14 +17,17 @@
 package org.onosproject.yms.app.yob;
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
-import org.onosproject.yangutils.datamodel.YangBit;
-import org.onosproject.yangutils.datamodel.YangBits;
+import org.onosproject.yangutils.datamodel.YangDerivedInfo;
+import org.onosproject.yangutils.datamodel.YangIdentity;
+import org.onosproject.yangutils.datamodel.YangIdentityRef;
 import org.onosproject.yangutils.datamodel.YangLeaf;
+import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangSchemaNode;
 import org.onosproject.yangutils.datamodel.YangSchemaNodeContextInfo;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yms.app.ydt.YdtExtendedContext;
 import org.onosproject.yms.app.yob.exception.YobException;
 import org.onosproject.yms.app.ysr.YangSchemaRegistry;
@@ -37,22 +40,23 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Base64;
-import java.util.BitSet;
-import java.util.Map;
 
 import static org.onosproject.yangutils.datamodel.YangSchemaNodeType.YANG_AUGMENT_NODE;
-import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 import static org.onosproject.yms.app.ydt.AppType.YOB;
 import static org.onosproject.yms.app.yob.YobConstants.DEFAULT;
 import static org.onosproject.yms.app.yob.YobConstants.E_DATA_TYPE_NOT_SUPPORT;
+import static org.onosproject.yms.app.yob.YobConstants.E_FAIL_TO_LOAD_CLASS;
 import static org.onosproject.yms.app.yob.YobConstants.E_FAIL_TO_LOAD_CONSTRUCTOR;
 import static org.onosproject.yms.app.yob.YobConstants.E_INVALID_DATA_TREE;
+import static org.onosproject.yms.app.yob.YobConstants.E_INVALID_EMPTY_DATA;
 import static org.onosproject.yms.app.yob.YobConstants.FROM_STRING;
+import static org.onosproject.yms.app.yob.YobConstants.LEAF_IDENTIFIER;
 import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_LOAD_CLASS;
 import static org.onosproject.yms.app.yob.YobConstants.OF;
 import static org.onosproject.yms.app.yob.YobConstants.OP_PARAM;
 import static org.onosproject.yms.app.yob.YobConstants.PERIOD;
-import static org.onosproject.yms.app.yob.YobConstants.SPACE;
+import static org.onosproject.yms.app.yob.YobConstants.SELECT_LEAF;
+import static org.onosproject.yms.app.yob.YobConstants.VALUE_OF;
 
 /**
  * Utils to support object creation.
@@ -82,13 +86,13 @@
      * @throws IllegalAccessException    if member cannot be accessed
      * @throws NoSuchMethodException     if method is not found
      */
-    static void setDataFromStringValue(YangType<?> type, String leafValue,
+    static void setDataFromStringValue(YangDataTypes type, String leafValue,
                                        Method parentSetterMethod,
                                        Object parentBuilderObject,
                                        YdtExtendedContext ydtExtendedContext)
             throws InvocationTargetException, IllegalAccessException,
             NoSuchMethodException {
-        switch (type.getDataType()) {
+        switch (type) {
             case INT8:
                 parentSetterMethod.invoke(parentBuilderObject,
                                           Byte.parseByte(leafValue));
@@ -118,6 +122,13 @@
                 break;
 
             case EMPTY:
+                if (leafValue == null || leafValue.equals("")) {
+                    parentSetterMethod.invoke(parentBuilderObject, true);
+                } else {
+                    log.info(E_INVALID_EMPTY_DATA);
+                }
+                break;
+
             case BOOLEAN:
                 parentSetterMethod.invoke(parentBuilderObject,
                                           Boolean.parseBoolean(leafValue));
@@ -133,10 +144,8 @@
                 break;
 
             case BITS:
-                YangBits yangBits = (YangBits) type.getDataTypeExtendedInfo();
-                parentSetterMethod.invoke(parentBuilderObject,
-                                          getBitSetValueFromString(yangBits,
-                                                                   leafValue));
+                parseBitSetTypeInfo(ydtExtendedContext, parentSetterMethod,
+                                    parentBuilderObject, leafValue);
                 break;
 
             case DECIMAL64:
@@ -149,6 +158,11 @@
                                      parentBuilderObject, leafValue, false);
                 break;
 
+            case IDENTITYREF:
+                parseIdentityRefInfo(ydtExtendedContext, parentSetterMethod,
+                                     parentBuilderObject, leafValue);
+                break;
+
             case UNION:
                 parseDerivedTypeInfo(ydtExtendedContext, parentSetterMethod,
                                      parentBuilderObject, leafValue, false);
@@ -170,20 +184,72 @@
     }
 
     /**
+     * Sets the select leaf flag for leaf.
+     *
+     * @param builderClass   builder in which the select leaf flag needs to be
+     *                       set
+     * @param leafNode       YANG data tree leaf node
+     * @param schemaRegistry YANG schema registry
+     * @param builderObject  the parent build object on which to invoke
+     *                       the method
+     * @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 setSelectLeaf(Class builderClass,
+                              YdtExtendedContext leafNode,
+                              YangSchemaRegistry schemaRegistry,
+                              Object builderObject) throws NoSuchMethodException,
+            InvocationTargetException, IllegalAccessException {
+
+        YangSchemaNode parentSchema = ((YdtExtendedContext) leafNode
+                .getParent()).getYangSchemaNode();
+        while (parentSchema.getReferredSchema() != null) {
+            parentSchema = parentSchema.getReferredSchema();
+        }
+
+        while (((YangNode) parentSchema).getParent() != null) {
+            parentSchema = ((YangNode) parentSchema).getParent();
+        }
+
+        String qualName = getQualifiedinterface(parentSchema);
+        Class<?> regClass = schemaRegistry.getRegisteredClass(parentSchema);
+        if (regClass == null) {
+            throw new YobException(E_FAIL_TO_LOAD_CLASS + qualName);
+        }
+
+        Class<?> interfaceClass = null;
+        try {
+            interfaceClass = regClass.getClassLoader().loadClass(qualName);
+        } catch (ClassNotFoundException e) {
+            log.info(E_FAIL_TO_LOAD_CLASS, qualName);
+        }
+
+        Class<?>[] innerClasses = interfaceClass.getClasses();
+        for (Class<?> innerEnumClass : innerClasses) {
+            if (innerEnumClass.getSimpleName().equals(LEAF_IDENTIFIER)) {
+                Method valueOfMethod = innerEnumClass
+                        .getDeclaredMethod(VALUE_OF, String.class);
+                String leafName = leafNode.getYangSchemaNode()
+                        .getJavaAttributeName().toUpperCase();
+                Object obj = valueOfMethod.invoke(null, leafName);
+                Method selectLeafMethod = builderClass
+                        .getDeclaredMethod(SELECT_LEAF, innerEnumClass);
+                selectLeafMethod.invoke(builderObject, obj);
+                break;
+            }
+        }
+    }
+
+    /**
      * To set data into parent setter method from string value for derived type.
      *
-     * @param leafValue           leafValue argument is used to set the value
-     *                            in method
-     * @param parentSetterMethod  Invokes the underlying method represented
-     *                            by this parentSetterMethod
-     * @param parentBuilderObject the parentBuilderObject is to invoke the
-     *                            underlying method
-     * @param ydtExtendedContext  ydtExtendedContext is used to get
-     *                            application related
-     *                            information maintained in YDT
-     * @param isEnum              isEnum parameter is used to check whether
-     *                            type is enum or derived
-     *                            information maintained in YDT
+     * @param leafValue           value to be set in method
+     * @param parentSetterMethod  the parent setter method to be invoked
+     * @param parentBuilderObject the parent build object on which to invoke the
+     *                            method
+     * @param ydtExtendedContext  application context
+     * @param isEnum              flag to check whether type is enum or derived
      * @throws InvocationTargetException if failed to invoke method
      * @throws IllegalAccessException    if member cannot be accessed
      * @throws NoSuchMethodException     if the required method is not found
@@ -201,6 +267,10 @@
         Method childMethod = null;
 
         YangSchemaNode yangJavaModule = ydtExtendedContext.getYangSchemaNode();
+        while (yangJavaModule.getReferredSchema() != null) {
+            yangJavaModule = yangJavaModule.getReferredSchema();
+        }
+
         String qualifiedClassName = yangJavaModule.getJavaPackage() + PERIOD +
                 getCapitalCase(yangJavaModule.getJavaClassNameOrBuiltInType());
         ClassLoader classLoader = getClassLoader(null, qualifiedClassName,
@@ -210,8 +280,8 @@
         } catch (ClassNotFoundException e) {
             log.error(L_FAIL_TO_LOAD_CLASS, qualifiedClassName);
         }
-        if (!isEnum) {
 
+        if (!isEnum) {
             if (childSetClass != null) {
                 childConstructor = childSetClass.getDeclaredConstructor();
             }
@@ -219,6 +289,7 @@
             if (childConstructor != null) {
                 childConstructor.setAccessible(true);
             }
+
             try {
                 if (childConstructor != null) {
                     childObject = childConstructor.newInstance();
@@ -234,8 +305,59 @@
             if (childSetClass != null) {
                 childMethod = childSetClass.getDeclaredMethod(OF, String.class);
             }
-            //leafValue = JavaIdentifierSyntax.getEnumJavaAttribute(leafValue);
-            //leafValue = leafValue.toUpperCase();
+        }
+        if (childMethod != null) {
+            childValue = childMethod.invoke(childObject, leafValue);
+        }
+
+        parentSetterMethod.invoke(parentBuilderObject, childValue);
+    }
+
+    /**
+     * To set data into parent setter method from string value for bits type.
+     *
+     * @param leafValue           value to be set in method
+     * @param parentSetterMethod  the parent setter method to be invoked
+     * @param parentBuilderObject the parent build object on which to invoke the
+     *                            method
+     * @param ydtExtendedContext  application context
+     * @throws InvocationTargetException if failed to invoke method
+     * @throws IllegalAccessException    if member cannot be accessed
+     * @throws NoSuchMethodException     if the required method is not found
+     */
+    private static void parseBitSetTypeInfo(YdtExtendedContext ydtExtendedContext,
+                                            Method parentSetterMethod,
+                                            Object parentBuilderObject,
+                                            String leafValue)
+            throws InvocationTargetException, IllegalAccessException,
+            NoSuchMethodException {
+        Class<?> childSetClass = null;
+        Object childValue = null;
+        Object childObject = null;
+        Method childMethod = null;
+
+        YangSchemaNode schemaNode = ydtExtendedContext.getYangSchemaNode();
+        while (schemaNode.getReferredSchema() != null) {
+            schemaNode = schemaNode.getReferredSchema();
+        }
+
+        YangSchemaNode parentSchema = ((YdtExtendedContext) ydtExtendedContext
+                .getParent()).getYangSchemaNode();
+        String qualifiedClassName = parentSchema.getJavaPackage() + PERIOD +
+                parentSchema.getJavaAttributeName().toLowerCase() +
+                PERIOD + getCapitalCase(schemaNode.getJavaAttributeName());
+
+        ClassLoader classLoader = getClassLoader(null, qualifiedClassName,
+                                                 ydtExtendedContext, null);
+
+        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);
@@ -262,12 +384,42 @@
                                              String leafValue)
             throws InvocationTargetException, IllegalAccessException,
             NoSuchMethodException {
+
         YangSchemaNode schemaNode = ydtExtendedContext.getYangSchemaNode();
-        YangLeafRef leafRef = (YangLeafRef) ((YangLeaf) schemaNode)
-                .getDataType().getDataTypeExtendedInfo();
-        YobUtils.setDataFromStringValue(leafRef.getEffectiveDataType(),
-                                        leafValue, parentSetterMethod,
-                                        parentBuilderObject, ydtExtendedContext);
+        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,
+                                            parentBuilderObject,
+                                            ydtExtendedContext);
+        } else {
+            YobUtils.setDataFromStringValue(type.getDataType(),
+                                            leafValue, parentSetterMethod,
+                                            parentBuilderObject,
+                                            ydtExtendedContext);
+        }
     }
 
     /**
@@ -278,12 +430,12 @@
      * @param curNode            YDT context
      * @param rootNode           application root node
      * @return current class loader
-     * @throws YobException if the YDT is an invalid tree
      */
     static ClassLoader getClassLoader(YangSchemaRegistry registry,
                                       String qualifiedClassName,
                                       YdtExtendedContext curNode,
                                       YdtExtendedContext rootNode) {
+
         if (rootNode != null && curNode == rootNode) {
             YangSchemaNode curSchemaNode = curNode.getYangSchemaNode();
             while (!(curSchemaNode instanceof RpcNotificationContainer)) {
@@ -292,21 +444,16 @@
                     throw new YobException(E_INVALID_DATA_TREE);
                 }
                 curSchemaNode = curNode.getYangSchemaNode();
-
             }
 
-            Class<?> regClass = registry.getRegisteredClass(curSchemaNode
-            );
+            Class<?> regClass = registry.getRegisteredClass(curSchemaNode);
             return regClass.getClassLoader();
-
         }
 
-        YdtExtendedContext parent =
-                (YdtExtendedContext) curNode.getParent();
-        YobWorkBench parentBuilderContainer =
-                (YobWorkBench) parent.getAppInfo(YOB);
-        Object parentObj =
-                parentBuilderContainer.getParentBuilder(curNode, registry);
+        YdtExtendedContext parent = (YdtExtendedContext) curNode.getParent();
+        YobWorkBench parentBuilderContainer = (YobWorkBench) parent.getAppInfo(YOB);
+        Object parentObj = parentBuilderContainer.getParentBuilder(curNode,
+                                                                   registry);
         return parentObj.getClass().getClassLoader();
     }
 
@@ -318,24 +465,58 @@
      * @param registry  schema registry
      * @return class loader to be used for the switched context schema node
      */
-    static ClassLoader getTargetClassLoader(
-            ClassLoader curLoader,
-            YangSchemaNodeContextInfo context,
-            YangSchemaRegistry registry) {
+    static ClassLoader getTargetClassLoader(ClassLoader curLoader,
+                                            YangSchemaNodeContextInfo context,
+                                            YangSchemaRegistry registry) {
         YangSchemaNode augmentSchemaNode = context.getContextSwitchedNode();
         if (augmentSchemaNode.getYangSchemaNodeType() == YANG_AUGMENT_NODE) {
-            YangSchemaNode moduleNode =
-                    ((YangNode) augmentSchemaNode).getParent();
+            YangSchemaNode moduleNode = ((YangNode) augmentSchemaNode).getParent();
 
-            Class<?> moduleClass = registry.getRegisteredClass(
-                    moduleNode);
+            Class<?> moduleClass = registry.getRegisteredClass(moduleNode);
+            if (moduleClass == null) {
+                throw new YobException(E_FAIL_TO_LOAD_CLASS + moduleNode
+                        .getJavaClassNameOrBuiltInType());
+            }
             return moduleClass.getClassLoader();
         }
-
         return curLoader;
     }
 
     /**
+     * Returns the schema node's module interface.
+     *
+     * @param schemaNode     YANG schema node
+     * @param schemaRegistry YANG schema registry
+     * @return schema node's module interface
+     */
+    public static Class<?> getModuleInterface(YangSchemaNode schemaNode,
+                                              YangSchemaRegistry schemaRegistry) {
+
+        YangNode yangNode = (YangNode) schemaNode;
+        while (yangNode.getReferredSchema() != null) {
+            yangNode = (YangNode) yangNode.getReferredSchema();
+        }
+
+        while (yangNode.getParent() != null) {
+            yangNode = yangNode.getParent();
+        }
+
+        String qualName = getQualifiedinterface(yangNode);
+        Class<?> regClass = schemaRegistry.getRegisteredClass(yangNode);
+        if (regClass == null) {
+            throw new YobException(E_FAIL_TO_LOAD_CLASS + qualName);
+        }
+
+        try {
+            return regClass.getClassLoader().loadClass(qualName);
+        } catch (ClassNotFoundException e) {
+            log.error(L_FAIL_TO_LOAD_CLASS, qualName);
+        }
+
+        return null;
+    }
+
+    /**
      * Returns the qualified default / op param class.
      *
      * @param schemaNode schema node of the required class
@@ -368,26 +549,86 @@
     }
 
     /**
-     * Returns BitSet value from string.
+     * Returns the capital cased first letter of the given string.
      *
-     * @param yangBits  schema node of the YANG bits
-     * @param leafValue leaf value from RESTCONF
-     * @return BitSet value
+     * @param name string to be capital cased
+     * @return capital cased string
      */
-    private static BitSet getBitSetValueFromString(YangBits yangBits,
-                                                   String leafValue) {
-        String[] bitNames = leafValue.trim().split(SPACE);
-        Map<String, YangBit> bitNameMap = yangBits.getBitNameMap();
-        BitSet bitDataSet = new BitSet();
-        YangBit bit;
-        for (String bitName : bitNames) {
-            bit = bitNameMap.get(bitName);
-            if (bit == null) {
-                throw new YobException("Unable to find corresponding bit" +
-                                               " position for bit : " + bitName);
-            }
-            bitDataSet.set(bit.getPosition());
+    public static String getCapitalCase(String name) {
+        // TODO: It will be removed if common util is committed.
+        return name.substring(0, 1).toUpperCase() +
+                name.substring(1);
+    }
+
+    /**
+     * To set data into parent setter method from string value for identity ref.
+     *
+     * @param leafValue           leaf value to be set
+     * @param parentSetterMethod  the parent setter method to be invoked
+     * @param parentBuilderObject the parent build object on which to invoke
+     *                            the method
+     * @param ydtExtendedContext  application context
+     * @throws InvocationTargetException if method could not be invoked
+     * @throws IllegalAccessException    if method could not be accessed
+     * @throws NoSuchMethodException     if method does not exist
+     */
+    private static void parseIdentityRefInfo(YdtExtendedContext
+                                                     ydtExtendedContext,
+                                             Method parentSetterMethod,
+                                             Object parentBuilderObject,
+                                             String leafValue)
+            throws InvocationTargetException, IllegalAccessException,
+            NoSuchMethodException {
+        Class<?> childSetClass = null;
+        Object childValue = null;
+        Method childMethod = null;
+
+        YangSchemaNode yangJavaModule = ydtExtendedContext.getYangSchemaNode();
+        while (yangJavaModule.getReferredSchema() != null) {
+            yangJavaModule = yangJavaModule.getReferredSchema();
         }
-        return bitDataSet;
+
+        String qualifiedClassName = null;
+        YangType type;
+        if (yangJavaModule instanceof YangLeaf) {
+            type = ((YangLeaf) yangJavaModule).getDataType();
+        } else {
+            type = ((YangLeafList) yangJavaModule).getDataType();
+        }
+
+        if (type.getDataType() == YangDataTypes.LEAFREF && yangJavaModule
+                .getJavaPackage().equals(YobConstants.JAVA_LANG)) {
+            YangLeafRef leafref = ((YangLeafRef) type.getDataTypeExtendedInfo());
+            YangType effectiveType = leafref.getEffectiveDataType();
+            if (effectiveType.getDataType() == YangDataTypes.IDENTITYREF) {
+                YangIdentityRef identityref = ((YangIdentityRef) effectiveType
+                        .getDataTypeExtendedInfo());
+                YangIdentity identity = identityref.getReferredIdentity();
+                qualifiedClassName = identity.getJavaPackage() + PERIOD +
+                        getCapitalCase(identity.getJavaClassNameOrBuiltInType());
+            }
+        } else {
+            qualifiedClassName = yangJavaModule.getJavaPackage() + PERIOD +
+                    getCapitalCase(yangJavaModule.getJavaClassNameOrBuiltInType());
+        }
+
+        ClassLoader classLoader = getClassLoader(null, qualifiedClassName,
+                                                 ydtExtendedContext, null);
+        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(parentBuilderObject, childValue);
     }
 }
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobWorkBench.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobWorkBench.java
index 29031ff..37d22ad 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobWorkBench.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/yob/YobWorkBench.java
@@ -23,6 +23,7 @@
 import org.onosproject.yms.app.ydt.YdtExtendedContext;
 import org.onosproject.yms.app.yob.exception.YobException;
 import org.onosproject.yms.app.ysr.YangSchemaRegistry;
+import org.onosproject.yms.ydt.YdtContextOperationType;
 import org.onosproject.yms.ydt.YdtType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,7 +37,6 @@
 
 import static org.onosproject.yangutils.datamodel.YangSchemaNodeType.YANG_AUGMENT_NODE;
 import static org.onosproject.yangutils.datamodel.YangSchemaNodeType.YANG_CHOICE_NODE;
-import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 import static org.onosproject.yms.app.ydt.AppType.YOB;
 import static org.onosproject.yms.app.yob.YobConstants.ADD_AUGMENT_METHOD;
 import static org.onosproject.yms.app.yob.YobConstants.ADD_TO;
@@ -47,15 +47,18 @@
 import static org.onosproject.yms.app.yob.YobConstants.E_FAIL_TO_INVOKE_METHOD;
 import static org.onosproject.yms.app.yob.YobConstants.E_FAIL_TO_LOAD_CLASS;
 import static org.onosproject.yms.app.yob.YobConstants.E_HAS_NO_CHILD;
-import static org.onosproject.yms.app.yob.YobConstants.E_NO_HANDLE_FOR_YDT;
 import static org.onosproject.yms.app.yob.YobConstants.E_SET_OP_TYPE_FAIL;
 import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_BUILD;
 import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_GET_FIELD;
 import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_GET_METHOD;
 import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_INVOKE_METHOD;
-import static org.onosproject.yms.app.yob.YobConstants.OPERATION_TYPE;
+import static org.onosproject.yms.app.yob.YobConstants.ONOS_YANG_OP_TYPE;
 import static org.onosproject.yms.app.yob.YobConstants.OP_TYPE;
 import static org.onosproject.yms.app.yob.YobConstants.VALUE_OF;
+import static org.onosproject.yms.app.yob.YobConstants.YANG;
+import static org.onosproject.yms.app.yob.YobUtils.getCapitalCase;
+import static org.onosproject.yms.app.yob.YobUtils.getModuleInterface;
+import static org.onosproject.yms.app.yob.YobUtils.getQualifiedDefaultClass;
 import static org.onosproject.yms.ydt.YdtType.MULTI_INSTANCE_NODE;
 import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_NODE;
 
@@ -113,228 +116,12 @@
     }
 
     /**
-     * Returns the builder object or the built object corresponding to the
-     * current schema node.
-     *
-     * @return builder or built object
-     */
-    YobBuilderOrBuiltObject getBuilderOrBuiltObject() {
-        return builderOrBuiltObject;
-    }
-
-    /**
-     * Returns the parent builder object in which the child object can be set.
-     *
-     * @param node     child YDT node
-     * @param registry schema registry
-     * @return parent builder object
-     * @throws YobException if schema node does not have child
-     */
-    Object getParentBuilder(YdtExtendedContext node,
-                            YangSchemaRegistry registry) {
-
-        // Descendant schema node for whom the builder is required.
-        YangSchemaNodeIdentifier targetNode =
-                node.getYangSchemaNode().getYangSchemaNodeIdentifier();
-
-        //Current builder container
-        YobWorkBench curWorkBench = this;
-
-        YangSchemaNode nonSchemaHolder;
-        do {
-
-            //Current Schema node context
-            YangSchemaNodeContextInfo schemaContext;
-            try {
-                //Find the new schema context node.
-                schemaContext = curWorkBench.yangSchemaNode.getChildSchema(
-                        targetNode);
-
-            } catch (DataModelException e) {
-                throw new YobException(yangSchemaNode.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, registry);
-
-                    curWorkBench.attributeMap.put(nonSchemaIdentifier,
-                                                  newWorkBench);
-                    curWorkBench = newWorkBench;
-                } else {
-                    curWorkBench = childWorkBench;
-                }
-            }
-
-        } while (nonSchemaHolder != null);
-
-        return curWorkBench.builderOrBuiltObject.getBuilderObject();
-    }
-
-    /**
-     * Set the operation type attribute and build the object from the builder
-     * object, by invoking the build method.
-     *
-     * @param ydtNode data tree node
-     * @throws YobException if member method is not found or failed to build
-     */
-    void buildObject(YdtExtendedContext ydtNode) {
-
-        buildNonSchemaAttributes(ydtNode);
-
-        Object builderObject = builderOrBuiltObject.getBuilderObject();
-        Class<?> defaultBuilderClass = builderOrBuiltObject.yangBuilderClass;
-
-        //set the operation type
-        setOperationType(ydtNode);
-
-        // Invoking the build method to get built object from build method.
-        try {
-            Method method = defaultBuilderClass.getDeclaredMethod(BUILD);
-            if (method == null) {
-                log.error(L_FAIL_TO_GET_METHOD, defaultBuilderClass.getName());
-                throw new YobException(E_FAIL_TO_GET_METHOD +
-                                               defaultBuilderClass.getName());
-            }
-            Object builtObject = method.invoke(builderObject);
-            // The built object will be maintained in ydt context and same will
-            // be used while setting into parent method.
-            builderOrBuiltObject.setBuiltObject(builtObject);
-
-        } catch (NoSuchMethodException | InvocationTargetException |
-                IllegalAccessException e) {
-            log.error(L_FAIL_TO_BUILD, defaultBuilderClass.getName());
-            throw new YobException(E_FAIL_TO_BUILD +
-                                           defaultBuilderClass.getName());
-        }
-    }
-
-    /**
-     * Set the operation type in the built object from the YDT node.
-     * <p>
-     * It needs to be invoked only for the workbench corresponding to the
-     * schema YDT nodes, non schema node without the YDT node should not
-     * invoke this, as it is not applicable to it.
-     *
-     * @param ydtNode schema data tree node
-     * @throws YobException if fail to set the operation type
-     */
-    private void setOperationType(YdtExtendedContext ydtNode) {
-
-        Object builderObject = builderOrBuiltObject.getBuilderObject();
-        Class<?> defaultBuilderClass = builderOrBuiltObject.yangBuilderClass;
-
-        // Setting the value into YANG node operation type from ydtContext
-        // operation type.
-        try {
-            Class<?> interfaceClass = builderOrBuiltObject.yangDefaultClass;
-            Object operationType;
-            Class<?>[] innerClasses = interfaceClass.getClasses();
-            for (Class<?> innerEnumClass : innerClasses) {
-                if (innerEnumClass.getSimpleName().equals(OP_TYPE)) {
-                    Method valueOfMethod = innerEnumClass
-                            .getDeclaredMethod(VALUE_OF, String.class);
-                    if (ydtNode.getYdtContextOperationType() != null) {
-                        operationType = valueOfMethod.invoke(null, ydtNode
-                                .getYdtContextOperationType().toString());
-                        Field operationTypeField = defaultBuilderClass
-                                .getDeclaredField(OPERATION_TYPE);
-                        operationTypeField.setAccessible(true);
-                        operationTypeField.set(builderObject, operationType);
-                        break;
-                    }
-                }
-            }
-        } catch (NoSuchFieldException | NoSuchMethodException |
-                InvocationTargetException | IllegalAccessException e) {
-            log.error(E_SET_OP_TYPE_FAIL);
-            throw new YobException(E_SET_OP_TYPE_FAIL);
-        }
-    }
-
-    /**
-     * build the non schema objects and maintain it in the contained schema
-     * node.
-     *
-     * @param ydtNode contained schema node
-     */
-    private void buildNonSchemaAttributes(YdtExtendedContext ydtNode) {
-        for (Map.Entry<YangSchemaNodeIdentifier, YobWorkBench> entry :
-                attributeMap.entrySet()) {
-            YobWorkBench childWorkBench = entry.getValue();
-            childWorkBench.buildObject(ydtNode);
-
-            if (childWorkBench.yangSchemaNode.getYangSchemaNodeType() ==
-                    YANG_AUGMENT_NODE) {
-                addInAugmentation(builderOrBuiltObject.getBuilderObject(),
-                                  childWorkBench.setterInParent,
-                                  childWorkBench.getBuilderOrBuiltObject()
-                                          .getBuiltObject());
-                return;
-            }
-
-            setObjectInBuilder(
-                    builderOrBuiltObject.getBuilderObject(),
-                    childWorkBench.setterInParent,
-                    SINGLE_INSTANCE_NODE,
-                    childWorkBench.getBuilderOrBuiltObject().getBuiltObject());
-        }
-    }
-
-
-    //TODO add objectIn Augmentation
-
-    /**
-     * Sets the YANG built object in corresponding parent class method.
-     *
-     * @param ydtNode ydtExtendedContext is used to get application
-     *                related information maintained in YDT
-     * @throws YobException if there is no parent's YOB handler
-     */
-    void setObjectInParent(YdtExtendedContext ydtNode) {
-        YdtExtendedContext parentNode =
-                (YdtExtendedContext) ydtNode.getParent();
-        if (parentNode == null || parentNode.getAppInfo(YOB) == null) {
-            throw new YobException(E_NO_HANDLE_FOR_YDT);
-        }
-        YobWorkBench parentWorkBench =
-                (YobWorkBench) parentNode.getAppInfo(YOB);
-        Object parentBuilderObject =
-                parentWorkBench.builderOrBuiltObject.getBuilderObject();
-        YdtType nodeType = ydtNode.getYdtType();
-        Object objectToSetInParent = builderOrBuiltObject.getBuiltObject();
-
-        // set the object in the parent builder
-        setObjectInBuilder(parentBuilderObject, setterInParent, nodeType,
-                           objectToSetInParent);
-
-        ydtNode.addAppInfo(YOB, this);
-    }
-
-    /**
      * Set the attribute in a builder object.
      *
-     * @param builder   builder object in which the attribute needs to be
-     *                  set
+     * @param builder   builder object in which the attribute needs to be set
      * @param setter    setter method in parent
      * @param nodeType  type of node to set
      * @param attribute attribute to set in the builder
-     * @throws YobException if member is not found or failed to invoke the
-     *                      method
      */
     private static void setObjectInBuilder(Object builder, String setter,
                                            YdtType nodeType, Object attribute) {
@@ -408,7 +195,6 @@
 
     }
 
-
     /**
      * Creates a new builder container object corresponding to a context
      * switch schema node.
@@ -420,7 +206,6 @@
      * @param registry     schema registry
      * @return new builder container object corresponding to a context
      * switch schema node
-     * @throws YobException if expected child is not found in schema
      */
     private static YobWorkBench getNewChildWorkBench(
             YangSchemaNodeContextInfo childContext,
@@ -430,7 +215,7 @@
         YangSchemaNode ctxSwitchedNode = childContext.getContextSwitchedNode();
         String name;
 
-         /*This is the first child trying to set its object in the
+         /* This is the first child trying to set its object in the
          current context. */
         String setterInParent = ctxSwitchedNode.getJavaAttributeName();
 
@@ -440,7 +225,7 @@
             try {
                 childContext = ctxSwitchedNode.getChildSchema(targetNode);
                 ctxSwitchedNode = childContext.getContextSwitchedNode();
-                name = YobUtils.getQualifiedDefaultClass(
+                name = getQualifiedDefaultClass(
                         childContext.getContextSwitchedNode());
 
             } catch (DataModelException e) {
@@ -450,10 +235,10 @@
             }
         } else if (ctxSwitchedNode.getYangSchemaNodeType() ==
                 YANG_AUGMENT_NODE) {
-            name = YobUtils.getQualifiedDefaultClass(ctxSwitchedNode);
+            name = getQualifiedDefaultClass(ctxSwitchedNode);
             setterInParent = YobUtils.getQualifiedinterface(ctxSwitchedNode);
         } else {
-            name = YobUtils.getQualifiedDefaultClass(childContext.getSchemaNode());
+            name = getQualifiedDefaultClass(childContext.getSchemaNode());
         }
 
         ClassLoader newClassesLoader = YobUtils.getTargetClassLoader(
@@ -463,4 +248,216 @@
                                 setterInParent);
     }
 
+    /**
+     * Returns the builder object or the built object corresponding to the
+     * current schema node.
+     *
+     * @return builder or built object
+     */
+    YobBuilderOrBuiltObject getBuilderOrBuiltObject() {
+        return builderOrBuiltObject;
+    }
+
+    /**
+     * Returns the parent builder object in which the child object can be set.
+     *
+     * @param node     child YDT node
+     * @param registry schema registry
+     * @return parent builder object
+     */
+    Object getParentBuilder(YdtExtendedContext node,
+                            YangSchemaRegistry registry) {
+
+        // Descendant schema node for whom the builder is required.
+        YangSchemaNodeIdentifier targetNode =
+                node.getYangSchemaNode().getYangSchemaNodeIdentifier();
+
+        //Current builder container
+        YobWorkBench curWorkBench = this;
+
+        YangSchemaNode nonSchemaHolder;
+        do {
+
+            //Current Schema node context
+            YangSchemaNodeContextInfo schemaContext;
+            try {
+                //Find the new schema context node.
+                schemaContext = curWorkBench.yangSchemaNode
+                        .getChildSchema(targetNode);
+
+            } catch (DataModelException e) {
+                throw new YobException(yangSchemaNode.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, registry);
+
+                    curWorkBench.attributeMap.put(nonSchemaIdentifier,
+                                                  newWorkBench);
+                    curWorkBench = newWorkBench;
+                } else {
+                    curWorkBench = childWorkBench;
+                }
+            }
+
+        } while (nonSchemaHolder != null);
+
+        return curWorkBench.builderOrBuiltObject.getBuilderObject();
+    }
+
+    /**
+     * Set the operation type attribute and build the object from the builder
+     * object, by invoking the build method.
+     *
+     * @param operationType  data tree node
+     * @param schemaRegistry YANG schema registry
+     */
+    void buildObject(YdtContextOperationType operationType,
+                     YangSchemaRegistry schemaRegistry) {
+
+        buildNonSchemaAttributes(operationType, schemaRegistry);
+
+        Object builderObject = builderOrBuiltObject.getBuilderObject();
+        Class<?> defaultBuilderClass = builderOrBuiltObject.yangBuilderClass;
+
+        //set the operation type
+        setOperationType(operationType, schemaRegistry);
+
+        // Invoking the build method to get built object from build method.
+        try {
+            Method method = defaultBuilderClass.getDeclaredMethod(BUILD);
+            if (method == null) {
+                log.error(L_FAIL_TO_GET_METHOD, defaultBuilderClass.getName());
+                throw new YobException(E_FAIL_TO_GET_METHOD +
+                                               defaultBuilderClass.getName());
+            }
+            Object builtObject = method.invoke(builderObject);
+            // The built object will be maintained in ydt context and same will
+            // be used while setting into parent method.
+            builderOrBuiltObject.setBuiltObject(builtObject);
+
+        } catch (NoSuchMethodException | InvocationTargetException |
+                IllegalAccessException e) {
+            log.error(L_FAIL_TO_BUILD, defaultBuilderClass.getName());
+            throw new YobException(E_FAIL_TO_BUILD +
+                                           defaultBuilderClass.getName());
+        }
+    }
+
+    /**
+     * Set the operation type in the built object from the YDT node.
+     * <p>
+     * It needs to be invoked only for the workbench corresponding to the
+     * schema YDT nodes, non schema node without the YDT node should not
+     * invoke this, as it is not applicable to it.
+     *
+     * @param ydtoperation   schema data tree node
+     * @param schemaRegistry YANG schema registry
+     */
+    private void setOperationType(YdtContextOperationType ydtoperation,
+                                  YangSchemaRegistry schemaRegistry) {
+
+        if (ydtoperation == null) {
+            return;
+        }
+
+        Object builderObject = builderOrBuiltObject.getBuilderObject();
+        Class<?> defaultBuilderClass = builderOrBuiltObject.yangBuilderClass;
+        Class<?>[] intfClass = builderOrBuiltObject.yangDefaultClass
+                .getInterfaces();
+        String setterName = YANG + intfClass[0].getSimpleName() + OP_TYPE;
+
+        // Setting the value into YANG node operation type from ydtContext
+        // operation type.
+        try {
+            Class<?> interfaceClass;
+            interfaceClass = getModuleInterface(yangSchemaNode,
+                                                schemaRegistry);
+            Object operationType;
+            Class<?>[] innerClasses = interfaceClass.getClasses();
+            for (Class<?> innerEnumClass : innerClasses) {
+                if (innerEnumClass.getSimpleName().equals(ONOS_YANG_OP_TYPE)) {
+                    Method valueOfMethod = innerEnumClass
+                            .getDeclaredMethod(VALUE_OF, String.class);
+                    operationType = valueOfMethod.invoke(null, ydtoperation.
+                            toString());
+                    Field operationTypeField = defaultBuilderClass
+                            .getDeclaredField(setterName);
+                    operationTypeField.setAccessible(true);
+                    operationTypeField.set(builderObject, operationType);
+                    break;
+                }
+            }
+        } catch (NoSuchMethodException |
+                InvocationTargetException | IllegalAccessException |
+                IllegalArgumentException e) {
+            log.error(E_SET_OP_TYPE_FAIL);
+            throw new YobException(E_SET_OP_TYPE_FAIL);
+        } catch (NoSuchFieldException e) {
+            log.error(E_SET_OP_TYPE_FAIL);
+        }
+    }
+
+    /**
+     * build the non schema objects and maintain it in the contained schema
+     * node.
+     *
+     * @param operationType  contained schema node
+     * @param schemaRegistry YANG schema registry
+     */
+    private void buildNonSchemaAttributes(YdtContextOperationType operationType,
+                                          YangSchemaRegistry schemaRegistry) {
+        for (Map.Entry<YangSchemaNodeIdentifier, YobWorkBench> entry :
+                attributeMap.entrySet()) {
+            YobWorkBench childWorkBench = entry.getValue();
+            childWorkBench.buildObject(operationType, schemaRegistry);
+
+            if (childWorkBench.yangSchemaNode.getYangSchemaNodeType() ==
+                    YANG_AUGMENT_NODE) {
+                addInAugmentation(builderOrBuiltObject.getBuilderObject(),
+                                  childWorkBench.setterInParent,
+                                  childWorkBench.getBuilderOrBuiltObject()
+                                          .getBuiltObject());
+                continue;
+            }
+
+            setObjectInBuilder(
+                    builderOrBuiltObject.getBuilderObject(),
+                    childWorkBench.setterInParent,
+                    SINGLE_INSTANCE_NODE,
+                    childWorkBench.getBuilderOrBuiltObject().getBuiltObject());
+        }
+    }
+
+    /**
+     * Sets the YANG built object in corresponding parent class method.
+     *
+     * @param childnode      ydtExtendedContext is used to get application
+     *                       related information maintained in YDT
+     * @param schemaRegistry YANG schema registry
+     */
+    public void setObject(YdtExtendedContext childnode,
+                          YangSchemaRegistry schemaRegistry) {
+        Object builder = getParentBuilder(childnode, schemaRegistry);
+        YobWorkBench childWorkBench = (YobWorkBench) childnode.getAppInfo(YOB);
+
+        setObjectInBuilder(builder, childWorkBench.setterInParent,
+                           childnode.getYdtType(), childWorkBench
+                                   .builderOrBuiltObject.getBuiltObject());
+    }
 }
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java
new file mode 100644
index 0000000..22f4fd9
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/MockYmsManager.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yab;
+
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ysr.TestYangSchemaNodeProvider;
+import org.onosproject.yms.app.ysr.YangSchemaRegistry;
+import org.onosproject.yms.ych.YangCodecHandler;
+import org.onosproject.yms.ych.YangDataTreeCodec;
+import org.onosproject.yms.ych.YangProtocolEncodingFormat;
+import org.onosproject.yms.ydt.YdtBuilder;
+import org.onosproject.yms.ydt.YdtResponse;
+import org.onosproject.yms.ydt.YdtWalker;
+import org.onosproject.yms.ydt.YmsOperationType;
+import org.onosproject.yms.ymsm.YmsService;
+import org.onosproject.yms.ynh.YangNotificationService;
+import org.onosproject.yms.ysr.YangModuleIdentifier;
+import org.onosproject.yms.ysr.YangModuleLibrary;
+
+import java.util.List;
+
+/**
+ * Represents implementation of YANG application management system manager.
+ */
+public class MockYmsManager
+        implements YmsService {
+
+    YangSchemaRegistry schemaRegistry;
+    TestYangSchemaNodeProvider testYangSchemaNodeProvider =
+            new TestYangSchemaNodeProvider();
+
+    @Override
+    public YdtBuilder getYdtBuilder(String logicalRootName,
+                                    String rootNamespace,
+                                    YmsOperationType operationType) {
+        testYangSchemaNodeProvider.processSchemaRegistry(new TestManager());
+        schemaRegistry = testYangSchemaNodeProvider.getDefaultYangSchemaRegistry();
+        return new YangRequestWorkBench(logicalRootName, rootNamespace,
+                                        operationType, schemaRegistry, false);
+    }
+
+    @Override
+    public YdtBuilder getYdtBuilder(String logicalRootName,
+                                    String rootNamespace,
+                                    YmsOperationType operationType,
+                                    Object schemaRegistryForYdt) {
+        return null;
+    }
+
+    @Override
+    public YdtWalker getYdtWalker() {
+        return null;
+    }
+
+    @Override
+    public YdtResponse executeOperation(YdtBuilder operationRequest) {
+        YangApplicationBroker requestBroker =
+                new YangApplicationBroker(schemaRegistry);
+        switch (operationRequest.getYmsOperationType()) {
+            case EDIT_CONFIG_REQUEST:
+                try {
+                    return requestBroker.processEdit(operationRequest);
+                } catch (CloneNotSupportedException e) {
+                }
+                break;
+            case QUERY_CONFIG_REQUEST:
+            case QUERY_REQUEST:
+                return requestBroker.processQuery(operationRequest);
+            case RPC_REQUEST:
+                return requestBroker.processOperation(operationRequest);
+            default:
+        }
+        return null;
+    }
+
+    @Override
+    public YangNotificationService getYangNotificationService() {
+        return null;
+    }
+
+    @Override
+    public void registerService(Object appManager, Class<?> yangService,
+                                List<String> supportedFeatureList) {
+    }
+
+    @Override
+    public void unRegisterService(Object appManager, Class<?> yangService) {
+
+    }
+
+    @Override
+    public YangModuleLibrary getYangModuleLibrary() {
+        return null;
+    }
+
+    @Override
+    public String getYangFile(YangModuleIdentifier moduleIdentifier) {
+        return null;
+    }
+
+    @Override
+    public void registerDefaultCodec(YangDataTreeCodec defaultCodec,
+                                     YangProtocolEncodingFormat dataFormat) {
+    }
+
+    @Override
+    public YangCodecHandler getYangCodecHandler() {
+        return null;
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/TestManager.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/TestManager.java
new file mode 100644
index 0000000..c07a18f
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/TestManager.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yab;
+
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.Test;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.TestOpParam;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.TestService;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.Cont1;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.DefaultCont1;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.rockthehouse.DefaultRockTheHouseOutput;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.rockthehouse.RockTheHouseInput;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.rockthehouse.RockTheHouseOutput;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.rockthehouse1.RockTheHouse1Input;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.rockthehouse2.DefaultRockTheHouse2Output;
+import org.onosproject.yang.gen.v1.ydt.test.rev20160524.test.rockthehouse2.RockTheHouse2Output;
+
+/**
+ * Implementation of the application management service.
+ */
+public class TestManager implements TestService {
+
+    Test response;
+
+    @Override
+    public Test getTest(TestOpParam test) {
+        Cont1 cont = new DefaultCont1.Cont1Builder().leaf4("4").build();
+        Test response = new TestOpParam.TestBuilder().cont1(cont).build();
+        return response;
+    }
+
+    @Override
+    public void setTest(TestOpParam test) {
+        response = test;
+    }
+
+    @Override
+    public Test getAugmentedTestCont4(TestOpParam test) {
+        Cont1 cont = new DefaultCont1.Cont1Builder().leaf4("4").build();
+        Test response = new TestOpParam.TestBuilder().cont1(cont).build();
+        return response;
+    }
+
+    @Override
+    public void setAugmentedTestCont4(TestOpParam augmentedTestCont4) {
+        response = augmentedTestCont4;
+    }
+
+    @Override
+    public RockTheHouseOutput rockTheHouse(RockTheHouseInput inputVar) {
+        return DefaultRockTheHouseOutput.builder().hello("hello").build();
+    }
+
+
+    @Override
+    public void rockTheHouse1(RockTheHouse1Input inputVar) {
+        // TODO : to be implemented
+    }
+
+    @Override
+    public RockTheHouse2Output rockTheHouse2() {
+        return DefaultRockTheHouse2Output
+                .builder().leaf14("14").build();
+    }
+
+    @Override
+    public void rockTheHouse3() {
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/YangApplicationBrokerTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/YangApplicationBrokerTest.java
new file mode 100644
index 0000000..33a9a56
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yab/YangApplicationBrokerTest.java
@@ -0,0 +1,1080 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yab;
+
+import org.junit.Test;
+import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtAppContext;
+import org.onosproject.yms.app.ydt.YdtAppNodeOperationType;
+import org.onosproject.yms.app.ydt.YdtNode;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.onosproject.yms.ydt.YdtContextOperationType.DELETE;
+import static org.onosproject.yms.ydt.YdtContextOperationType.MERGE;
+import static org.onosproject.yms.ydt.YmsOperationType.EDIT_CONFIG_REQUEST;
+import static org.onosproject.yms.ydt.YmsOperationType.QUERY_CONFIG_REQUEST;
+import static org.onosproject.yms.ydt.YmsOperationType.RPC_REQUEST;
+
+/**
+ * Unit test case for YANG application broker.
+ */
+public class YangApplicationBrokerTest {
+
+    MockYmsManager ymsManager = new MockYmsManager();
+
+    /**
+     * Returns YANG data tree to check edit operation of container.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForEditOperationWithoutDelete() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test", MERGE);
+        defaultYdtBuilder.addChild("cont1", null, MERGE);
+        defaultYdtBuilder.addChild("cont2", null, MERGE);
+        defaultYdtBuilder.addChild("cont3", null, MERGE);
+        defaultYdtBuilder.addLeaf("leaf1", null, "1");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf4", null, "4");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("cont4", null, MERGE);
+        defaultYdtBuilder.addChild("cont5", null, MERGE);
+        defaultYdtBuilder.addLeaf("leaf9", null, "9");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf10", null, "10");
+        return defaultYdtBuilder;
+    }
+
+    private YangRequestWorkBench buildYdtForKeyLeavesInDeleteTree() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test", MERGE);
+        defaultYdtBuilder.addChild("list2", null, MERGE);
+        defaultYdtBuilder.addLeaf("leaf5", null, "5");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf6", null, "6");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf7", null, "7");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("cont7", null, DELETE);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check delete operation of container.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForEditOperationWithDelete() {
+        String rootName = "rootNode";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test", MERGE);
+        defaultYdtBuilder.addChild("cont1", null, MERGE);
+        defaultYdtBuilder.addChild("cont2", null, DELETE);
+        defaultYdtBuilder.addChild("cont3", null, DELETE);
+        defaultYdtBuilder.addLeaf("leaf1", null, "1");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf4", null, "4");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("cont4", null, DELETE);
+        defaultYdtBuilder.addChild("cont5", null, DELETE);
+        defaultYdtBuilder.addLeaf("leaf9", null, "9");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf10", null, "10");
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check edit operation of list.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForListEditOperationWithoutDelete() {
+        String rootName = "listWithoutDelete";
+        Set<String> valueSet = new LinkedHashSet<>();
+        valueSet.add("10");
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test", MERGE);
+        defaultYdtBuilder.addChild("cont1", null, MERGE);
+        defaultYdtBuilder.addChild("list1", null, MERGE);
+        defaultYdtBuilder.addLeaf("leaf2", null, "2");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf3", null, "3");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf4", null, "4");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("list2", null, MERGE);
+        defaultYdtBuilder.addLeaf("leaf5", null, "5");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf6", null, "6");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf7", null, "7");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaflist8", null, valueSet);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf10", null, "10");
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check delete operation of list.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForListEditOperationWithDelete() {
+        String rootName = "listWithDelete";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test", MERGE);
+        defaultYdtBuilder.addChild("cont1", null, MERGE);
+        defaultYdtBuilder.addChild("list1", null, DELETE);
+        defaultYdtBuilder.addLeaf("leaf2", null, "2");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf3", null, "3");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf4", null, "4");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("list2", null, DELETE);
+        defaultYdtBuilder.addLeaf("leaf5", null, "5");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf6", null, "6");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf10", null, "10");
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check query operation of container.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForQueryOperation() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                QUERY_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("cont1", null);
+        defaultYdtBuilder.addChild("cont2", null);
+        defaultYdtBuilder.addChild("cont3", null);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("cont4", null);
+        defaultYdtBuilder.addChild("cont5", null);
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check query operation of list.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForListQueryOperation() {
+        String rootName = "listQuery";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                QUERY_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("cont1", null);
+        defaultYdtBuilder.addChild("list1", null);
+        defaultYdtBuilder.addLeaf("leaf2", null, "2");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("list2", null);
+        defaultYdtBuilder.addLeaf("leaf5", null, "5");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf6", null, "6");
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check delete operation of a node.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtWithOneDeleteNode() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("cont1", null, MERGE);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("cont4", null, DELETE);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf10", null, "10");
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check delete operation of last node.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtWithDeleteNodeAsLastChild() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test", MERGE);
+        defaultYdtBuilder.addChild("cont1", null, MERGE);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("list2", null, MERGE);
+        defaultYdtBuilder.addLeaf("leaf5", null, "10");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf6", null, "10");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("cont4", null, DELETE);
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to with delete operation of all the nodes.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtWithAllDeleteNode() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test", DELETE);
+        defaultYdtBuilder.addChild("cont1", null, DELETE);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("list2", null, DELETE);
+        defaultYdtBuilder.addLeaf("leaf5", null, "10");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addLeaf("leaf6", null, "10");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("cont4", null, DELETE);
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check rpc operation with only input.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForRpcWithOnlyInput() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                RPC_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("rock-the-house1", null);
+        defaultYdtBuilder.addChild("input", null);
+        defaultYdtBuilder.addLeaf("leaf13", null, "5");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check rpc operation with only output.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForRpcWithOnlyOutput() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                RPC_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("rock-the-house2", null);
+        defaultYdtBuilder.addChild("output", null);
+        defaultYdtBuilder.addLeaf("leaf14", null, "14");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check rpc operation with both input and output.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForRpcWithBothInputOutput() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                RPC_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("rock-the-house", null);
+        defaultYdtBuilder.addChild("input", null);
+        defaultYdtBuilder.addLeaf("zip-code", null, "5");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.addChild("output", null);
+        defaultYdtBuilder.addLeaf("hello", null, "5");
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check rpc operation.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForRpc() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                RPC_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("rock-the-house3", null);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check query operation with multiple level of
+     * augment.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForQueryWithMultipleAugment() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                QUERY_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.traverseToParent();
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Returns YANG data tree to check delete operation with multiple level of
+     * augment.
+     *
+     * @return YANG data tree
+     */
+    private YangRequestWorkBench buildYdtForDeleteWithMultipleAugment() {
+        String rootName = "root";
+        YangRequestWorkBench defaultYdtBuilder =
+                (YangRequestWorkBench) ymsManager.getYdtBuilder(rootName, null,
+                                                                EDIT_CONFIG_REQUEST);
+        defaultYdtBuilder.addChild("test", "ydt.test");
+        defaultYdtBuilder.addChild("cont4", null, DELETE);
+        defaultYdtBuilder.traverseToParent();
+        defaultYdtBuilder.traverseToParent();
+        return defaultYdtBuilder;
+    }
+
+    /**
+     * Checks whether YANG data tree and delete tree is correct.
+     */
+    @Test
+    public void validateDeleteTreeOnlyOneNodeInDeleteList()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForEditOperationWithDelete();
+        YdtAppContext appContext =
+                defaultYdtBuilder.getAppRootNode().getFirstChild();
+        YdtContext ydtContext = appContext.getModuleContext();
+        List<YdtContext> deleteNodes = appContext.getDeleteNodes();
+
+        YdtContext cont1YdtContext;
+        YdtContext cont2YdtContext;
+        YdtContext cont3YdtContext;
+        YdtContext cont4YdtContext;
+        YdtContext deleteTree;
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        cont1YdtContext = ydtContext.getFirstChild();
+        assertThat(cont1YdtContext.getName(), is("cont1"));
+
+        cont2YdtContext = cont1YdtContext.getFirstChild();
+        assertThat(cont2YdtContext.getName(), is("cont2"));
+
+        cont3YdtContext = cont2YdtContext.getFirstChild();
+        assertThat(cont3YdtContext.getName(), is("cont3"));
+
+        ydtContext = cont3YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf1"));
+        assertThat(ydtContext.getValue(), is("1"));
+
+        ydtContext = cont2YdtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf4"));
+        assertThat(ydtContext.getValue(), is("4"));
+
+        cont4YdtContext = cont1YdtContext.getNextSibling();
+        assertThat(cont4YdtContext.getName(), is("cont4"));
+
+        ydtContext = cont4YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont5"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf9"));
+        assertThat(ydtContext.getValue(), is("9"));
+
+        ydtContext = cont4YdtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf10"));
+        assertThat(ydtContext.getValue(), is("10"));
+
+        // build delete tree
+        YangApplicationBroker yab = new YangApplicationBroker(null);
+        deleteTree = yab.buildDeleteTree(deleteNodes);
+
+        // verify whether delete ydt tree is correct
+        assertThat(deleteTree.getFirstChild().getName(), is("test"));
+
+        cont1YdtContext = deleteTree.getFirstChild().getFirstChild();
+        assertThat(cont1YdtContext.getName(), is("cont1"));
+
+        cont2YdtContext = cont1YdtContext.getFirstChild();
+        assertThat(cont2YdtContext.getName(), is("cont2"));
+
+        cont3YdtContext = cont2YdtContext.getFirstChild();
+        assertThat(cont3YdtContext.getName(), is("cont3"));
+
+        ydtContext = cont3YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf1"));
+        assertThat(ydtContext.getValue(), is("1"));
+
+        assertThat(cont2YdtContext.getNextSibling(), nullValue());
+
+        cont4YdtContext = cont1YdtContext.getNextSibling();
+        assertThat(cont4YdtContext.getName(), is("cont4"));
+
+        ydtContext = cont4YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont5"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf9"));
+        assertThat(ydtContext.getValue(), is("9"));
+
+        assertThat(cont4YdtContext.getNextSibling(), nullValue());
+
+        // ydtTree after removing delete nodes
+        ydtContext = appContext.getModuleContext();
+        assertThat(ydtContext.getName(), is("test"));
+
+        cont1YdtContext = ydtContext.getFirstChild();
+        assertThat(cont1YdtContext.getName(), is("cont1"));
+
+        ydtContext = cont1YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf4"));
+        assertThat(ydtContext.getValue(), is("4"));
+
+        ydtContext = cont1YdtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf10"));
+        assertThat(ydtContext.getValue(), is("10"));
+    }
+
+    /**
+     * Checks whether YANG data tree and delete tree is correct.
+     */
+    @Test
+    public void validateListDeleteTree()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForListEditOperationWithDelete();
+        YdtAppContext appContext =
+                defaultYdtBuilder.getAppRootNode().getFirstChild();
+        YdtContext ydtContext = appContext.getModuleContext();
+        List<YdtContext> deleteNodes = appContext.getDeleteNodes();
+
+        YdtContext cont1YdtContext;
+        YdtContext list1YdtContext;
+        YdtContext list2YdtContext;
+        YdtContext deleteTree;
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        cont1YdtContext = ydtContext.getFirstChild();
+        assertThat(cont1YdtContext.getName(), is("cont1"));
+
+        list1YdtContext = cont1YdtContext.getFirstChild();
+        assertThat(list1YdtContext.getName(), is("list1"));
+
+        ydtContext = list1YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf2"));
+        assertThat(ydtContext.getValue(), is("2"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf3"));
+        assertThat(ydtContext.getValue(), is("3"));
+
+        ydtContext = list1YdtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf4"));
+        assertThat(ydtContext.getValue(), is("4"));
+
+        list2YdtContext = cont1YdtContext.getNextSibling();
+        assertThat(list2YdtContext.getName(), is("list2"));
+
+        ydtContext = list2YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf5"));
+        assertThat(ydtContext.getValue(), is("5"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf6"));
+        assertThat(ydtContext.getValue(), is("6"));
+
+        ydtContext = list2YdtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf10"));
+        assertThat(ydtContext.getValue(), is("10"));
+
+        // build delete tree
+        YangApplicationBroker yab = new YangApplicationBroker(null);
+        deleteTree = yab.buildDeleteTree(deleteNodes);
+
+        assertThat(deleteTree.getFirstChild().getName(), is("test"));
+
+        cont1YdtContext = deleteTree.getFirstChild().getFirstChild();
+        assertThat(cont1YdtContext.getName(), is("cont1"));
+
+        list1YdtContext = cont1YdtContext.getFirstChild();
+        assertThat(list1YdtContext.getName(), is("list1"));
+
+        ydtContext = list1YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf2"));
+        assertThat(ydtContext.getValue(), is("2"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf3"));
+        assertThat(ydtContext.getValue(), is("3"));
+
+        assertThat(list1YdtContext.getNextSibling(), nullValue());
+
+        list2YdtContext = cont1YdtContext.getNextSibling();
+        assertThat(list2YdtContext.getName(), is("list2"));
+
+        ydtContext = list2YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf5"));
+        assertThat(ydtContext.getValue(), is("5"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf6"));
+        assertThat(ydtContext.getValue(), is("6"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+
+        // verify whether ydt tree is correct
+        ydtContext = appContext.getModuleContext();
+        assertThat(ydtContext.getName(), is("test"));
+
+        cont1YdtContext = ydtContext.getFirstChild();
+        assertThat(cont1YdtContext.getName(), is("cont1"));
+
+        ydtContext = cont1YdtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf4"));
+        assertThat(ydtContext.getValue(), is("4"));
+
+        ydtContext = cont1YdtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf10"));
+        assertThat(ydtContext.getValue(), is("10"));
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid edit
+     * request.
+     */
+    @Test
+    public void testExecuteEditOperationWithoutDelete()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForEditOperationWithoutDelete();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid delete
+     * request.
+     */
+    @Test
+    public void testExecuteEditOperationWithDelete()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForEditOperationWithDelete();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid edit
+     * request for list.
+     */
+    @Test
+    public void testExecuteListEditOperationWithoutDelete()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForListEditOperationWithoutDelete();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid delete
+     * request for list.
+     */
+    @Test
+    public void testExecuteListEditOperationWithDelete()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForListEditOperationWithDelete();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid query
+     * request.
+     */
+    @Test
+    public void testExecuteQueryOperation()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder = buildYdtForQueryOperation();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid query
+     * request for list.
+     */
+    @Test
+    public void testExecuteListQueryOperation()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForListQueryOperation();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks whether delete tree is updated correctly.
+     */
+    @Test
+    public void testSiblingsInDeleteTree()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder = buildYdtWithOneDeleteNode();
+        YdtAppContext appContext =
+                defaultYdtBuilder.getAppRootNode().getFirstChild();
+        YdtContext ydtContext = appContext.getModuleContext();
+        List<YdtContext> deleteNodes = appContext.getDeleteNodes();
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont1"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("cont4"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf10"));
+        assertThat(ydtContext.getValue(), is("10"));
+
+        // build delete tree
+        YangApplicationBroker yab = new YangApplicationBroker(null);
+        YdtContext deleteTree = yab.buildDeleteTree(deleteNodes);
+
+        assertThat(deleteTree.getFirstChild().getName(), is("test"));
+
+        ydtContext = deleteTree.getFirstChild().getFirstChild();
+        assertThat(ydtContext.getName(), is("cont4"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+        assertThat(ydtContext.getPreviousSibling(), nullValue());
+
+        ydtContext = appContext.getModuleContext();
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont1"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf10"));
+        assertThat(ydtContext.getValue(), is("10"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+    }
+
+    /**
+     * Checks last child is updated correctly after delete tree is built.
+     */
+    @Test
+    public void testLastChildInYdtTree()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtWithDeleteNodeAsLastChild();
+        YdtAppContext appContext =
+                defaultYdtBuilder.getAppRootNode().getFirstChild();
+        YdtContext ydtContext = appContext.getModuleContext();
+        List<YdtContext> deleteNodes = appContext.getDeleteNodes();
+        assertThat(YdtAppNodeOperationType.BOTH,
+                   is(appContext.getOperationType()));
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont1"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("list2"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("cont4"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+
+        // build delete tree
+        YangApplicationBroker yab = new YangApplicationBroker(null);
+        YdtContext deleteTree = yab.buildDeleteTree(deleteNodes);
+
+        assertThat(deleteTree.getFirstChild().getName(), is("test"));
+
+        ydtContext = deleteTree.getFirstChild().getFirstChild();
+        assertThat(ydtContext.getName(), is("cont4"));
+
+        ydtContext = deleteTree.getFirstChild().getLastChild();
+        assertThat(ydtContext.getName(), is("cont4"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+        assertThat(ydtContext.getPreviousSibling(), nullValue());
+
+        ydtContext = appContext.getModuleContext();
+
+        assertThat(ydtContext.getLastChild().getName(), is("list2"));
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont1"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("list2"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+    }
+
+    /**
+     * Checks YDT tree with all delete nodes.
+     */
+    @Test
+    public void testYdtTreeWithAllDeleteNodes()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder = buildYdtWithAllDeleteNode();
+        YdtAppContext appContext =
+                defaultYdtBuilder.getAppRootNode().getFirstChild();
+        YdtContext ydtContext = appContext.getModuleContext();
+        List<YdtContext> deleteNodes = appContext.getDeleteNodes();
+
+        assertThat(YdtAppNodeOperationType.DELETE_ONLY,
+                   is(appContext.getOperationType()));
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont1"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("list2"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("cont4"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+
+        // build delete tree
+        YangApplicationBroker yab = new YangApplicationBroker(null);
+        YdtContext deleteTree = yab.buildDeleteTree(deleteNodes);
+
+        assertThat(deleteTree.getFirstChild().getName(), is("test"));
+
+        ydtContext = deleteTree.getFirstChild().getFirstChild();
+        assertThat(ydtContext.getName(), is("cont1"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("list2"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("cont4"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+    }
+
+    /**
+     * Checks whether key leaves are also available when there is delete
+     * request for list.
+     */
+    @Test
+    public void testKeyLeavesInDeleteTree() throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder = buildYdtForKeyLeavesInDeleteTree();
+
+        YdtAppContext appContext =
+                defaultYdtBuilder.getAppRootNode().getFirstChild();
+        YdtContext ydtContext = appContext.getModuleContext();
+        List<YdtContext> deleteNodes = appContext.getDeleteNodes();
+
+        assertThat(YdtAppNodeOperationType.BOTH, is(appContext.getOperationType()));
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("list2"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf5"));
+        assertThat(ydtContext.getValue(), is("5"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf6"));
+        assertThat(ydtContext.getValue(), is("6"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf7"));
+        assertThat(ydtContext.getValue(), is("7"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("cont7"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+
+        // build delete tree
+        YangApplicationBroker yab = new YangApplicationBroker(null);
+        YdtContext deleteTree = yab.buildDeleteTree(deleteNodes);
+
+        assertThat(deleteTree.getFirstChild().getName(), is("test"));
+
+        ydtContext = deleteTree.getFirstChild().getFirstChild();
+        assertThat(ydtContext.getName(), is("list2"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext, notNullValue());
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext, notNullValue());
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("cont7"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+
+        ydtContext = appContext.getModuleContext();
+
+        // verify whether ydt tree is correct
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("list2"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("leaf5"));
+        assertThat(ydtContext.getValue(), is("5"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf6"));
+        assertThat(ydtContext.getValue(), is("6"));
+
+        ydtContext = ydtContext.getNextSibling();
+        assertThat(ydtContext.getName(), is("leaf7"));
+        assertThat(ydtContext.getValue(), is("7"));
+
+        assertThat(ydtContext.getNextSibling(), nullValue());
+    }
+
+    /**
+     * Checks YDT tree and application tree for query request with mutiple
+     * augments.
+     */
+    @Test
+    public void testApptreeForQueryWithMultipleAugment()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder = buildYdtForQueryWithMultipleAugment();
+        YdtAppContext appContext = defaultYdtBuilder.getAppRootNode()
+                .getFirstChild();
+        YdtContext ydtNode = appContext.getModuleContext();
+        YangNode yangNode = (YangNode) ((YdtNode) ydtNode).getYangSchemaNode();
+
+        YangApplicationBroker yab = new YangApplicationBroker(defaultYdtBuilder.
+                getYangSchemaRegistry());
+        yab.setAugGenMethodSet(defaultYdtBuilder.getAugGenMethodSet());
+        yab.processAugmentForChildNode(appContext, yangNode);
+
+        assertThat(appContext.getModuleContext().getName(), is("test"));
+
+        appContext = appContext.getFirstChild();
+
+        String augmentName = ((YangAugment) appContext
+                .getAugmentingSchemaNode()).getTargetNode().get(0)
+                .getResolvedNode().getJavaClassNameOrBuiltInType();
+        assertThat(augmentName, is("cont4"));
+
+        assertThat(appContext.getFirstChild(), nullValue());
+        assertThat(appContext.getLastChild(), nullValue());
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid query request
+     * for data resource with multiple augments.
+     */
+    @Test
+    public void testQueryWithMultipleAugment()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder = buildYdtForQueryWithMultipleAugment();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks whether YDT is updated correctly for delete with multiple augment.
+     */
+    @Test
+    public void testYdtForDeleteWithMultipleAugment()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForDeleteWithMultipleAugment();
+        YdtAppContext appContext = defaultYdtBuilder.getAppRootNode()
+                .getFirstChild();
+
+        YangApplicationBroker yab = new YangApplicationBroker(defaultYdtBuilder.
+                getYangSchemaRegistry());
+        yab.setAugGenMethodSet(defaultYdtBuilder.getAugGenMethodSet());
+        YdtContext deleteTree = yab.buildDeleteTree(appContext.getDeleteNodes());
+        yab.processAugmentedNodesForDelete(deleteTree.getFirstChild(),
+                                           appContext);
+
+        assertThat(appContext.getModuleContext().getName(), is("test"));
+
+        appContext = appContext.getFirstChild();
+        String augmentName = ((YangAugment) appContext
+                .getAugmentingSchemaNode()).getTargetNode().get(0)
+                .getResolvedNode().getJavaClassNameOrBuiltInType();
+        assertThat(augmentName, is("cont4"));
+
+        assertThat(appContext.getFirstChild(), nullValue());
+        assertThat(appContext.getLastChild(), nullValue());
+
+        YdtContext ydtContext = deleteTree.getFirstChild();
+        assertThat(ydtContext.getName(), is("test"));
+
+        ydtContext = ydtContext.getFirstChild();
+        assertThat(ydtContext.getName(), is("cont4"));
+    }
+
+    /**
+     * Checks whether there is no exception when there is valid delete request
+     * for data resource with multiple augments.
+     */
+    @Test
+    public void testDeleteWithMultipleAugment() {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForDeleteWithMultipleAugment();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks execute operation for rpc request with only output.
+     */
+    @Test
+    public void testRpcWithOutput()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForRpcWithOnlyOutput();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks execute operation for rpc request with only input.
+     */
+    @Test
+    public void testRpcWithInput()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForRpcWithOnlyInput();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks execute operation for rpc request with input and output.
+     */
+    @Test
+    public void testRpcWithInputOutput()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForRpcWithBothInputOutput();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+
+    /**
+     * Checks execute operation for rpc request without input and
+     * output.
+     */
+    @Test
+    public void testRpcWithoutInputOutput()
+            throws IOException, CloneNotSupportedException {
+        YangRequestWorkBench defaultYdtBuilder =
+                buildYdtForRpc();
+        ymsManager.executeOperation(defaultYdtBuilder);
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobAugmentTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobAugmentTest.java
new file mode 100644
index 0000000..da75702
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobAugmentTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.urn.ip.topo.rev20140101.ymsiptopology.node.AugmentedTopoNode;
+import org.onosproject.yang.gen.v1.urn.ip.topo.rev20140101.ymsiptopology.node.DefaultAugmentedTopoNode;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.YmsTopologyOpParam;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.DefaultNode;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.onosproject.yms.app.yob.YobTestUtils.NODE;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROOT_DATA_RESOURCE;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROUTER_ID;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROUTER_IP;
+import static org.onosproject.yms.app.yob.YobTestUtils.STR_LEAF_VALUE;
+import static org.onosproject.yms.app.yob.YobTestUtils.TOPOLOGY;
+import static org.onosproject.yms.ydt.YdtContextOperationType.NONE;
+
+/**
+ * Test the YANG object building for the YANG data tree based on the non
+ * schema augmented nodes.
+ */
+public class YobAugmentTest {
+
+    private YobTestUtils utils = YobTestUtils.instance();
+
+    @Test
+    public void augmentedLeaf() throws IOException {
+
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+
+        ydtBuilder.addChild(TOPOLOGY, null, NONE);
+        ydtBuilder.addChild(NODE, null);
+        ydtBuilder.addLeaf(ROUTER_ID, "urn:ip:topo", STR_LEAF_VALUE);
+
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertNotNull("Fail to create augmented YANG object", yangObject);
+
+        assertEquals("invalid augmented node created", YmsTopologyOpParam.class,
+                     yangObject.getClass());
+
+        YmsTopologyOpParam topology = (YmsTopologyOpParam) yangObject;
+        assertNotNull("failed to build augmented node", topology.node());
+        assertEquals("Single node entry is expected", 1, topology.node().size());
+        assertEquals("Node type is not DefaultNode", DefaultNode.class,
+                     topology.node().get(0).getClass());
+
+        DefaultNode node = (DefaultNode) topology.node().get(0);
+        assertNotNull("Augmented info is missing", node.yangAugmentedInfo(
+                AugmentedTopoNode.class));
+        assertEquals("Augmented class is incorrect",
+                     DefaultAugmentedTopoNode.class,
+                     node.yangAugmentedInfo(AugmentedTopoNode.class)
+                             .getClass());
+
+        DefaultAugmentedTopoNode augmentedNode = (DefaultAugmentedTopoNode)
+                node.yangAugmentedInfo(AugmentedTopoNode.class);
+        assertThat("Augmented leaf value is incorrect",
+                   augmentedNode.routerId(), is(STR_LEAF_VALUE));
+    }
+
+    @Test
+    public void augmentedLeaves() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+
+        ydtBuilder.addChild(TOPOLOGY, null, NONE);
+        ydtBuilder.addChild(NODE, null);
+        ydtBuilder.addLeaf(ROUTER_ID, "urn:ip:topo", STR_LEAF_VALUE);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(ROUTER_IP, "urn:ip:topo", STR_LEAF_VALUE);
+
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertNotNull("Fail to create augmented YANG object", yangObject);
+
+        assertEquals("invalid augmented node created",
+                     YmsTopologyOpParam.class, yangObject.getClass());
+
+        YmsTopologyOpParam topology = (YmsTopologyOpParam) yangObject;
+        assertNotNull("failed to build augmented node", topology.node());
+        assertEquals("Single node entry is expected", 1,
+                     topology.node().size());
+        assertEquals("Node type is not DefaultNode", DefaultNode.class,
+                     topology.node().get(0).getClass());
+
+        DefaultNode node = (DefaultNode) topology.node().get(0);
+        assertNotNull("Augmented info is missing", node.yangAugmentedInfo(
+                AugmentedTopoNode.class));
+        assertEquals("Augmented class is incorrect",
+                     DefaultAugmentedTopoNode.class,
+                     node.yangAugmentedInfo(AugmentedTopoNode.class)
+                             .getClass());
+
+        DefaultAugmentedTopoNode augmentedNode = (DefaultAugmentedTopoNode)
+                node.yangAugmentedInfo(AugmentedTopoNode.class);
+        assertThat("Augmented router id is incorrect",
+                   augmentedNode.routerId(), is(STR_LEAF_VALUE));
+        assertThat("Augmented router ip is incorrect",
+                   augmentedNode.routerIp(), is(STR_LEAF_VALUE));
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBinaryTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBinaryTest.java
new file mode 100644
index 0000000..a749874
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBinaryTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.ydt.binarytest.rev20160524.BinarytestOpParam;
+import org.onosproject.yang.gen.v1.ydt.binarytest.rev20160524.binarytest.cont1.AugmentedCont1;
+import org.onosproject.yang.gen.v1.ydt.binarytest.rev20160524.binarytest.food.snack.Sportsarena;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROOT_DATA_RESOURCE;
+
+/**
+ * Test the YANG object building for the YANG data tree based on the binary.
+ */
+public class YobBinaryTest {
+
+    private YobTestUtils utils = YobTestUtils.instance();
+
+    @Test
+    public void testBinaryInLeaf() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("binarytest", "ydt.binarytest");
+        ydtBuilder.addChild("binaryList", null);
+        ydtBuilder.addLeaf("binary", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BinarytestOpParam binarytestOpParam = ((BinarytestOpParam) yangObject);
+
+        byte[] binaryValue = binarytestOpParam.binaryList().get(0).binary();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+
+    @Test
+    public void testBinaryInTypedef() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("binarytest", "ydt.binarytest");
+        ydtBuilder.addLeaf("name", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BinarytestOpParam binarytestOpParam = ((BinarytestOpParam) yangObject);
+
+        byte[] binaryValue = binarytestOpParam.name().binary();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+
+    @Test
+    public void testBinaryInGrouping() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("binarytest", "ydt.binarytest");
+        ydtBuilder.addChild("cont1", "ydt.binarytest");
+        ydtBuilder.addLeaf("surname", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BinarytestOpParam binarytestOpParam = ((BinarytestOpParam) yangObject);
+
+        byte[] binaryValue = binarytestOpParam.cont1().surname();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+
+    @Test
+    public void testBinaryInAugment() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("binarytest", "ydt.binarytest");
+        ydtBuilder.addChild("cont1", "ydt.binarytest");
+        ydtBuilder.addLeaf("lastname", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BinarytestOpParam binarytestOpParam = ((BinarytestOpParam) yangObject);
+
+        AugmentedCont1 augmentedCont1 = (AugmentedCont1) binarytestOpParam.cont1()
+                .yangAugmentedInfo(AugmentedCont1.class);
+        byte[] binaryValue = augmentedCont1.lastname();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+
+    @Test
+    public void testBinaryInCase() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("binarytest", "ydt.binarytest");
+        ydtBuilder.addChild("food", "ydt.binarytest");
+        ydtBuilder.addLeaf("pretzel", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BinarytestOpParam binarytestOpParam = ((BinarytestOpParam) yangObject);
+        Sportsarena sportsArena = ((Sportsarena) binarytestOpParam.food()
+                .snack());
+        byte[] binaryValue = sportsArena.pretzel();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+
+    @Test
+    public void testBinaryInUnion() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("binarytest", "ydt.binarytest");
+        ydtBuilder.addLeaf("middlename", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BinarytestOpParam binarytestOpParam = ((BinarytestOpParam) yangObject);
+
+        byte[] binaryValue = binarytestOpParam.middlename().binary();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBitTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBitTest.java
new file mode 100644
index 0000000..41ca592
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBitTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.ydt.bit.rev20160524.BitOpParam;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+import org.onosproject.yms.ydt.YmsOperationType;
+
+import java.io.IOException;
+
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROOT_DATA_RESOURCE;
+
+/**
+ * Test the YANG object building for the YDT based on the bits.
+ */
+public class YobBitTest {
+
+    private YobTestUtils utils = YobTestUtils.instance();
+
+    @Test
+    public void testBitsInLeaf() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("bit", "ydt.bit");
+        ydtBuilder.addChild("bitList", null);
+        ydtBuilder.addLeaf("bit", null, "disable-nagle");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("bitList", null);
+        ydtBuilder.addLeaf("bit", null, "auto-sense-speed");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addChild("bitList", null);
+        ydtBuilder.addLeaf("bit", null, "ten-Mb-only");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BitOpParam bitOpParam = ((BitOpParam) yangObject);
+
+        assertThat(bitOpParam.bitList().get(0).bit().get(0), is(true));
+        assertThat(bitOpParam.bitList().get(0).bit().get(1), is(false));
+        assertThat(bitOpParam.bitList().get(1).bit().get(0), is(false));
+        assertThat(bitOpParam.bitList().get(1).bit().get(1), is(true));
+        assertThat(bitOpParam.bitList().get(2).bit().get(0), is(false));
+        assertThat(bitOpParam.bitList().get(2).bit().get(1), is(false));
+        assertThat(bitOpParam.bitList().get(2).bit().get(2), is(true));
+        assertThat(bitOpParam.bitList().get(2).bit().get(2), is(true));
+    }
+
+    @Test
+    public void testBitsInTypedef() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("bit", "ydt.bit");
+        ydtBuilder.addLeaf("name", null, "bit3");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BitOpParam bitOpParam = ((BitOpParam) yangObject);
+
+        assertThat(bitOpParam.name().bits().get(0), is(false));
+        assertThat(bitOpParam.name().bits().get(3), is(true));
+    }
+
+    @Test
+    public void testBitsQuery() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, YmsOperationType.QUERY_REQUEST,
+                utils.schemaRegistry(), true);
+        ydtBuilder.addChild("bit", "ydt.bit");
+        ydtBuilder.addChild("name", "ydt.bit");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        BitOpParam bitOpParam = ((BitOpParam) yangObject);
+        assertThat(bitOpParam.selectLeafFlags().get(1), is(true));
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBooleanTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBooleanTest.java
new file mode 100644
index 0000000..456a892
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobBooleanTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class YobBooleanTest {
+
+    private static final String BOOLEAN_LIST = "booleanList";
+    private static final String AUTO_PREFIX_BOOLEAN = "yangAutoPrefixBoolean";
+
+    /*
+        BOOLEAN
+        Positive scenario
+        input with in true and false
+    */
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.booleanYdt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    private void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        try {
+
+            Field field = yangObject.getClass().getDeclaredField(BOOLEAN_LIST);
+            field.setAccessible(true);
+            List booleanList = (List) field.get(yangObject);
+            Field invalidInterval = booleanList.get(0).getClass()
+                    .getDeclaredField(AUTO_PREFIX_BOOLEAN);
+            invalidInterval.setAccessible(true);
+            assertTrue((boolean) invalidInterval.get(booleanList.get(0)));
+            assertFalse((boolean) invalidInterval.get(booleanList.get(1)));
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobChoiceTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobChoiceTest.java
new file mode 100644
index 0000000..03c2421
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobChoiceTest.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.YmsTopologyOpParam;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.DefaultNode;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.Node;
+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.DefaultCase1a;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.node.choice1.DefaultCase1b;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.node.choice1.case1b.choice1b.Case1Bi;
+import org.onosproject.yang.gen.v1.urn.topo.rev20140101.ymstopology.node.choice1.case1b.choice1b.DefaultCase1Bi;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.onosproject.yms.app.yob.YobTestUtils.LEAF_1A1;
+import static org.onosproject.yms.app.yob.YobTestUtils.LEAF_1A2;
+import static org.onosproject.yms.app.yob.YobTestUtils.LEAF_1BIA;
+import static org.onosproject.yms.app.yob.YobTestUtils.LEAF_1BIB;
+import static org.onosproject.yms.app.yob.YobTestUtils.NODE;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROOT_DATA_RESOURCE;
+import static org.onosproject.yms.app.yob.YobTestUtils.STR_LEAF_VALUE;
+import static org.onosproject.yms.app.yob.YobTestUtils.TOPOLOGY;
+import static org.onosproject.yms.ydt.YdtContextOperationType.NONE;
+
+/**
+ * Test the YANG object building for the YANG data tree based on the non
+ * schema choice and case nodes.
+ */
+public class YobChoiceTest {
+
+    private YobTestUtils utils = YobTestUtils.instance();
+
+    @Test
+    public void caseInChoice() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+
+        ydtBuilder.addChild(TOPOLOGY, null, NONE);
+        ydtBuilder.addChild(NODE, null);
+        ydtBuilder.addLeaf(LEAF_1A1, null, STR_LEAF_VALUE);
+
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertNotNull(yangObject);
+        assertEquals("YANG object created is not topology object",
+                     YmsTopologyOpParam.class, yangObject.getClass());
+
+        YmsTopologyOpParam topology = (YmsTopologyOpParam) yangObject;
+        assertNotNull("Failed to build the object", topology.node());
+        assertEquals("Single node entry is expected", 1,
+                     topology.node().size());
+        assertEquals("Node type is not DefaultNode", DefaultNode.class,
+                     topology.node().get(0).getClass());
+
+        Node node = topology.node().get(0);
+        assertNotNull("choice1 is not set in node", node.choice1());
+        assertEquals("choice 1 type is not ", DefaultCase1a.class,
+                     node.choice1().getClass());
+
+        Case1a case1a = (Case1a) node.choice1();
+        assertNotNull("leaf1a1 is not set in case", case1a.leaf1A1());
+        assertEquals("leaf1a1 type is not correct", String.class,
+                     case1a.leaf1A1().getClass());
+        assertEquals("leaf1a1 value is not correct", STR_LEAF_VALUE,
+                     case1a.leaf1A1());
+
+    }
+
+    @Test
+    public void caseWithMultiAttribute() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+
+        ydtBuilder.addChild(TOPOLOGY, null, NONE);
+        ydtBuilder.addChild(NODE, null);
+        ydtBuilder.addLeaf(LEAF_1A1, null, STR_LEAF_VALUE);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(LEAF_1A2, null, STR_LEAF_VALUE);
+
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertNotNull(yangObject);
+        assertEquals("YANG object created is not topology object",
+                     YmsTopologyOpParam.class, yangObject.getClass());
+
+        YmsTopologyOpParam topology = (YmsTopologyOpParam) yangObject;
+        assertNotNull("Failed to build the object", topology.node());
+        assertEquals("Single node entry is expected", 1,
+                     topology.node().size());
+        assertEquals("Node type is not DefaultNode", DefaultNode.class,
+                     topology.node().get(0).getClass());
+
+        Node node = topology.node().get(0);
+        assertNotNull("choice1 is not set in node", node.choice1());
+        assertEquals("choice 1 type is not ", DefaultCase1a.class,
+                     node.choice1().getClass());
+
+        Case1a case1a = (Case1a) node.choice1();
+        assertNotNull("leaf1a1 is not set in case", case1a.leaf1A1());
+        assertEquals("leaf1a1 type is not correct", String.class,
+                     case1a.leaf1A1().getClass());
+        assertEquals("leaf1a1 value is not correct", STR_LEAF_VALUE,
+                     case1a.leaf1A1());
+
+        assertNotNull("leaf1a2 is not set in case", case1a.leaf1A2());
+        assertEquals("leaf1a2 type is not correct", String.class,
+                     case1a.leaf1A2().getClass());
+        assertEquals("leaf1a1 value is not correct", STR_LEAF_VALUE,
+                     case1a.leaf1A1());
+
+    }
+
+    @Test
+    public void recursiveChoice() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+
+        ydtBuilder.addChild(TOPOLOGY, null, NONE);
+        ydtBuilder.addChild(NODE, null);
+        ydtBuilder.addLeaf(LEAF_1BIA, null, STR_LEAF_VALUE);
+
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertNotNull(yangObject);
+        assertEquals("YANG object created is not topology object",
+                     YmsTopologyOpParam.class, yangObject.getClass());
+
+        YmsTopologyOpParam topology = (YmsTopologyOpParam) yangObject;
+        assertNotNull("Failed to build the object", topology.node());
+        assertEquals("Single node entry is expected", 1,
+                     topology.node().size());
+        assertEquals("Node type is not DefaultNode", DefaultNode.class,
+                     topology.node().get(0).getClass());
+
+        Node node = topology.node().get(0);
+        assertNotNull("Choice 1 is not set in Node", node.choice1());
+        assertEquals("Choice 1 is not of type DefaultCase1b",
+                     DefaultCase1b.class, node.choice1().getClass());
+
+        Case1b case1b = (Case1b) node.choice1();
+        assertNotNull("Case1b does not have child choice1b ",
+                      case1b.choice1b());
+        assertEquals("choice1b is not of type DefaultCase1Bi",
+                     DefaultCase1Bi.class, case1b.choice1b().getClass());
+
+        Case1Bi case1Bi = (Case1Bi) case1b.choice1b();
+        assertNotNull("leaf1bia is not set", case1Bi.leaf1Bia());
+        assertEquals("leaf1bia type is not string", String.class,
+                     case1Bi.leaf1Bia().getClass());
+        assertEquals("leaf1bia value is wrong", STR_LEAF_VALUE,
+                     case1Bi.leaf1Bia());
+    }
+
+    @Test
+    public void recursiveChoiceWithMultipleAttribute() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+
+        ydtBuilder.addChild(TOPOLOGY, null, NONE);
+        ydtBuilder.addChild(NODE, null);
+        ydtBuilder.addLeaf(LEAF_1BIA, null, STR_LEAF_VALUE);
+        ydtBuilder.traverseToParent();
+        ydtBuilder.addLeaf(LEAF_1BIB, null, STR_LEAF_VALUE);
+
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertNotNull(yangObject);
+        assertEquals("YANG object created is not topology object",
+                     YmsTopologyOpParam.class, yangObject.getClass());
+
+        YmsTopologyOpParam topology = (YmsTopologyOpParam) yangObject;
+        assertNotNull("Failed to build the object", topology.node());
+        assertEquals("Single node entry is expected", 1,
+                     topology.node().size());
+        assertEquals("Node type is not DefaultNode", DefaultNode.class,
+                     topology.node().get(0).getClass());
+
+        Node node = topology.node().get(0);
+        assertNotNull("Choice 1 is not set in Node", node.choice1());
+        assertEquals("Choice 1 is not of type DefaultCase1b",
+                     DefaultCase1b.class,
+                     node.choice1().getClass());
+
+        Case1b case1b = (Case1b) node.choice1();
+        assertNotNull("Case1b does not have child choice1b ",
+                      case1b.choice1b());
+        assertEquals("choice1b is not of type DefaultCase1Bi",
+                     DefaultCase1Bi.class,
+                     case1b.choice1b().getClass());
+
+        Case1Bi case1Bi = (Case1Bi) case1b.choice1b();
+        assertNotNull("leaf1bia is not set", case1Bi.leaf1Bia());
+        assertEquals("leaf1bia type is not string", String.class,
+                     case1Bi.leaf1Bia().getClass());
+        assertEquals("leaf1bia value is wrong", STR_LEAF_VALUE,
+                     case1Bi.leaf1Bia());
+
+        assertNotNull("leaf1bib is not set", case1Bi.leaf1Bib());
+        assertEquals("leaf1bia type is not string", String.class,
+                     case1Bi.leaf1Bib().getClass());
+        assertEquals("leaf1bia value is wrong", STR_LEAF_VALUE,
+                     case1Bi.leaf1Bib());
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobDecimal64Test.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobDecimal64Test.java
new file mode 100644
index 0000000..dbc27f1
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobDecimal64Test.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class YobDecimal64Test {
+
+    /*
+
+    Positive scenario
+
+    input at boundary for decimal64 with fraction 2
+        i. min value
+        ii. max value
+
+    input at boundary for decimal64 with minimum fraction
+        i. min value
+        ii. mid value
+        iii. max value
+
+    input at boundary for decimal64 with maximum fraction
+        i. min value
+        ii. mid value
+        iii. max value
+
+    input with in range
+        if range is 10 to 100 for integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+    input with multi interval range
+        if range is 10..40 | 50..100 for decimal64
+            i.1. input 11
+            i.2. input 10
+            i.3. input 40
+            i.4. input 50
+            i.5. input 55
+            i.6. input 100
+
+        if range is "min .. 3.14 | 10 | 20..max" for decimal64
+            i.1. input min
+            i.2. input 2.505
+            i.3. input 3.14
+            i.4. input 10
+            i.5. input 20
+            i.6. input 92233720368547757
+            i.7. input 92233720368547758.07
+
+    */
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.decimal64Ydt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    private void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        try {
+            Field negInt = yangObject.getClass().getDeclaredField("negInt");
+            negInt.setAccessible(true);
+            assertEquals("-92233720368547758.08", negInt
+                    .get(yangObject).toString());
+            Field negIntWithMaxFraction = yangObject.getClass()
+                    .getDeclaredField("negIntWithMaxFraction");
+            negIntWithMaxFraction.setAccessible(true);
+            assertEquals("-9.223372036854775808", negIntWithMaxFraction
+                    .get(yangObject).toString());
+            Field negIntWithMinFraction = yangObject.getClass()
+                    .getDeclaredField("negIntWithMinFraction");
+            negIntWithMinFraction.setAccessible(true);
+            assertEquals("-922337203685477580.8", negIntWithMinFraction
+                    .get(yangObject).toString());
+            Field posInt = yangObject.getClass()
+                    .getDeclaredField("posInt");
+            posInt.setAccessible(true);
+            assertEquals("92233720368547758.07", posInt
+                    .get(yangObject).toString());
+            Field posIntWithMaxFraction = yangObject
+                    .getClass().getDeclaredField("posIntWithMaxFraction");
+            posIntWithMaxFraction.setAccessible(true);
+            assertEquals("9.223372036854775807", posIntWithMaxFraction
+                    .get(yangObject).toString());
+            Field posIntWithMinFraction = yangObject.getClass()
+                    .getDeclaredField("posIntWithMinFraction");
+            posIntWithMinFraction.setAccessible(true);
+            assertEquals("922337203685477580.7", posIntWithMinFraction
+                    .get(yangObject).toString());
+            Field minIntWithRange = yangObject.getClass()
+                    .getDeclaredField("minIntWithRange");
+            minIntWithRange.setAccessible(true);
+            assertEquals("10", minIntWithRange
+                    .get(yangObject).toString());
+            Field midIntWithRange = yangObject
+                    .getClass().getDeclaredField("midIntWithRange");
+            midIntWithRange.setAccessible(true);
+            assertEquals("11", midIntWithRange.get(yangObject).toString());
+            Field maxIntWithRange = yangObject
+                    .getClass().getDeclaredField("maxIntWithRange");
+            maxIntWithRange.setAccessible(true);
+            assertEquals("100", maxIntWithRange.get(yangObject).toString());
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobEmptyTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobEmptyTest.java
new file mode 100644
index 0000000..e919147
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobEmptyTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+/**
+ * Test the YANG object building for the YANG data tree based on the schema
+ * nodes with empty data type.
+ */
+public class YobEmptyTest {
+
+    /*
+        EMPTY
+        Positive scenario
+        input with in empty.
+    */
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.emptyTypeYdt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    private void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+
+        try {
+            Field field = yangObject.getClass().getDeclaredField("emptyList");
+            field.setAccessible(true);
+            List booleanList = (List) field.get(yangObject);
+            Field invalidInterval = booleanList.get(0)
+                    .getClass().getDeclaredField("empty");
+            invalidInterval.setAccessible(true);
+            assertEquals(true, invalidInterval.get(booleanList.get(0)));
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobEnumTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobEnumTest.java
new file mode 100644
index 0000000..40ba5f1
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobEnumTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class YobEnumTest {
+
+/*
+    ENUM
+
+    Positive scenario
+
+        input with in enum
+        input with "ten"
+        input with "hundred"
+        input with "thousand"
+*/
+
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.enumYdt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    private void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        try {
+            Field field = yangObject.getClass().getDeclaredField("enumList");
+            field.setAccessible(true);
+            List enumList = (List) field.get(yangObject);
+            assertEquals(false, enumList.isEmpty());
+            Field enumleaf = enumList.get(0)
+                    .getClass().getDeclaredField("enumleaf");
+            enumleaf.setAccessible(true);
+            assertEquals("ten", enumleaf
+                    .get(enumList.get(0)).toString().toLowerCase());
+            assertEquals("hundred", enumleaf
+                    .get(enumList.get(1)).toString().toLowerCase());
+            assertEquals("thousand", enumleaf
+                    .get(enumList.get(2)).toString().toLowerCase());
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobGroupingUsesTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobGroupingUsesTest.java
new file mode 100644
index 0000000..547bac7
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobGroupingUsesTest.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.YmsIetfNetworkOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ymsietfnetwork.networksstate.Network;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.YmsNetworkTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ymsnetworktopology.networks.network.AugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ymsnetworktopology.networks.network.DefaultAugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ymsnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.YmsIetfTeTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.YmsIetfTeTopologyOpParam;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.ymsietftetopology.TeAdminStatus;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.ymsietftetopology.networks.network.link.AugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.ymsietftetopology.networks.network.link.DefaultAugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.ymsietftetopology.teadminstatus.TeAdminStatusEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.ymsietftetopology.telinkconfig.bundlestacklevel.DefaultBundle;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160317.ymsietftetopology.telinkconfig.bundlestacklevel.bundle.bundledlinks.BundledLink;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.onosproject.yms.app.yob.YobTestUtils.ADMIN_STATUS;
+import static org.onosproject.yms.app.yob.YobTestUtils.BUNDLED_LINK;
+import static org.onosproject.yms.app.yob.YobTestUtils.BUNDLED_LINKS;
+import static org.onosproject.yms.app.yob.YobTestUtils.CONFIG;
+import static org.onosproject.yms.app.yob.YobTestUtils.IETF_TE_TOPOLOGY;
+import static org.onosproject.yms.app.yob.YobTestUtils.LINK;
+import static org.onosproject.yms.app.yob.YobTestUtils.NETWORK;
+import static org.onosproject.yms.app.yob.YobTestUtils.NETWORKS;
+import static org.onosproject.yms.app.yob.YobTestUtils.NETWORKS_STATE;
+import static org.onosproject.yms.app.yob.YobTestUtils.NETWORK_REF;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROOT_DATA_RESOURCE;
+import static org.onosproject.yms.app.yob.YobTestUtils.SEQUENCE;
+import static org.onosproject.yms.app.yob.YobTestUtils.STR_LEAF_VALUE;
+import static org.onosproject.yms.app.yob.YobTestUtils.TE;
+import static org.onosproject.yms.app.yob.YobTestUtils.TE_LINK_TEMPLATE;
+import static org.onosproject.yms.app.yob.YobTestUtils.TE_NODE_ATTRIBUTES;
+import static org.onosproject.yms.app.yob.YobTestUtils.TE_NODE_EVENT;
+import static org.onosproject.yms.app.yob.YobTestUtils.UP;
+import static org.onosproject.yms.app.yob.YobTestUtils.YMS_IETF_NETWORK;
+import static org.onosproject.yms.app.yob.YobTestUtils.YMS_NETWORK_TOPOLOGY;
+import static org.onosproject.yms.ydt.YdtContextOperationType.CREATE;
+
+/**
+ * Test the YANG object building for the YANG data tree based on the grouping
+ * and uses nodes.
+ */
+public class YobGroupingUsesTest {
+
+    private YobTestUtils utils = YobTestUtils.instance();
+
+    @Test
+    public void testGroupingUsesLeaf() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild(YMS_IETF_NETWORK, null, CREATE);
+        ydtBuilder.addChild(NETWORKS_STATE, null);
+        ydtBuilder.addChild(NETWORK, null);
+        ydtBuilder.addLeaf(NETWORK_REF, null, STR_LEAF_VALUE);
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertThat(yangObject, is(notNullValue()));
+        YmsIetfNetworkOpParam ietfNetwork = (YmsIetfNetworkOpParam) yangObject;
+        Network network = ietfNetwork.networksState().network().iterator().next();
+        assertThat(network.networkRef(), is(STR_LEAF_VALUE));
+    }
+
+    @Test
+    public void testGroupingUsesContainer() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild(IETF_TE_TOPOLOGY, null, CREATE);
+        ydtBuilder.addChild(TE_NODE_EVENT, null);
+        ydtBuilder.addChild(TE_NODE_ATTRIBUTES, null);
+        ydtBuilder.addLeaf(ADMIN_STATUS, null, UP);
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertThat(yangObject, is(notNullValue()));
+        YmsIetfTeTopologyOpParam ietfTeTopology = (YmsIetfTeTopologyOpParam)
+                yangObject;
+        TeAdminStatus adminStatus = ietfTeTopology.teNodeEvent()
+                .teNodeAttributes()
+                .adminStatus();
+        assertThat(adminStatus.enumeration(), is(TeAdminStatusEnum.UP));
+    }
+
+    @Test
+    public void testGroupingUsesInterfile() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild(YMS_IETF_NETWORK, null, CREATE);
+        ydtBuilder.addChild(NETWORKS, null);
+        ydtBuilder.addChild(NETWORK, null);
+        ydtBuilder.addChild(LINK, YMS_NETWORK_TOPOLOGY);
+        ydtBuilder.addChild(TE, IETF_TE_TOPOLOGY);
+        ydtBuilder.addChild(CONFIG, IETF_TE_TOPOLOGY);
+        ydtBuilder.addChild(BUNDLED_LINKS, IETF_TE_TOPOLOGY);
+        ydtBuilder.addChild(BUNDLED_LINK, IETF_TE_TOPOLOGY);
+        ydtBuilder.addLeaf(SEQUENCE, null, "1");
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertThat(yangObject, is(notNullValue()));
+        YmsIetfNetworkOpParam ietfNetwork = (YmsIetfNetworkOpParam) yangObject;
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
+                .ietf.network.rev20151208.ymsietfnetwork
+                .networks.Network network = ietfNetwork.networks().network().get(0);
+
+        DefaultAugmentedNdNetwork augmentedNdNetworks = (DefaultAugmentedNdNetwork) network
+                .yangAugmentedInfo(AugmentedNdNetwork.class);
+        assertThat(augmentedNdNetworks.yangAugmentedNdNetworkOpType(),
+                   is(YmsNetworkTopology.OnosYangOpType.CREATE));
+
+        Link link = augmentedNdNetworks.link().get(0);
+        DefaultAugmentedNtLink augmentedNtLink = (DefaultAugmentedNtLink) link
+                .yangAugmentedInfo(AugmentedNtLink.class);
+        assertThat(augmentedNtLink.yangAugmentedNtLinkOpType(),
+                   is(YmsIetfTeTopology.OnosYangOpType.CREATE));
+
+        DefaultBundle bundleStackLevel = (DefaultBundle) augmentedNtLink.te()
+                .config().bundleStackLevel();
+        assertThat(bundleStackLevel.yangBundleOpType(),
+                   is(YmsIetfTeTopology.OnosYangOpType.CREATE));
+
+        BundledLink bundledLink = bundleStackLevel.bundledLinks().bundledLink().get(0);
+        assertThat(bundledLink.yangBundledLinkOpType(),
+                   is(YmsIetfTeTopology.OnosYangOpType.CREATE));
+        assertThat(bundledLink.sequence(), is(1L));
+    }
+
+    @Test
+    public void testGroupingUsesAugment() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild(YMS_IETF_NETWORK, null, CREATE);
+        ydtBuilder.addChild(NETWORKS, null);
+        ydtBuilder.addChild(NETWORK, null);
+        ydtBuilder.addChild(LINK, YMS_NETWORK_TOPOLOGY);
+        ydtBuilder.addChild(TE, IETF_TE_TOPOLOGY);
+        ydtBuilder.addChild(CONFIG, IETF_TE_TOPOLOGY);
+        ydtBuilder.addLeaf(TE_LINK_TEMPLATE, null, "1");
+        YdtContext logicalRoot = ydtBuilder.getRootNode();
+        YdtExtendedContext appRoot =
+                (YdtExtendedContext) logicalRoot.getFirstChild();
+
+        DefaultYobBuilder yobBuilder = new DefaultYobBuilder();
+        Object yangObject = yobBuilder.getYangObject(appRoot,
+                                                     utils.schemaRegistry());
+        assertThat(yangObject, is(notNullValue()));
+        YmsIetfNetworkOpParam ietfNetwork = (YmsIetfNetworkOpParam) yangObject;
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
+                .ietf.network.rev20151208.ymsietfnetwork
+                .networks.Network network = ietfNetwork.networks().network().get(0);
+
+        DefaultAugmentedNdNetwork augmentedNdNetworks = (DefaultAugmentedNdNetwork) network
+                .yangAugmentedInfo(AugmentedNdNetwork.class);
+        assertThat(augmentedNdNetworks.yangAugmentedNdNetworkOpType(),
+                   is(YmsNetworkTopology.OnosYangOpType.CREATE));
+
+        Link link = augmentedNdNetworks.link().get(0);
+        DefaultAugmentedNtLink augmentedNtLink = (DefaultAugmentedNtLink) link
+                .yangAugmentedInfo(AugmentedNtLink.class);
+        assertThat(augmentedNtLink.yangAugmentedNtLinkOpType(),
+                   is(YmsIetfTeTopology.OnosYangOpType.CREATE));
+
+        assertThat(augmentedNtLink.te().config().teLinkTemplate().get(0),
+                   is("1"));
+    }
+}
+
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobIetfNetworkTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobIetfNetworkTest.java
new file mode 100644
index 0000000..38aed89
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobIetfNetworkTest.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import static org.junit.Assert.assertNotNull;
+
+public class YobIetfNetworkTest {
+
+    @Test
+    public void ietfNetwork1Test() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.ietfNetwork1Ydt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    private void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        //TODO yangObject need to verify
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger16Test.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger16Test.java
new file mode 100644
index 0000000..7d6dc1c
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger16Test.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class YobInteger16Test {
+
+    /*
+
+    Positive scenario
+
+    input at boundary for integer
+        i. min value
+        ii. max value
+
+    input at boundary for unsigned integer
+        i. min value
+        ii. max value
+
+    input with in range
+        if range is 10 to 100 for integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+        if range is 10 to 100 for unsigned integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+    */
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.integer16Ydt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    public void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        try {
+            Field negInt = yangObject.getClass().getDeclaredField("negInt");
+            negInt.setAccessible(true);
+            assertEquals("-32768", negInt.get(yangObject).toString());
+            Field posInt = yangObject.getClass().getDeclaredField("posInt");
+            posInt.setAccessible(true);
+            assertEquals("32767", posInt.get(yangObject).toString());
+            Field minIntWithRange = yangObject
+                    .getClass().getDeclaredField("minIntWithRange");
+            minIntWithRange.setAccessible(true);
+            assertEquals("10", minIntWithRange.get(yangObject).toString());
+            Field midIntWithRange = yangObject
+                    .getClass().getDeclaredField("midIntWithRange");
+            midIntWithRange.setAccessible(true);
+            assertEquals("11", midIntWithRange.get(yangObject).toString());
+            Field maxIntWithRange = yangObject
+                    .getClass().getDeclaredField("maxIntWithRange");
+            maxIntWithRange.setAccessible(true);
+            assertEquals("100", maxIntWithRange.get(yangObject).toString());
+            Field minUint = yangObject.getClass().getDeclaredField("minUint");
+            minUint.setAccessible(true);
+            assertEquals("0", minUint.get(yangObject).toString());
+            Field maxUint = yangObject.getClass().getDeclaredField("maxUint");
+            maxUint.setAccessible(true);
+            assertEquals("65535", maxUint.get(yangObject).toString());
+            Field minUintWithRange = yangObject
+                    .getClass().getDeclaredField("minUintWithRange");
+            minUintWithRange.setAccessible(true);
+            assertEquals("10", minUintWithRange.get(yangObject).toString());
+            Field midUintWithRange = yangObject
+                    .getClass().getDeclaredField("midUintWithRange");
+            midUintWithRange.setAccessible(true);
+            assertEquals("11", midUintWithRange.get(yangObject).toString());
+            Field maxUintWithRange = yangObject
+                    .getClass().getDeclaredField("maxUintWithRange");
+            maxUintWithRange.setAccessible(true);
+            assertEquals("100", maxUintWithRange.get(yangObject).toString());
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger32Test.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger32Test.java
new file mode 100644
index 0000000..1e73dc7
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger32Test.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class YobInteger32Test {
+
+    /*
+
+    Positive scenario
+
+    input at boundary for integer
+        i. min value
+        ii. max value
+
+    input at boundary for unsigned integer
+        i. min value
+        ii. max value
+
+    input with in range
+        if range is 10 to 100 for integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+        if range is 10 to 100 for unsigned integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+    */
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.integer32Ydt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    public void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        try {
+            Field negInt = yangObject.getClass().getDeclaredField("negInt");
+            negInt.setAccessible(true);
+            assertEquals("-2147483648", negInt.get(yangObject).toString());
+            Field posInt = yangObject.getClass().getDeclaredField("posInt");
+            posInt.setAccessible(true);
+            assertEquals("2147483647", posInt.get(yangObject).toString());
+            Field minIntWithRange = yangObject
+                    .getClass().getDeclaredField("minIntWithRange");
+            minIntWithRange.setAccessible(true);
+            assertEquals("10", minIntWithRange.get(yangObject).toString());
+            Field midIntWithRange = yangObject
+                    .getClass().getDeclaredField("midIntWithRange");
+            midIntWithRange.setAccessible(true);
+            assertEquals("11", midIntWithRange.get(yangObject).toString());
+            Field maxIntWithRange = yangObject
+                    .getClass().getDeclaredField("maxIntWithRange");
+            maxIntWithRange.setAccessible(true);
+            assertEquals("100", maxIntWithRange.get(yangObject).toString());
+            Field minUint = yangObject.getClass().getDeclaredField("minUint");
+            minUint.setAccessible(true);
+            assertEquals("0", minUint.get(yangObject).toString());
+            Field maxUint = yangObject.getClass().getDeclaredField("maxUint");
+            maxUint.setAccessible(true);
+            assertEquals("4294967295", maxUint.get(yangObject).toString());
+            Field minUintWithRange = yangObject
+                    .getClass().getDeclaredField("minUintWithRange");
+            minUintWithRange.setAccessible(true);
+            assertEquals("10", minUintWithRange.get(yangObject).toString());
+            Field midUintWithRange = yangObject
+                    .getClass().getDeclaredField("midUintWithRange");
+            midUintWithRange.setAccessible(true);
+            assertEquals("11", midUintWithRange.get(yangObject).toString());
+            Field maxUintWithRange = yangObject
+                    .getClass().getDeclaredField("maxUintWithRange");
+            maxUintWithRange.setAccessible(true);
+            assertEquals("100", maxUintWithRange.get(yangObject).toString());
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger64Test.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger64Test.java
new file mode 100644
index 0000000..eca6986
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger64Test.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+
+public class YobInteger64Test {
+
+    /*
+
+    Positive scenario
+
+    input at boundary for integer
+        i. min value
+        ii. max value
+
+    input at boundary for unsigned integer
+        i. min value
+        ii. max value
+
+    input with in range
+        if range is 10 to 100 for integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+        if range is 10 to 100 for unsigned integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+    */
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.integer64Ydt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    private void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        try {
+            Field negInt = yangObject.getClass().getDeclaredField("negInt");
+            negInt.setAccessible(true);
+            assertEquals("-9223372036854775808", negInt
+                    .get(yangObject).toString());
+            Field posIntField = yangObject
+                    .getClass().getDeclaredField("posInt");
+            posIntField.setAccessible(true);
+            assertEquals("9223372036854775807", posIntField
+                    .get(yangObject).toString());
+            Field minIntWithRange = yangObject
+                    .getClass().getDeclaredField("minIntWithRange");
+            minIntWithRange.setAccessible(true);
+            assertEquals("10", minIntWithRange.get(yangObject).toString());
+            Field midIntWithRange = yangObject
+                    .getClass().getDeclaredField("midIntWithRange");
+            midIntWithRange.setAccessible(true);
+            assertEquals("11", midIntWithRange.get(yangObject).toString());
+            Field maxIntWithRange = yangObject
+                    .getClass().getDeclaredField("maxIntWithRange");
+            maxIntWithRange.setAccessible(true);
+            assertEquals("100", maxIntWithRange.get(yangObject).toString());
+            Field minUint = yangObject.getClass().getDeclaredField("minUint");
+            minUint.setAccessible(true);
+            assertEquals("0", minUint.get(yangObject).toString());
+            Field maxUint = yangObject.getClass().getDeclaredField("maxUint");
+            maxUint.setAccessible(true);
+            assertEquals("18446744073709551615", maxUint
+                    .get(yangObject).toString());
+            Field minUintWithRange = yangObject
+                    .getClass().getDeclaredField("minUintWithRange");
+            minUintWithRange.setAccessible(true);
+            assertEquals("10", minUintWithRange.get(yangObject).toString());
+            Field midUintWithRange = yangObject
+                    .getClass().getDeclaredField("midUintWithRange");
+            midUintWithRange.setAccessible(true);
+            assertEquals("11", midUintWithRange.get(yangObject).toString());
+            Field maxUintWithRange = yangObject
+                    .getClass().getDeclaredField("maxUintWithRange");
+            maxUintWithRange.setAccessible(true);
+            assertEquals("100", maxUintWithRange.get(yangObject).toString());
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger8Test.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger8Test.java
new file mode 100644
index 0000000..d6f75f9
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobInteger8Test.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.lang.reflect.Field;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class YobInteger8Test {
+
+    /*
+
+    Positive scenario
+
+    input at boundary for integer
+        i. min value
+        ii. max value
+
+    input at boundary for unsigned integer
+        i. min value
+        ii. max value
+
+    input with in range
+        if range is 10 to 100 for integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+        if range is 10 to 100 for unsigned integer
+            i.1. input 11
+            i.2. min value 10
+            i.3. max value 100
+
+    input with multi interval range
+        if range is 10..40 | 50..100 for integer
+            i.1. input 11
+            i.2. input 10
+            i.3. input 40
+            i.4. input 50
+            i.5. input 55
+            i.6. input 100
+
+        if range is 10..40 | 50..100 for unsigned integer
+            i.1. input 11
+            i.2. input 10
+            i.3. input 40
+            i.4. input 50
+            i.5. input 55
+            i.6. input 100
+
+        if range is "min .. 2 | 10 | 20..max" for integer
+            i.1. input -128
+            i.2. input 1
+            i.3. input 2
+            i.4. input 10
+            i.5. input 20
+            i.6. input 100
+            i.7. input 127
+
+         if range is "min .. 2 | 10 | 20..max" for unsigned Integer
+            i.1. input 0
+            i.2. input 1
+            i.3. input 2
+            i.4. input 10
+            i.5. input 20
+            i.6. input 100
+            i.7. input 255
+    */
+    @Test
+    public void positiveTest() {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils.integer8Ydt();
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    private void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        try {
+            Field negInt = yangObject.getClass().getDeclaredField("negInt");
+            negInt.setAccessible(true);
+            assertEquals("-128", negInt.get(yangObject).toString());
+            Field posInt = yangObject.getClass().getDeclaredField("posInt");
+            posInt.setAccessible(true);
+            assertEquals("127", posInt.get(yangObject).toString());
+            Field minIntWithRange = yangObject
+                    .getClass().getDeclaredField("minIntWithRange");
+            minIntWithRange.setAccessible(true);
+            assertEquals("10", minIntWithRange
+                    .get(yangObject).toString());
+            Field midIntWithRange = yangObject
+                    .getClass().getDeclaredField("midIntWithRange");
+            midIntWithRange.setAccessible(true);
+            assertEquals("11", midIntWithRange
+                    .get(yangObject).toString());
+            Field maxIntWithRange = yangObject
+                    .getClass().getDeclaredField("maxIntWithRange");
+            maxIntWithRange.setAccessible(true);
+            assertEquals("100", maxIntWithRange.get(yangObject).toString());
+            Field minUint = yangObject.getClass().getDeclaredField("minUint");
+            minUint.setAccessible(true);
+            assertEquals("0", minUint.get(yangObject).toString());
+            Field maxUint = yangObject.getClass().getDeclaredField("maxUint");
+            maxUint.setAccessible(true);
+            assertEquals("255", maxUint.get(yangObject).toString());
+            Field minUintWithRange = yangObject
+                    .getClass().getDeclaredField("maxIntWithRange");
+            minUintWithRange.setAccessible(true);
+            assertEquals("100", minUintWithRange.get(yangObject).toString());
+            Field midUintWithRange = yangObject
+                    .getClass().getDeclaredField("midUintWithRange");
+            midUintWithRange.setAccessible(true);
+            assertEquals("11", midUintWithRange.get(yangObject).toString());
+            Field maxUintWithRange = yangObject
+                    .getClass().getDeclaredField("maxUintWithRange");
+            maxUintWithRange.setAccessible(true);
+            assertEquals("100", maxUintWithRange.get(yangObject).toString());
+        } catch (IllegalAccessException | NoSuchFieldException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobLeafRefTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobLeafRefTest.java
new file mode 100644
index 0000000..c7e5fe3
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobLeafRefTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.ydt.leafreftest.rev20160524.LeafreftestOpParam;
+import org.onosproject.yang.gen.v1.ydt.leafreftest.rev20160524.leafreftest.cont1.AugmentedCont1;
+import org.onosproject.yang.gen.v1.ydt.leafreftest.rev20160524.leafreftest.food.snack.Sportsarena;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROOT_DATA_RESOURCE;
+
+/**
+ * Test the YANG object building for the YANG data tree based on the leaf ref.
+ */
+public class YobLeafRefTest {
+
+    private YobTestUtils utils = YobTestUtils.instance();
+
+    @Test
+    public void testLeafrefInLeaf() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("leafreftest", "ydt.leafreftest");
+        ydtBuilder.addChild("leafrefList", null);
+        ydtBuilder.addLeaf("id", null, "leafref");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        LeafreftestOpParam leafrefTestOpParam = ((LeafreftestOpParam)
+                yangObject);
+        assertThat(leafrefTestOpParam.leafrefList().get(0).id().toString(),
+                   is("leafref"));
+    }
+
+    @Test
+    public void testLeafrefInTypedef() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("leafreftest", "ydt.leafreftest");
+        ydtBuilder.addLeaf("name", null, "leafref");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        LeafreftestOpParam leafrefTestOpParam = ((LeafreftestOpParam) yangObject);
+        assertThat(leafrefTestOpParam.name().toString(), is("leafref"));
+    }
+
+    @Test
+    public void testLeafrefInGrouping() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("leafreftest", "ydt.leafreftest");
+        ydtBuilder.addChild("cont1", "ydt.leafreftest");
+        ydtBuilder.addLeaf("surname", null, "leafref");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        LeafreftestOpParam leafreftestOpParam = ((LeafreftestOpParam) yangObject);
+        assertThat(leafreftestOpParam.cont1().surname().toString(),
+                   is("leafref"));
+    }
+
+    @Test
+    public void testLeafrefInAugment() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("leafreftest", "ydt.leafreftest");
+        ydtBuilder.addChild("cont1", "ydt.leafreftest");
+        ydtBuilder.addLeaf("lastname", null, "yang");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        LeafreftestOpParam leafreftestOpParam = ((LeafreftestOpParam) yangObject);
+        AugmentedCont1 augmentedCont1 = (AugmentedCont1) leafreftestOpParam
+                .cont1().yangAugmentedInfo(AugmentedCont1.class);
+        assertThat(augmentedCont1.lastname().toString(), is("yang"));
+    }
+
+    @Test
+    public void testLeafrefInCase() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("leafreftest", "ydt.leafreftest");
+        ydtBuilder.addChild("food", "ydt.leafreftest");
+        ydtBuilder.addLeaf("pretzel", null, "yang");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        LeafreftestOpParam leafreftestOpParam = ((LeafreftestOpParam)
+                yangObject);
+        Sportsarena sportsArena = ((Sportsarena) leafreftestOpParam.food()
+                .snack());
+        assertThat(sportsArena.pretzel().toString(), is("yang"));
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobListTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobListTest.java
new file mode 100644
index 0000000..4f30ca2
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobListTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+public class YobListTest {
+
+    @Test
+    public void listwithoutcontainerTest() {
+        YangRequestWorkBench defaultYdtBuilder =
+                YdtTestUtils.listWithoutContainerYdt();
+        validateYangObjectList(defaultYdtBuilder);
+    }
+
+    private void validateYangObjectList(
+            YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, YdtTestUtils.
+                        getSchemaRegistry());
+        assertNotNull(yangObject);
+        assertTrue(yangObject.getClass().getSimpleName()
+                           .equals("RootlistOpParam"));
+        try {
+
+            Field field =
+                    yangObject.getClass().getDeclaredField("listwithcontainer");
+            field.setAccessible(true);
+            List listwithcontainer = (List) field.get(yangObject);
+            assertNull(listwithcontainer);
+            Field field1 = yangObject.getClass()
+                    .getDeclaredField("listwithoutcontainer");
+            field1.setAccessible(true);
+            List listwithoutcontainer = (List) field1.get(yangObject);
+            assertEquals(false, listwithoutcontainer.isEmpty());
+            Field invalidinterval = listwithoutcontainer.get(0).getClass()
+                    .getDeclaredField("invalidinterval");
+            invalidinterval.setAccessible(true);
+            assertEquals("12", invalidinterval.get(listwithoutcontainer.get(0))
+                    .toString());
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            Assert.fail();
+        }
+    }
+
+    @Test
+    public void listwithcontainerTest()
+            throws IOException {
+        YangRequestWorkBench defaultYdtBuilder =
+                YdtTestUtils.listWithContainerYdt();
+
+        validateYangObject(defaultYdtBuilder);
+    }
+
+    public void validateYangObject(YangRequestWorkBench defaultYdtBuilder) {
+
+        YdtContext ydtContext = defaultYdtBuilder.getRootNode();
+
+        YdtContext ydtContext1 = ydtContext.getFirstChild();
+
+        DefaultYobBuilder defaultYobBuilder = new DefaultYobBuilder();
+
+        Object yangObject = defaultYobBuilder.getYangObject(
+                (YdtExtendedContext) ydtContext1, YdtTestUtils
+                        .getSchemaRegistry());
+        assertNotNull(yangObject);
+        assertTrue(yangObject.getClass().getSimpleName()
+                           .equals("RootlistOpParam"));
+        try {
+
+            Field field = yangObject.getClass()
+                    .getDeclaredField("listwithoutcontainer");
+            field.setAccessible(true);
+            List listwithoutcontainer = (List) field.get(yangObject);
+            assertNull(listwithoutcontainer);
+            Field listwithcontainerField =
+                    yangObject.getClass().getDeclaredField("listwithcontainer");
+            listwithcontainerField.setAccessible(true);
+            List listwithcontainer =
+                    (List) listwithcontainerField.get(yangObject);
+            Field invalid = listwithcontainer.get(0).getClass()
+                    .getDeclaredField("invalid");
+            invalid.setAccessible(true);
+            assertEquals("12",
+                         invalid.get(listwithcontainer.get(0)).toString());
+            Field invalidinterval = listwithcontainer.get(0).getClass()
+                    .getDeclaredField("invalidinterval");
+            invalidinterval.setAccessible(true);
+            List invalidintervalList =
+                    (List) invalidinterval.get(listwithcontainer.get(0));
+            assertEquals("1", invalidintervalList.get(0).toString());
+            assertEquals("2", invalidintervalList.get(1).toString());
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            Assert.fail();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobLogisticsManagerTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobLogisticsManagerTest.java
new file mode 100644
index 0000000..8d3b5e3
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobLogisticsManagerTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onosproject.yms.app.ydt.YdtTestUtils;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class YobLogisticsManagerTest {
+
+    @Test
+    public void logisticsManagerTest() throws IOException {
+        YangRequestWorkBench defaultYdtBuilder = YdtTestUtils
+                .logisticsManagerYdt();
+
+        YdtContext rootCtx = defaultYdtBuilder.getRootNode();
+
+        YdtContext childCtx = rootCtx.getFirstChild();
+
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+
+        while (childCtx != null) {
+
+            Object yangObject = builder.getYangObject(
+                    (YdtExtendedContext) childCtx, YdtTestUtils
+                            .getSchemaRegistry());
+            Class<?> aClass = yangObject.getClass();
+            if (aClass.getSimpleName().equals("CustomssupervisorOpParam")) {
+                try {
+                    Field field = aClass.getDeclaredField("supervisor");
+                    Field onosYangNodeOperationType = aClass
+                            .getDeclaredField("yangCustomssupervisorOpType");
+                    field.setAccessible(true);
+                    onosYangNodeOperationType.setAccessible(true);
+                    try {
+                        assertEquals("abc", field.get(yangObject).toString());
+                        assertEquals("MERGE", onosYangNodeOperationType
+                                .get(yangObject).toString());
+                    } catch (IllegalAccessException e) {
+                        Assert.fail();
+                    }
+                } catch (NoSuchFieldException e) {
+                    Assert.fail();
+                }
+            }
+
+            if (aClass.getSimpleName().equals(
+                    "MerchandisersupervisorOpParam")) {
+                try {
+                    Field field = aClass.getDeclaredField("supervisor");
+                    field.setAccessible(true);
+                    try {
+                        assertEquals("abc", field.get(yangObject).toString());
+                    } catch (IllegalAccessException e) {
+                        Assert.fail();
+                    }
+                } catch (NoSuchFieldException e) {
+                    Assert.fail();
+                }
+            }
+
+            if (aClass.getSimpleName().equals("WarehousesupervisorOpParam")) {
+                try {
+                    Field field = aClass.getDeclaredField("supervisor");
+                    field.setAccessible(true);
+                    try {
+                        ArrayList<String> arrayList =
+                                (ArrayList<String>) field.get(yangObject);
+                        assertEquals("1", arrayList.get(0));
+                        assertEquals("2", arrayList.get(1));
+                        assertEquals("3", arrayList.get(2));
+                        assertEquals("4", arrayList.get(3));
+                        assertEquals("5", arrayList.get(4));
+                    } catch (IllegalAccessException e) {
+                        Assert.fail();
+                    }
+                } catch (NoSuchFieldException e) {
+                    Assert.fail();
+                }
+            }
+            childCtx = childCtx.getNextSibling();
+        }
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobTestUtils.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobTestUtils.java
new file mode 100644
index 0000000..11818d8
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobTestUtils.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.yms.app.yob;
+
+import org.onosproject.yms.app.ysr.TestYangSchemaNodeProvider;
+import org.onosproject.yms.app.ysr.YangSchemaRegistry;
+
+/**
+ * YOB test Utility.
+ */
+final class YobTestUtils {
+
+    /**
+     * Schema nodes.
+     */
+    static final String ROOT_DATA_RESOURCE = "/restconf/data";
+    static final String TOPOLOGY = "yms-topology";
+    static final String NODE = "node";
+    static final String LEAF_1A1 = "leaf1a1";
+    static final String LEAF_1A2 = "leaf1a2";
+    static final String LEAF_1BIA = "leaf1bia";
+    static final String LEAF_1BIB = "leaf1bib";
+    static final String ROUTER_ID = "router-id";
+    static final String ROUTER_IP = "router-ip";
+    static final String STR_LEAF_VALUE = "leaf value";
+    static final String YMS_IETF_NETWORK = "yms-ietf-network";
+    static final String NETWORKS_STATE = "networks-state";
+    static final String NETWORKS = "networks";
+    static final String NETWORK = "network";
+    static final String NETWORK_REF = "network-ref";
+    static final String IETF_TE_TOPOLOGY = "yms-ietf-te-topology";
+    static final String TE_NODE_EVENT = "te-node-event";
+    static final String TE_NODE_ATTRIBUTES = "te-node-attributes";
+    static final String ADMIN_STATUS = "admin-status";
+    static final String UP = "up";
+    static final String LINK = "link";
+    static final String YMS_NETWORK_TOPOLOGY = "yms-network-topology";
+    static final String TE = "te";
+    static final String CONFIG = "config";
+    static final String BUNDLED_LINKS = "bundled-links";
+    static final String BUNDLED_LINK = "bundled-link";
+    static final String SEQUENCE = "sequence";
+    static final String TE_LINK_TEMPLATE = "te-link-template";
+
+    private YobTestUtils() {
+        TEST_SCHEMA_PROVIDER.processSchemaRegistry(null);
+    }
+
+    private static final TestYangSchemaNodeProvider
+            TEST_SCHEMA_PROVIDER = new TestYangSchemaNodeProvider();
+
+    YangSchemaRegistry schemaRegistry() {
+        return TEST_SCHEMA_PROVIDER.getDefaultYangSchemaRegistry();
+    }
+
+    /**
+     * Returns the YANG object builder factory instance.
+     *
+     * @return YANG object builder factory instance
+     */
+    static YobTestUtils 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.
+     */
+    private static class LazyHolder {
+        private static final YobTestUtils INSTANCE = new YobTestUtils();
+    }
+}
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobUnionTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobUnionTest.java
new file mode 100644
index 0000000..1829286
--- /dev/null
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/yob/YobUnionTest.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yms.app.yob;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.ydt.uniontest.rev20160524.UniontestOpParam;
+import org.onosproject.yang.gen.v1.ydt.uniontest.rev20160524.uniontest.cont1.AugmentedCont1;
+import org.onosproject.yang.gen.v1.ydt.uniontest.rev20160524.uniontest.food.snack.Sportsarena;
+import org.onosproject.yms.app.ydt.YangRequestWorkBench;
+import org.onosproject.yms.app.ydt.YdtExtendedContext;
+import org.onosproject.yms.ydt.YdtContext;
+
+import java.io.IOException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.onosproject.yms.app.yob.YobTestUtils.ROOT_DATA_RESOURCE;
+
+/**
+ * Test the YANG object building for the YANG data tree based on the union.
+ */
+public class YobUnionTest {
+
+    private YobTestUtils utils = YobTestUtils.instance();
+
+    @Test
+    public void testUnionInLeaf() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("uniontest", "ydt.uniontest");
+        ydtBuilder.addChild("unionList", null);
+        ydtBuilder.addLeaf("id", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        UniontestOpParam unionTestOpParam = ((UniontestOpParam) yangObject);
+
+        byte[] binaryValue = unionTestOpParam.unionList().get(0).id().binary();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+
+    @Test
+    public void testUnionInTypedef() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("uniontest", "ydt.uniontest");
+        ydtBuilder.addLeaf("name", null, "bit1");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        UniontestOpParam unionTestOpParam = ((UniontestOpParam) yangObject);
+        assertThat(unionTestOpParam.name().union().bits().get(1), is(true));
+    }
+
+    @Test
+    public void testUnionInGrouping() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("uniontest", "ydt.uniontest");
+        ydtBuilder.addChild("cont1", "ydt.uniontest");
+        ydtBuilder.addLeaf("surname", null, "yang");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        UniontestOpParam uniontestOpParam = ((UniontestOpParam) yangObject);
+        assertThat(uniontestOpParam.cont1().surname().string(), is("yang"));
+    }
+
+    @Test
+    public void testUnionInAugment() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("uniontest", "ydt.uniontest");
+        ydtBuilder.addChild("cont1", "ydt.uniontest");
+        ydtBuilder.addLeaf("lastname", null, "bit0");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        UniontestOpParam uniontestOpParam = ((UniontestOpParam) yangObject);
+
+        AugmentedCont1 augmentedCont1 = (AugmentedCont1) uniontestOpParam
+                .cont1().yangAugmentedInfo(AugmentedCont1.class);
+        assertThat(augmentedCont1.lastname().bits().get(0), is(true));
+    }
+
+    @Test
+    public void testUnionInCase() throws IOException {
+        YangRequestWorkBench ydtBuilder = new YangRequestWorkBench(
+                ROOT_DATA_RESOURCE, null, null, utils.schemaRegistry(), true);
+        ydtBuilder.addChild("uniontest", "ydt.uniontest");
+        ydtBuilder.addChild("food", "ydt.uniontest");
+        ydtBuilder.addLeaf("pretzel", null, "YmluYXJ5");
+        ydtBuilder.traverseToParent();
+        ydtBuilder.traverseToParent();
+        YdtContext rootCtx = ydtBuilder.getRootNode();
+        YdtContext childCtx = rootCtx.getFirstChild();
+        DefaultYobBuilder builder = new DefaultYobBuilder();
+        Object yangObject = builder.getYangObject(
+                (YdtExtendedContext) childCtx, utils.schemaRegistry());
+        assertThat(yangObject, notNullValue());
+        UniontestOpParam uniontestOpParam = ((UniontestOpParam) yangObject);
+        Sportsarena sportsArena = ((Sportsarena) uniontestOpParam.food()
+                .snack());
+        byte[] binaryValue = sportsArena.pretzel().binary();
+        String value = new String(binaryValue);
+        assertThat(value, is("binary"));
+    }
+}
diff --git a/apps/yms/ut/src/test/resources/ydtTestYangFiles/binarytest.yang b/apps/yms/ut/src/test/resources/ydtTestYangFiles/binarytest.yang
index 71ada48..f6db459d 100644
--- a/apps/yms/ut/src/test/resources/ydtTestYangFiles/binarytest.yang
+++ b/apps/yms/ut/src/test/resources/ydtTestYangFiles/binarytest.yang
@@ -30,4 +30,45 @@
               }
         }
     }
+
+    typedef percent {
+        type binary;
+    }
+
+    leaf name {
+        type percent;
+    }
+
+    grouping greeting {
+        leaf surname {
+            type binary;
+        }
+    }
+
+    container cont1 {
+        uses greeting;
+    }
+
+    augment "/cont1" {
+        leaf lastname {
+            type binary;
+        }
+    }
+
+    container food {
+        choice snack {
+            case sportsarena {
+                leaf pretzel {
+                    type binary;
+                }
+            }
+        }
+    }
+
+    leaf middlename {
+        type union {
+            type int8;
+            type binary;
+        }
+    }
 }
\ No newline at end of file
diff --git a/apps/yms/ut/src/test/resources/ydtTestYangFiles/bit.yang b/apps/yms/ut/src/test/resources/ydtTestYangFiles/bit.yang
index 6d97ccc..8b4f0c3 100644
--- a/apps/yms/ut/src/test/resources/ydtTestYangFiles/bit.yang
+++ b/apps/yms/ut/src/test/resources/ydtTestYangFiles/bit.yang
@@ -13,22 +13,6 @@
     revision "2016-05-24" {
         description "Initial revision.";
     }
-/*
-     leaf mybits {
-         type bits {
-             bit disable-nagle {
-                 position 0;
-             }
-             bit auto-sense-speed {
-                 position 1;
-             }
-             bit 10-Mb-only {
-                 position 2;
-             }
-         }
-         default "auto-sense-speed";
-     }
-     */
 
     list bitList {
         config false;
@@ -44,8 +28,80 @@
                 position 2;
                 }
             }
-            default "auto-sense-speed";
+        }
+    }
 
+    typedef percent {
+        type bits {
+            bit bit3 {
+                position 3;
+            }
+            bit bit4 {
+                position 4;
+            }
+            bit bit5 {
+                position 5;
+            }
+        }
+    }
+
+    leaf name {
+        type percent;
+    }
+
+    grouping greeting {
+        leaf surname {
+            type bits {
+                bit bit6 {
+                    position 6;
+                }
+                bit bit7 {
+                    position 7;
+                }
+                bit bit8 {
+                    position 8;
+                }
+            }
+        }
+    }
+
+    container cont1 {
+        uses greeting;
+    }
+
+    augment "/cont1" {
+        leaf lastname {
+            type bits {
+                bit bit9 {
+                    position 9;
+                }
+                bit bit10 {
+                    position 10;
+                }
+                bit bit11 {
+                    position 11;
+                }
+            }
+        }
+    }
+
+    container food {
+        choice snack {
+           case sportsarena {
+               leaf pretzel {
+                   type bits {
+                       bit bit12 {
+                          position 12;
+                       }
+                       bit bit13 {
+                          position 13;
+                       }
+                       bit bit14 {
+                          position 14;
+                       }
+                   }
+               }
+           }
         }
     }
 }
\ No newline at end of file
diff --git a/apps/yms/ut/src/test/resources/ydtTestYangFiles/leafreftest.yang b/apps/yms/ut/src/test/resources/ydtTestYangFiles/leafreftest.yang
new file mode 100644
index 0000000..5191b72
--- /dev/null
+++ b/apps/yms/ut/src/test/resources/ydtTestYangFiles/leafreftest.yang
@@ -0,0 +1,71 @@
+module leafreftest {
+
+    yang-version 1;
+
+    namespace "ydt.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/apps/yms/ut/src/test/resources/ydtTestYangFiles/uniontest.yang b/apps/yms/ut/src/test/resources/ydtTestYangFiles/uniontest.yang
new file mode 100644
index 0000000..4ab5801
--- /dev/null
+++ b/apps/yms/ut/src/test/resources/ydtTestYangFiles/uniontest.yang
@@ -0,0 +1,92 @@
+module uniontest {
+
+    yang-version 1;
+
+    namespace "ydt.uniontest";
+
+    prefix "uniontest";
+
+    organization "ON-LAB";
+
+    description "This module defines for union classifier.";
+
+    revision "2016-05-24" {
+        description "Initial revision.";
+    }
+
+    list unionList {
+        config false;
+        leaf id {
+            type union {
+                type int8;
+                type binary;
+            }
+        }
+    }
+
+    typedef percent {
+        type union {
+            type int8;
+            type bits {
+                bit bit0 {
+                    position 0;
+                }
+                bit bit1 {
+                    position 1;
+                }
+                bit bit2 {
+                    position 2;
+                }
+            }
+        }
+    }
+
+    leaf name {
+        type percent;
+    }
+
+    grouping greeting {
+        leaf surname {
+            type union {
+                type int8;
+                type string;
+            }
+        }
+    }
+
+    container cont1 {
+        uses greeting;
+    }
+
+    augment "/cont1" {
+        leaf lastname {
+            type union {
+                type int8;
+                type bits {
+                    bit bit0 {
+                        position 0;
+                    }
+                    bit bit1 {
+                        position 1;
+                    }
+                    bit bit2 {
+                        position 2;
+                    }
+                }
+            }
+        }
+    }
+
+    container food {
+        choice snack {
+            case sportsarena {
+                leaf pretzel {
+                    type union {
+                        type int8;
+                        type binary;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
