diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
index 35244c0..1347e76 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
@@ -481,33 +481,51 @@
         if (clonedNode instanceof YangAugmentableNode) {
             ((YangAugmentableNode) clonedNode).cloneAugmentInfo();
             if (isAnyData) {
-                // clone
-                List<YangAugment> clonedYangAugmentedInfo = new ArrayList<>();
-                List<YangAugment> yangAugmentedInfo =
-                        ((YangAugmentableNode) this).getAugmentedInfoList();
-                if (yangAugmentedInfo != null && !yangAugmentedInfo.isEmpty()) {
-                    for (YangAugment info : yangAugmentedInfo) {
-                        try {
-                            YangAugment augment = (YangAugment) info.clone(
-                                    null, false, true);
-                            cloneSubTree(info, augment, null,
-                                         false, null);
-                            augment.setParent(info.getParent());
-                            augment.setAugmentedNode(clonedNode);
-                            clonedYangAugmentedInfo.add(augment);
-                        } catch (DataModelException e) {
-                            throw new IllegalArgumentException(e);
-                        }
-                    }
-                }
-                ((YangAugmentableNode) clonedNode).getAugmentedInfoList()
-                        .addAll(clonedYangAugmentedInfo);
+                cloneAugmentedInfo(clonedNode);
             }
         }
         return clonedNode;
     }
 
     /**
+     * Clones the augmented subtree information and update the same in the
+     * current cloned augmentable node.
+     *
+     * @param clonedNode current cloned node who's augmented info needs to be
+     *                   cloned
+     * @throws CloneNotSupportedException clone is not supported by the referred
+     *                                    node
+     */
+    private void cloneAugmentedInfo(YangNode clonedNode) throws CloneNotSupportedException {
+        // clone
+        List<YangAugment> clonedYangAugmentedInfo = new ArrayList<>();
+        List<YangAugment> yangAugmentedInfo =
+                ((YangAugmentableNode) this).getAugmentedInfoList();
+        if (yangAugmentedInfo != null && !yangAugmentedInfo.isEmpty()) {
+            for (YangAugment info : yangAugmentedInfo) {
+                try {
+                    // clone the top level augment node
+                    YangAugment augment = (YangAugment) info.clone(
+                            null, false, true);
+                    // clone the subtree of top level node and updating the
+                    // same in clonned top level node
+                    cloneSubTree(info, augment, null,
+                                 false, null);
+                    augment.setParent(info.getParent());
+                    augment.setAugmentedNode(clonedNode);
+                    // adding the cloned augmented subtree in augmented info
+                    // list
+                    clonedYangAugmentedInfo.add(augment);
+                } catch (DataModelException e) {
+                    throw new IllegalArgumentException(e);
+                }
+            }
+        }
+        ((YangAugmentableNode) clonedNode).getAugmentedInfoList()
+                .addAll(clonedYangAugmentedInfo);
+    }
+
+    /**
      * Clones the subtree from the specified source node to the mentioned target
      * node. The source and target root node cloning is carried out by the
      * caller.
@@ -547,8 +565,9 @@
         TraversalType curTraversal;
         YangNode clonedTreeCurNode = dstRootNode;
         YangNode newNode = null;
-
+        boolean isAnydata = false;
         if (childToClone != null) {
+            isAnydata = true;
             nextNodeToClone = childToClone;
         } else {
             nextNodeToClone = srcRootNode.getChild();
@@ -580,13 +599,8 @@
                 }
 
                 if (curTraversal != PARENT) {
-                    if (childToClone != null) {
-                        newNode = nextNodeToClone.clone(yangUses, isDeviation,
-                                                        true);
-                    } else {
-                        newNode = nextNodeToClone.clone(yangUses, isDeviation,
-                                                        false);
-                    }
+                    newNode = nextNodeToClone.clone(yangUses, isDeviation,
+                                                    isAnydata);
                     if (newNode instanceof YangUses) {
                         ((YangUses) newNode).setCloned(true);
                     }
@@ -632,7 +646,7 @@
                      */
                     nextNodeToClone = nextNodeToClone.getChild();
                 } else if (nextNodeToClone.getNextSibling() != null) {
-                    if (childToClone != null &&
+                    if (isAnydata &&
                             nextNodeToClone.getNextSibling().getParent() == srcRootNode) {
                         curTraversal = PARENT;
                         nextNodeToClone = nextNodeToClone.getParent();
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
index b00e84d..2640a8b 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
@@ -117,8 +117,6 @@
 public final class DataModelUtils {
     public static final String TRUE = "true";
     public static final String FALSE = "false";
-    public static final String TYPEDEF = "Typedef";
-    public static final String IDENTITY = "Identity";
     public static final String FMT_NOT_EXIST =
             "Requested %s is not child in %s.";
     public static final String E_ID = "Schema id should not be null.";
@@ -127,11 +125,6 @@
                     " avoid the %s extension in the name.";
     public static final String E_INVALID = "This call is not valid for " +
             "YANG leaf/leaf-list";
-    public static final String DOT_REGEX = "\\.";
-    public static final String QNAME_PRE = "org.onosproject.yang.gen";
-    public static final String DEFAULT = "Default";
-    public static final String INVAL_ANYDATA =
-            "Requested %s is not valid node for anydata.";
     private static final String SLASH = File.separator;
     private static final String E_DATATYPE = "Data type not supported.";
     private static final String DATE_FORMAT = "yyyy-MM-dd";
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/JavaCodeGeneratorUtil.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/JavaCodeGeneratorUtil.java
index f6f8e37..194ef46 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/JavaCodeGeneratorUtil.java
@@ -148,6 +148,8 @@
                             if (codeGenNode instanceof YangLeavesHolder ||
                                     codeGenNode instanceof SchemaDataNode) {
                                 codeGenNode.setParentContext();
+                                // updating the parent context and Ysn
+                                // context info map for augmented node
                                 if (!translateComplete && codeGenNode
                                         instanceof YangAugmentableNode) {
                                     List<YangAugment> augList =
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
index 380c9cf..3d6f507 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
@@ -169,20 +169,31 @@
     }
 
     @Override
-    public void registerAnydataSchema(ModelObjectId ac, ModelObjectId cc) throws
+    public void registerAnydataSchema(ModelObjectId aid, ModelObjectId cid) throws
             IllegalArgumentException {
-        ModIdToRscIdConverter idConverter = new ModIdToRscIdConverter(this);
-        YangSchemaNode anySchema = ((YangSchemaNode) idConverter.fetchResourceId(ac).appInfo());
-        if (anySchema != null && anySchema.getYangSchemaNodeType() == YANG_ANYDATA_NODE) {
-            YangSchemaNode cSchema = ((YangSchemaNode) idConverter.fetchResourceId(cc).appInfo());
-            if (cSchema != null) {
-                YangSchemaNode clonedNode = anySchema.addSchema(cSchema);
-                updateTreeContext(clonedNode, null, false, false);
+        YangSchemaNode anySchema = null;
+        try {
+            ModIdToRscIdConverter conv = new ModIdToRscIdConverter(this);
+            anySchema = ((YangSchemaNode) conv.fetchResourceId(aid).appInfo());
+            if (anySchema != null &&
+                    anySchema.getYangSchemaNodeType() == YANG_ANYDATA_NODE) {
+                YangSchemaNode cSchema = ((YangSchemaNode) conv
+                        .fetchResourceId(cid).appInfo());
+                if (cSchema != null) {
+                    YangSchemaNode clonedNode = anySchema.addSchema(cSchema);
+                    updateTreeContext(clonedNode, null, false, false);
+                } else {
+                    throw new IllegalArgumentException(errorMsg(FMT_INV, cid));
+                }
             } else {
-                throw new IllegalArgumentException(errorMsg(FMT_INV, cc));
+                throw new IllegalArgumentException(errorMsg(FMT_INV, aid));
             }
-        } else {
-            throw new IllegalArgumentException(errorMsg(FMT_INV, ac));
+        } catch (ModelConverterException e) {
+            ModelObjectId id = cid;
+            if (anySchema == null) {
+                id = aid;
+            }
+            throw new IllegalArgumentException(errorMsg(FMT_INV, id));
         }
     }
 
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobYangPushAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobYangPushAnydataTest.java
new file mode 100644
index 0000000..fb7af4f
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobYangPushAnydataTest.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.runtime.impl;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.yrtietfinterfaces.rev20140508.yrtietfinterfaces.DefaultInterfacesState;
+import org.onosproject.yang.gen.v1.yrtietfinterfaces.rev20140508.yrtietfinterfaces.interfacesstate.YangAutoPrefixInterface;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.DefaultYangPatch;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.DefaultEdit;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.Edit;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.edit.DefaultValue;
+import org.onosproject.yang.gen.v11.yrtietfyangpush.rev20161028.yrtietfyangpush.DefaultPushChangeUpdate;
+import org.onosproject.yang.gen.v11.yrtietfyangpush.rev20161028.yrtietfyangpush.pushchangeupdate.DefaultDatastoreChanges;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultResourceData;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.ResourceData;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.runtime.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.impl.serializerhelper.YangPushPatchAnydataTest.yangPushDataTree;
+
+/**
+ * Tests the YANG object building for the YANG data nodes based on the non
+ * schema augmented nodes.
+ */
+public class YobYangPushAnydataTest {
+    TestYangSerializerContext context = new TestYangSerializerContext();
+
+    @Test
+    public void anydataTest() {
+        DataNode.Builder dBlr = initializeDataNode(context);
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultPushChangeUpdate.class)
+                .addChild(DefaultDatastoreChanges.class)
+                .build();
+        ModelObjectId id2 = new ModelObjectId.Builder()
+                .addChild(DefaultYangPatch.class).build();
+
+        ModelObjectId id1 = new ModelObjectId.Builder()
+                .addChild(DefaultPushChangeUpdate.class)
+                .addChild(DefaultDatastoreChanges.class)
+                .addChild(DefaultYangPatch.class)
+                .addChild(DefaultEdit.class, null)
+                .addChild(DefaultValue.class)
+                .build();
+        ModelObjectId id3 = new ModelObjectId.Builder()
+                .addChild(DefaultInterfacesState.class)
+                .build();
+        context.getRegistry().registerAnydataSchema(id, id2);
+        context.getRegistry().registerAnydataSchema(id1, id3);
+        DataNode dataNode = yangPushDataTree(dBlr);
+
+        ResourceData data = DefaultResourceData.builder()
+                .addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(context.getRegistry());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultPushChangeUpdate update = ((DefaultPushChangeUpdate) modelObject);
+        assertThat(update.subscriptionId().toString(), is("89"));
+        DefaultDatastoreChanges changes = ((DefaultDatastoreChanges) update
+                .datastoreChanges());
+
+        List<InnerModelObject> patch = changes.anydata(DefaultYangPatch.class);
+        assertThat(((DefaultYangPatch) patch.get(0)).patchId().toString(), is("1"));
+
+        Edit edit = ((DefaultYangPatch) patch.get(0)).edit().get(0);
+        assertThat(edit.editId().toString(), is("edit1"));
+        assertThat(edit.operation().toString(), is("merge"));
+        assertThat(edit.target().toString(), is("/ietf-interfaces/interfaces-state"));
+
+        DefaultValue val = (DefaultValue) edit.value();
+        List<InnerModelObject> interState = val.anydata(DefaultInterfacesState.class);
+        YangAutoPrefixInterface interfaces =
+                ((DefaultInterfacesState) interState.get(0)).yangAutoPrefixInterface().get(0);
+        assertThat(interfaces.name(), is("eth0"));
+        assertThat(interfaces.operStatus().toString(), is("down"));
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbYangPushAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbYangPushAnydataTest.java
new file mode 100644
index 0000000..f8246bf
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbYangPushAnydataTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.runtime.impl;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onosproject.yang.gen.v1.yrtietfeventnotifications.rev20161027.yrtietfeventnotifications.SubscriptionId;
+import org.onosproject.yang.gen.v1.yrtietfinterfaces.rev20140508.yrtietfinterfaces.DefaultInterfacesState;
+import org.onosproject.yang.gen.v1.yrtietfinterfaces.rev20140508.yrtietfinterfaces.interfacesstate.DefaultYangAutoPrefixInterface;
+import org.onosproject.yang.gen.v1.yrtietfinterfaces.rev20140508.yrtietfinterfaces.interfacesstate.YangAutoPrefixInterface;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.TargetResourceOffset;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.DefaultYangPatch;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.DefaultEdit;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.edit.DefaultValue;
+import org.onosproject.yang.gen.v11.yrtietfyangpush.rev20161028.yrtietfyangpush.DefaultPushChangeUpdate;
+import org.onosproject.yang.gen.v11.yrtietfyangpush.rev20161028.yrtietfyangpush.pushchangeupdate.DefaultDatastoreChanges;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultModelObjectData.Builder;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaId;
+
+import java.util.List;
+
+import static org.onosproject.yang.gen.v1.yrtietfinterfaces.rev20140508.yrtietfinterfaces.interfacesstate.yangautoprefixinterface.OperStatusEnum.DOWN;
+import static org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.edit.OperationEnum.MERGE;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+import static org.onosproject.yang.runtime.impl.serializerhelper.YangPushPatchAnydataTest.validatePushDataNodeTree;
+
+/**
+ * Unit test cases for resource id conversion from model object id.
+ */
+public class YtbYangPushAnydataTest {
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+    private ResourceData rscData;
+    private DefaultDataTreeBuilder treeBuilder;
+    private ResourceId id;
+    private List<NodeKey> keys;
+    private SchemaId sid;
+    private ModelObjectId mid;
+    private Builder data;
+    DefaultYangModelRegistry reg;
+
+    /**
+     * Prior setup for each UT.
+     */
+    @Before
+    public void setUp() {
+        processSchemaRegistry();
+        reg = registry();
+        treeBuilder = new DefaultDataTreeBuilder(reg);
+    }
+
+
+    /**
+     * Processes anydata with augmented node as child.
+     */
+    @Test
+    public void processAnydataTest() {
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultPushChangeUpdate.class)
+                .addChild(DefaultDatastoreChanges.class)
+                .build();
+        ModelObjectId id2 = new ModelObjectId.Builder()
+                .addChild(DefaultYangPatch.class).build();
+
+        ModelObjectId id1 = new ModelObjectId.Builder()
+                .addChild(DefaultPushChangeUpdate.class)
+                .addChild(DefaultDatastoreChanges.class)
+                .addChild(DefaultYangPatch.class)
+                .addChild(DefaultEdit.class, null)
+                .addChild(DefaultValue.class)
+                .build();
+        ModelObjectId id3 = new ModelObjectId.Builder()
+                .addChild(DefaultInterfacesState.class)
+                .build();
+        reg.registerAnydataSchema(id, id2);
+        reg.registerAnydataSchema(id1, id3);
+
+        DefaultPushChangeUpdate update = new DefaultPushChangeUpdate();
+        long val = 89;
+        update.subscriptionId(new SubscriptionId(val));
+
+        DefaultDatastoreChanges changes = new DefaultDatastoreChanges();
+        DefaultYangPatch patch = new DefaultYangPatch();
+        patch.patchId("1");
+        DefaultEdit edit = new DefaultEdit();
+        edit.editId("edit1");
+        edit.operation(MERGE);
+        edit.target(new TargetResourceOffset("/ietf-interfaces/interfaces-state"));
+
+        DefaultInterfacesState state = new DefaultInterfacesState();
+        YangAutoPrefixInterface inter = new DefaultYangAutoPrefixInterface();
+        inter.name("eth0");
+        inter.operStatus(DOWN);
+        state.addToYangAutoPrefixInterface(inter);
+
+        DefaultValue value = new DefaultValue();
+        value.addAnydata(state);
+        edit.value(value);
+        patch.addToEdit(edit);
+        changes.addAnydata(patch);
+        update.datastoreChanges(changes);
+
+        data = new Builder();
+        data.addModelObject(update);
+        rscData = treeBuilder.getResourceData(data.build());
+
+        List<DataNode> nodes = rscData.dataNodes();
+        DataNode n = nodes.get(0);
+        validatePushDataNodeTree(n, true);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AnydataNegativeScenarioTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AnydataNegativeScenarioTest.java
index 644cabc..b6646dc 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AnydataNegativeScenarioTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AnydataNegativeScenarioTest.java
@@ -16,12 +16,22 @@
 
 package org.onosproject.yang.runtime.impl.serializerhelper;
 
-import org.onosproject.yang.gen.v11.listanydata.rev20160624.ListAnydataOpParam;
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.check.check.DefaultList52;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.DefaultNetworks;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.DefaultNetwork;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.DefaultNode;
+import org.onosproject.yang.gen.v11.anytest.rev20160624.AnyTestOpParam;
+import org.onosproject.yang.gen.v11.anytest.rev20160624.anytest.DefaultC1;
+import org.onosproject.yang.gen.v11.anytest.rev20160624.anytest.c1.DefaultMydata2;
+import org.onosproject.yang.gen.v11.listanydata.rev20160624.listanydata.DefaultL1;
+import org.onosproject.yang.gen.v11.listanydata.rev20160624.listanydata.l1.DefaultMydata;
 import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObjectId;
 import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
 
 import static org.junit.Assert.assertEquals;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.INVAL_ANYDATA;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.FMT_INV;
 
 /**
  * Tests the serializer helper methods.
@@ -39,16 +49,22 @@
      * Test anydata add to data node negative test scenario when given
      * referenced node is not of type anydata.
      */
-//    @Test
+    @Test
     public void addToDataTest() {
         boolean isExpOccurred = false;
-//        context.getContext();
-//        try {
-//            context.getRegistry().registerAnydataSchema(Node.class, Node.class);
-//        } catch (IllegalArgumentException e) {
-//            isExpOccurred = true;
-//            assertEquals(e.getMessage(), String.format(FMT_INV, Node.class));
-//        }
+        context.getContext();
+        ModelObjectId id1 = null;
+        try {
+            id1 = new ModelObjectId.Builder()
+                    .addChild(DefaultNetworks.class)
+                    .addChild(DefaultNetwork.class, null)
+                    .addChild(DefaultNode.class, null)
+                    .build();
+            context.getRegistry().registerAnydataSchema(id1, id1);
+        } catch (IllegalArgumentException e) {
+            isExpOccurred = true;
+            assertEquals(e.getMessage(), String.format(FMT_INV, id1));
+        }
         assertEquals(isExpOccurred, true);
     }
 
@@ -56,17 +72,23 @@
      * Test anydata add to data node negative test scenario when given
      * referenced node module is not registered.
      */
-//    @Test
+    @Test
     public void addToData2Test() {
         boolean isExpOccurred = false;
         context.getContext();
+        ModelObjectId id1 = null;
         try {
-//            context.getRegistry().registerAnydataSchema(Mydata.class,
-//                                                        ListAnydataOpParam.class);
+            ModelObjectId id = new ModelObjectId.Builder()
+                    .addChild(DefaultC1.class).addChild(DefaultMydata2.class)
+                    .build();
+            id1 = new ModelObjectId.Builder()
+                    .addChild(AnyTestOpParam.class)
+                    .build();
+            context.getRegistry().registerAnydataSchema(id, id1);
         } catch (IllegalArgumentException e) {
             isExpOccurred = true;
             assertEquals(e.getMessage(), String.format(
-                    INVAL_ANYDATA, ListAnydataOpParam.class));
+                    FMT_INV, id1));
         }
         assertEquals(isExpOccurred, true);
     }
@@ -76,18 +98,24 @@
      * Test anydata add to data node negative test scenario when given
      * referenced node is not of type list/container.
      */
-//    @Test
+    @Test
     public void addToData3Test() {
         boolean isExpOccurred = false;
         context.getContext();
-//        try {
-//            context.getRegistry().registerAnydataSchema(Mydata.class,
-//                                                        ListAnydata.class);
-//        } catch (IllegalArgumentException e) {
-//            isExpOccurred = true;
-//            assertEquals(e.getMessage(), String.format(
-//                    INVAL_ANYDATA, ListAnydata.class));
-//        }
+        ModelObjectId id = null;
+        try {
+            id = new ModelObjectId.Builder()
+                    .addChild(AnyTestOpParam.class)
+                    .build();
+            ModelObjectId id1 = new ModelObjectId.Builder()
+                    .addChild(DefaultL1.class, null)
+                    .addChild(DefaultMydata.class)
+                    .build();
+            context.getRegistry().registerAnydataSchema(id1, id);
+        } catch (IllegalArgumentException e) {
+            isExpOccurred = true;
+            assertEquals(e.getMessage(), String.format(FMT_INV, id));
+        }
         assertEquals(isExpOccurred, true);
     }
 
@@ -95,18 +123,50 @@
      * Test anydata add to data node negative test scenario when given
      * referenced node is not of type list/container.
      */
-//    @Test
+    @Test
     public void addToData4Test() {
         boolean isExpOccurred = false;
-//        context.getContext();
-//        try {
-//            context.getRegistry().registerAnydataSchema(Mydata.class,
-//                                                        List52Keys.class);
-//        } catch (IllegalArgumentException e) {
-//            isExpOccurred = true;
-//            assertEquals(e.getMessage(), String.format(
-//                    INVAL_ANYDATA, List52Keys.class.getCanonicalName()));
-//        }
+        context.getContext();
+        ModelObjectId id = null;
+        try {
+            id = new ModelObjectId.Builder()
+                    .addChild(DefaultList52.class)
+                    .build();
+            ModelObjectId id1 = new ModelObjectId.Builder()
+                    .addChild(DefaultL1.class, null)
+                    .addChild(DefaultMydata.class)
+                    .build();
+            context.getRegistry().registerAnydataSchema(id1, id);
+        } catch (IllegalArgumentException e) {
+            isExpOccurred = true;
+            assertEquals(e.getMessage(), String.format(
+                    FMT_INV, id));
+        }
+        assertEquals(isExpOccurred, true);
+    }
+
+    /**
+     * Test anydata add to data node negative test scenario when given
+     * referenced identifer is invalid for anydata.
+     */
+    @Test
+    public void addToData5Test() {
+        boolean isExpOccurred = false;
+        context.getContext();
+        ModelObjectId id = null;
+        try {
+            id = new ModelObjectId.Builder()
+                    .addChild(DefaultC1.class).addChild(DefaultMydata.class)
+                    .build();
+            ModelObjectId id1 = new ModelObjectId.Builder()
+                    .addChild(AnyTestOpParam.class)
+                    .build();
+            context.getRegistry().registerAnydataSchema(id, id1);
+        } catch (IllegalArgumentException e) {
+            isExpOccurred = true;
+            assertEquals(e.getMessage(), String.format(
+                    FMT_INV, id));
+        }
         assertEquals(isExpOccurred, true);
     }
 }
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/YangPushPatchAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/YangPushPatchAnydataTest.java
new file mode 100644
index 0000000..b0aa212
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/YangPushPatchAnydataTest.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.runtime.impl.serializerhelper;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.yrtietfinterfaces.rev20140508.yrtietfinterfaces.DefaultInterfacesState;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.DefaultYangPatch;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.DefaultEdit;
+import org.onosproject.yang.gen.v11.yrtietfyangpatch.rev20170222.yrtietfyangpatch.yangpatch.yangpatch.edit.DefaultValue;
+import org.onosproject.yang.gen.v11.yrtietfyangpush.rev20161028.yrtietfyangpush.DefaultPushChangeUpdate;
+import org.onosproject.yang.gen.v11.yrtietfyangpush.rev20161028.yrtietfyangpush.pushchangeupdate.DefaultDatastoreChanges;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
+
+import java.util.Iterator;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.SerializerHelper.addDataNode;
+import static org.onosproject.yang.runtime.SerializerHelper.exitDataNode;
+import static org.onosproject.yang.runtime.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.INTERF_NS;
+import static org.onosproject.yang.runtime.impl.TestUtils.PATCH_NS;
+import static org.onosproject.yang.runtime.impl.TestUtils.PUSH_NS;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
+
+/**
+ * Tests the serializer helper methods.
+ */
+public class YangPushPatchAnydataTest {
+
+
+    private static final String[] EXPECTED = {
+            "Entry Node is /.",
+            "Entry Node is push-change-update.",
+            "Entry Node is subscription-id.",
+            "Exit Node is subscription-id.",
+            "Entry Node is datastore-changes.",
+            "Entry Node is yang-patch.",
+            "Entry Node is patch-id.",
+            "Exit Node is patch-id.",
+            "Entry Node is edit.",
+            "Entry Node is edit-id.",
+            "Exit Node is edit-id.",
+            "Entry Node is operation.",
+            "Exit Node is operation.",
+            "Entry Node is target.",
+            "Exit Node is target.",
+            "Entry Node is value.",
+            "Entry Node is interfaces-state.",
+            "Entry Node is interface.",
+            "Entry Node is name.",
+            "Exit Node is name.",
+            "Entry Node is oper-status.",
+            "Exit Node is oper-status.",
+            "Exit Node is interface.",
+            "Exit Node is interfaces-state.",
+            "Exit Node is value.",
+            "Exit Node is edit.",
+            "Exit Node is yang-patch.",
+            "Exit Node is datastore-changes.",
+            "Exit Node is push-change-update.",
+            "Exit Node is /."
+    };
+
+    /**
+     * Test anydata add to data node builder.
+     */
+    @Test
+    public void yangPushDataNodeTest() {
+
+        TestYangSerializerContext context = new TestYangSerializerContext();
+        DataNode.Builder dBlr = initializeDataNode(context);
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultPushChangeUpdate.class)
+                .addChild(DefaultDatastoreChanges.class)
+                .build();
+        ModelObjectId id2 = new ModelObjectId.Builder()
+                .addChild(DefaultYangPatch.class).build();
+
+        ModelObjectId id1 = new ModelObjectId.Builder()
+                .addChild(DefaultPushChangeUpdate.class)
+                .addChild(DefaultDatastoreChanges.class)
+                .addChild(DefaultYangPatch.class)
+                .addChild(DefaultEdit.class, null)
+                .addChild(DefaultValue.class)
+                .build();
+        ModelObjectId id3 = new ModelObjectId.Builder()
+                .addChild(DefaultInterfacesState.class)
+                .build();
+        context.getRegistry().registerAnydataSchema(id, id2);
+        context.getRegistry().registerAnydataSchema(id1, id3);
+        DataNode n = yangPushDataTree(dBlr);
+        validatePushDataNodeTree(n, false);
+        walkINTree(n, EXPECTED);
+    }
+
+    /**
+     * Creates the data node tree for actn anydata test case.
+     *
+     * @param dBlr data node builder
+     */
+    public static DataNode yangPushDataTree(DataNode.Builder dBlr) {
+
+        String value = null;
+        // Adding container configuration-schedules
+        dBlr = addDataNode(dBlr, "push-change-update", PUSH_NS, value, null);
+        value = "89";
+        dBlr = addDataNode(dBlr, "subscription-id", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        // Adding anydata container
+        value = null;
+        dBlr = addDataNode(dBlr, "datastore-changes", null, value, null);
+
+        dBlr = addDataNode(dBlr, "yang-patch", PATCH_NS, value, null);
+        value = "1";
+        dBlr = addDataNode(dBlr, "patch-id", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = null;
+        dBlr = addDataNode(dBlr, "edit", null, value, null);
+        value = "edit1";
+        dBlr = addDataNode(dBlr, "edit-id", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "merge";
+        dBlr = addDataNode(dBlr, "operation", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "/ietf-interfaces/interfaces-state";
+        dBlr = addDataNode(dBlr, "target", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        // Adding anydata container
+        value = null;
+        dBlr = addDataNode(dBlr, "value", null, value, null);
+        dBlr = addDataNode(dBlr, "interfaces-state", INTERF_NS, value, null);
+        dBlr = addDataNode(dBlr, "interface", null, value, null);
+        value = "eth0";
+        dBlr = addDataNode(dBlr, "name", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "down";
+        dBlr = addDataNode(dBlr, "oper-status", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        dBlr = exitDataNode(dBlr); // interface
+        dBlr = exitDataNode(dBlr); // interfaces-state
+        dBlr = exitDataNode(dBlr); // value
+        dBlr = exitDataNode(dBlr); // edit
+        dBlr = exitDataNode(dBlr); // yang-patch
+        dBlr = exitDataNode(dBlr); // datastore-changes
+        dBlr = exitDataNode(dBlr); // push-change-update
+
+        return dBlr.build();
+    }
+
+    /**
+     * Validates the given data node sub-tree.
+     *
+     * @param node  data node which needs to be validated
+     * @param isYtb is it YTB call as tree comes from YTB will not be having
+     *              "/" as parent node
+     */
+    public static void validatePushDataNodeTree(DataNode node, boolean isYtb) {
+        // Validating the data node.
+        DataNode n = node;
+        Iterator<DataNode> it;
+        if (!isYtb) {
+            validateDataNode(n, "/", null,
+                             SINGLE_INSTANCE_NODE, true, null);
+            it = ((InnerNode) n).childNodes().values().iterator();
+            n = it.next();
+        }
+        validateDataNode(n, "push-change-update", PUSH_NS,
+                         SINGLE_INSTANCE_NODE, true, null);
+        it = ((InnerNode) n).childNodes().values().iterator();
+        n = it.next();
+        validateDataNode(n, "subscription-id", PUSH_NS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "89");
+        n = it.next();
+        validateDataNode(n, "datastore-changes", PUSH_NS,
+                         SINGLE_INSTANCE_NODE, true, null);
+
+        Iterator<DataNode> it1 = ((InnerNode) n).childNodes().values()
+                .iterator();
+        n = it1.next();
+        validateDataNode(n, "yang-patch", PATCH_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+        it1 = ((InnerNode) n).childNodes().values().iterator();
+        n = it1.next();
+        validateDataNode(n, "patch-id", PATCH_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "1");
+
+        n = it1.next();
+        validateDataNode(n, "edit", PATCH_NS, MULTI_INSTANCE_NODE,
+                         true, null);
+
+        Iterator<DataNode> it3 = ((InnerNode) n).childNodes().values()
+                .iterator();
+        n = it3.next();
+        validateDataNode(n, "edit-id", PATCH_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "edit1");
+        n = it3.next();
+        validateDataNode(n, "operation", PATCH_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "merge");
+        n = it3.next();
+        validateDataNode(n, "target", PATCH_NS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "/ietf-interfaces/interfaces-state");
+
+        n = it3.next();
+        validateDataNode(n, "value", PATCH_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+
+        it3 = ((InnerNode) n).childNodes().values().iterator();
+        n = it3.next();
+        validateDataNode(n, "interfaces-state", INTERF_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+        it3 = ((InnerNode) n).childNodes().values().iterator();
+        n = it3.next();
+        validateDataNode(n, "interface", INTERF_NS, MULTI_INSTANCE_NODE,
+                         true, null);
+        it3 = ((InnerNode) n).childNodes().values().iterator();
+        n = it3.next();
+        validateDataNode(n, "name", INTERF_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "eth0");
+        n = it3.next();
+        validateDataNode(n, "oper-status", INTERF_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "down");
+    }
+}
