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 3b8d728..6ed14267 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
@@ -34,6 +34,7 @@
     static final String OP_TYPE = "OnosYangNodeOperationType";
     static final String OF = "of";
     static final String PERIOD = ".";
+    static final String SPACE = " ";
     static final String ADD_AUGMENT_METHOD = "addYangAugmentedInfo";
 
     //Error strings
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 e8d226f..d72edc1 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,7 +17,10 @@
 package org.onosproject.yms.app.yob;
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
-import org.onosproject.yangutils.datamodel.YangBinary;
+import org.onosproject.yangutils.datamodel.YangBit;
+import org.onosproject.yangutils.datamodel.YangBits;
+import org.onosproject.yangutils.datamodel.YangLeaf;
+import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangSchemaNode;
 import org.onosproject.yangutils.datamodel.YangSchemaNodeContextInfo;
@@ -33,6 +36,9 @@
 import java.lang.reflect.Method;
 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;
@@ -46,6 +52,7 @@
 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;
 
 /**
  * Utils to support object creation.
@@ -121,12 +128,15 @@
                 break;
 
             case BINARY:
-                parentSetterMethod.invoke(parentBuilderObject,
-                                          new YangBinary(leafValue));
+                byte[] value = Base64.getDecoder().decode(leafValue);
+                parentSetterMethod.invoke(parentBuilderObject, value);
                 break;
 
             case BITS:
-                //TODO
+                YangBits yangBits = (YangBits) type.getDataTypeExtendedInfo();
+                parentSetterMethod.invoke(parentBuilderObject,
+                                          getBitSetValueFromString(yangBits,
+                                                                   leafValue));
                 break;
 
             case DECIMAL64:
@@ -140,11 +150,13 @@
                 break;
 
             case UNION:
-                // TODO
+                parseDerivedTypeInfo(ydtExtendedContext, parentSetterMethod,
+                                     parentBuilderObject, leafValue, false);
                 break;
 
             case LEAFREF:
-                // TODO
+                parseLeafRefTypeInfo(ydtExtendedContext, parentSetterMethod,
+                                     parentBuilderObject, leafValue);
                 break;
 
             case ENUMERATION:
@@ -233,6 +245,32 @@
     }
 
     /**
+     * To set data into parent setter method from string value for leafref type.
+     *
+     * @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 parseLeafRefTypeInfo(YdtExtendedContext ydtExtendedContext,
+                                             Method parentSetterMethod,
+                                             Object parentBuilderObject,
+                                             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);
+    }
+
+    /**
      * Updates class loader for all the classes.
      *
      * @param registry           YANG schema registry
@@ -246,8 +284,6 @@
                                       String qualifiedClassName,
                                       YdtExtendedContext curNode,
                                       YdtExtendedContext rootNode) {
-
-
         if (rootNode != null && curNode == rootNode) {
             YangSchemaNode curSchemaNode = curNode.getYangSchemaNode();
             while (!(curSchemaNode instanceof RpcNotificationContainer)) {
@@ -331,4 +367,28 @@
 
         return packageName + PERIOD + className;
     }
+
+    /**
+     * Returns BitSet value from string.
+     *
+     * @param yangBits  schema node of the YANG bits
+     * @param leafValue leaf value from RESTCONF
+     * @return BitSet value
+     */
+    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());
+        }
+        return bitDataSet;
+    }
 }
diff --git a/apps/yms/app/src/test/java/org/onosproject/yms/app/yob/YobBinaryTest.java b/apps/yms/app/src/test/java/org/onosproject/yms/app/yob/YobBinaryTest.java
new file mode 100644
index 0000000..a749874
--- /dev/null
+++ b/apps/yms/app/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/app/src/test/resources/ydtTestYangFiles/binarytest.yang b/apps/yms/app/src/test/resources/ydtTestYangFiles/binarytest.yang
index 71ada48..f6db459d 100644
--- a/apps/yms/app/src/test/resources/ydtTestYangFiles/binarytest.yang
+++ b/apps/yms/app/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
