[ONOS-7064] Yang Runtime support for Anydata code base

Change-Id: I6e3cde428e730b553b9b73700519bc749760148d
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/AugmentedSchemaInfo.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/AugmentedSchemaInfo.java
new file mode 100644
index 0000000..474526c
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/AugmentedSchemaInfo.java
@@ -0,0 +1,59 @@
+/*
+ * 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.compiler.datamodel;
+
+/**
+ * Represents augmented node schema info to maintain the information for augment
+ * schema node and its index position in given class canonical name array
+ * splitted with '.' to refer which node needs to be linked as anydata
+ * contained node.
+ */
+public class AugmentedSchemaInfo {
+
+    int position;
+    YangSchemaNode schemaNode;
+
+    /**
+     * Creates a instance of augmented node schema info.
+     *
+     * @param s YANG schema node of augmented node
+     * @param p index position in given class canonical name
+     */
+    public AugmentedSchemaInfo(YangSchemaNode s, int p) {
+        position = p;
+        schemaNode = s;
+    }
+
+    /**
+     * Returns the position of given class canonical name till the current
+     * schema.
+     *
+     * @return position of given class canonical name
+     */
+    public int getPosition() {
+        return position;
+    }
+
+    /**
+     * Returns the YANG schema node of the augmented node.
+     *
+     * @return YANG schema node
+     */
+    public YangSchemaNode getSchemaNode() {
+        return schemaNode;
+    }
+}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java
index 9a8ba06..afe630c 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java
@@ -156,7 +156,7 @@
 
     @Override
     public YangSchemaNodeType getYangSchemaNodeType() {
-        return YangSchemaNodeType.YANG_SINGLE_INSTANCE_NODE;
+        return YangSchemaNodeType.YANG_ANYDATA_NODE;
     }
 
     /**
@@ -372,4 +372,23 @@
             throw new IllegalArgumentException(e.getMessage());
         }
     }
+
+    @Override
+    public YangSchemaNode addSchema(YangSchemaNode containedSchema) throws
+            IllegalArgumentException {
+        YangNode nodeToClone = (YangNode) containedSchema;
+        try {
+            cloneSubTree(nodeToClone.getParent(), this, null,
+                         false, nodeToClone);
+        } catch (DataModelException e) {
+            throw new IllegalArgumentException(e);
+        }
+        YangNode child = getChild();
+        // Contained Schema Name
+        String name = containedSchema.getName();
+        while (child.getName() != name) {
+            child = child.getNextSibling();
+        }
+        return child;
+    }
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeaf.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeaf.java
index 612587c..3f7ede6 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeaf.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeaf.java
@@ -33,6 +33,7 @@
 import java.util.Map;
 
 import static org.onosproject.yang.compiler.datamodel.YangStatusType.CURRENT;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.E_INVALID;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getLeafTypeByDataType;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.validateEmptyDataType;
 
@@ -692,4 +693,15 @@
     public void setRootContext(SchemaContext context) {
         parentContext = context;
     }
+
+    @Override
+    public Map<YangSchemaNodeIdentifier, YangSchemaNodeContextInfo> getYsnContextInfoMap() {
+        throw new IllegalArgumentException(E_INVALID);
+    }
+
+    @Override
+    public YangSchemaNode addSchema(YangSchemaNode containedSchema)
+            throws IllegalArgumentException {
+        throw new IllegalArgumentException(E_INVALID);
+    }
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeafList.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeafList.java
index f406a57..c42a6bf 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeafList.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangLeafList.java
@@ -33,6 +33,7 @@
 import java.util.Map;
 
 import static org.onosproject.yang.compiler.datamodel.YangStatusType.CURRENT;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.E_INVALID;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getLeafTypeByDataType;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.validateEmptyDataType;
 
@@ -687,4 +688,15 @@
     public void setDefaultDenyAll(boolean defaultDenyAll) {
         this.defaultDenyAll = defaultDenyAll;
     }
+
+    @Override
+    public Map<YangSchemaNodeIdentifier, YangSchemaNodeContextInfo> getYsnContextInfoMap() {
+        throw new IllegalArgumentException(E_INVALID);
+    }
+
+    @Override
+    public YangSchemaNode addSchema(YangSchemaNode containedSchema)
+            throws IllegalArgumentException {
+        throw new IllegalArgumentException(E_INVALID);
+    }
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
index 937d9f7..8a33060 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
@@ -38,6 +38,7 @@
 import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_USES_AUGMENT;
 import static org.onosproject.yang.compiler.datamodel.YangSchemaNodeType.YANG_SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getAugSchemaInfo;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.linkInterFileReferences;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.resolveLinkingForResolutionList;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.updateMap;
@@ -973,4 +974,10 @@
     public void setRpcPresent(boolean rpcPresent) {
         isRpcPresent = rpcPresent;
     }
+
+    @Override
+    public AugmentedSchemaInfo getAugmentedSchemaInfo(String s)
+            throws IllegalArgumentException {
+        return getAugSchemaInfo(s, augmentResolutionList);
+    }
 }
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 48b739e..8be0fe9 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
@@ -491,17 +491,42 @@
      * @param isDeviation flag to check whether cloning is for deviation
      * @throws DataModelException data model error
      */
-    public static void cloneSubTree(YangNode srcRootNode, YangNode dstRootNode,
-                                    YangUses yangUses, boolean isDeviation)
+    public static void cloneGroupingTree(YangNode srcRootNode, YangNode dstRootNode,
+                                         YangUses yangUses, boolean isDeviation)
             throws DataModelException {
 
-        YangNode nextNodeToClone = srcRootNode;
-        TraversalType curTraversal;
+        cloneSubTree(srcRootNode, dstRootNode, yangUses, isDeviation, null);
+    }
 
+    /**
+     * 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.
+     *
+     * @param srcRootNode  source node for sub tree cloning
+     * @param dstRootNode  destination node where the sub tree needs to be cloned
+     * @param yangUses     YANG uses
+     * @param isDeviation  flag to check whether cloning is for deviation
+     * @param childToClone child to be cloned, null indicates all childs to
+     *                     be cloned
+     * @throws DataModelException data model error
+     */
+    public static void cloneSubTree(YangNode srcRootNode, YangNode dstRootNode,
+                                    YangUses yangUses, boolean isDeviation,
+                                    YangNode childToClone)
+            throws DataModelException {
+
+        YangNode nextNodeToClone;
+        TraversalType curTraversal;
         YangNode clonedTreeCurNode = dstRootNode;
         YangNode newNode = null;
 
-        nextNodeToClone = nextNodeToClone.getChild();
+        if (childToClone != null) {
+            nextNodeToClone = childToClone;
+        } else {
+            nextNodeToClone = srcRootNode.getChild();
+        }
+
         if (nextNodeToClone == null) {
             return;
         } else {
@@ -574,10 +599,14 @@
                      */
                     nextNodeToClone = nextNodeToClone.getChild();
                 } else if (nextNodeToClone.getNextSibling() != null) {
-
-                    curTraversal = SIBLING;
-
-                    nextNodeToClone = nextNodeToClone.getNextSibling();
+                    if (childToClone != null &&
+                            nextNodeToClone.getNextSibling().getParent() == srcRootNode) {
+                        curTraversal = PARENT;
+                        nextNodeToClone = nextNodeToClone.getParent();
+                    } else {
+                        curTraversal = SIBLING;
+                        nextNodeToClone = nextNodeToClone.getNextSibling();
+                    }
                 } else {
                     curTraversal = PARENT;
                     nextNodeToClone = nextNodeToClone.getParent();
@@ -826,11 +855,13 @@
      */
     public void setNameSpaceAndAddToParentSchemaMap() {
         // Get parent namespace.
-        if (getParent() != null) {
+        if (getParent() != null && getParent().getNodeType() != ANYDATA_NODE) {
             // Get parent namespace and set namespace for self node.
             setNameSpace(getParent().getNameSpace());
             // Process addition of leaf to the child schema map of parent.
             processAdditionOfSchemaNodeToParentMap(getName(), getNameSpace());
+        } else if (getParent() != null && getParent().getNodeType() == ANYDATA_NODE) {
+            processAdditionOfSchemaNodeToParentMap(getName(), getNameSpace());
         } else {
             // Module/Sub-module
             setNameSpace((YangNamespace) this);
@@ -1074,4 +1105,11 @@
             yangLeafList.setParentContext(context);
         }
     }
+
+    @Override
+    public YangSchemaNode addSchema(YangSchemaNode containedSchema)
+            throws IllegalArgumentException {
+        throw new IllegalArgumentException("Schema can only be added for " +
+                                                   "Anydata.");
+    }
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNode.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNode.java
index 22ea017..1444086 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNode.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNode.java
@@ -173,4 +173,21 @@
      * @param context schema context
      */
     void setRootContext(SchemaContext context);
+
+    /**
+     * Returns YANG schema node context info map.
+     *
+     * @return YANG schema node context info map
+     */
+    Map<YangSchemaNodeIdentifier, YangSchemaNodeContextInfo> getYsnContextInfoMap();
+
+    /**
+     * Adds schema to anydata.
+     *
+     * @param containedSchema schema to be added
+     * @return cloned YANG schema node
+     * @throws IllegalArgumentException when fails to do data model operations
+     */
+    YangSchemaNode addSchema(YangSchemaNode containedSchema)
+            throws IllegalArgumentException;
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNodeType.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNodeType.java
index 81fffc2..b4d1b18 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNodeType.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSchemaNodeType.java
@@ -61,6 +61,11 @@
     /**
      * Represents the Augmented Node.
      */
-    YANG_AUGMENT_NODE
+    YANG_AUGMENT_NODE,
+
+    /**
+     * Represents the Anydata Node.
+     */
+    YANG_ANYDATA_NODE
 
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
index 5c80900..abce15c 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
@@ -40,6 +40,7 @@
 import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_USES_AUGMENT;
 import static org.onosproject.yang.compiler.datamodel.YangSchemaNodeType.YANG_SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getAugSchemaInfo;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.linkInterFileReferences;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.resolveLinkingForResolutionList;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.updateMap;
@@ -980,4 +981,10 @@
     public void setRpcPresent(boolean rpcPresent) {
         isRpcPresent = rpcPresent;
     }
+
+    @Override
+    public AugmentedSchemaInfo getAugmentedSchemaInfo(String s)
+            throws IllegalArgumentException {
+        return getAugSchemaInfo(s, augmentResolutionList);
+    }
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangUses.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangUses.java
index 96c3ba9..0c872f6 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangUses.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangUses.java
@@ -447,7 +447,7 @@
         }
 
         try {
-            cloneSubTree(referredGrouping, usesParentNode, this, false);
+            cloneGroupingTree(referredGrouping, usesParentNode, this, false);
         } catch (DataModelException e) {
             throw new DataModelException(e.getMessage());
         }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java
index a6f7233..d9a2d4e 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.yang.compiler.datamodel;
 
+import java.util.List;
+
 /**
  * Abstraction of YANG version entity. It is used categories the node which
  * can hold the YANG version
@@ -28,4 +30,22 @@
      * @return the version
      */
     String getVersion();
+
+    /**
+     * Returns the list of imported modules.
+     *
+     * @return the list of imported modules
+     */
+    List<YangImport> getImportList();
+
+    /**
+     * Returns the augmented node schema info for given class canonical name.
+     *
+     * @param s class canonical name
+     * @return augmented node schema info
+     * @throws IllegalArgumentException when provided class canonical name is
+     *                                  not valid augment node path
+     */
+    AugmentedSchemaInfo getAugmentedSchemaInfo(String s)
+            throws IllegalArgumentException;
 }
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 e1caeb0..7a710b3 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
@@ -16,6 +16,7 @@
 
 package org.onosproject.yang.compiler.datamodel.utils;
 
+import org.onosproject.yang.compiler.datamodel.AugmentedSchemaInfo;
 import org.onosproject.yang.compiler.datamodel.CollisionDetector;
 import org.onosproject.yang.compiler.datamodel.ConflictResolveNode;
 import org.onosproject.yang.compiler.datamodel.DefaultYangNamespace;
@@ -56,6 +57,7 @@
 import org.onosproject.yang.compiler.datamodel.YangResolutionInfo;
 import org.onosproject.yang.compiler.datamodel.YangRpc;
 import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNodeContextInfo;
 import org.onosproject.yang.compiler.datamodel.YangSchemaNodeIdentifier;
 import org.onosproject.yang.compiler.datamodel.YangType;
 import org.onosproject.yang.compiler.datamodel.YangUnion;
@@ -101,6 +103,7 @@
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.EMPTY;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.ENUMERATION;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UNION;
+import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
 import static org.onosproject.yang.model.LeafType.BIG_DECIMAL;
 import static org.onosproject.yang.model.LeafType.BIG_INTEGER;
 import static org.onosproject.yang.model.LeafType.BOOLEAN;
@@ -136,6 +139,13 @@
     public static final String E_NOT_ALLOWED =
             "%s with the name %s in file %s at line %s is not allowed. Please" +
                     " 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.";
 
     /**
      * Creates a new data model tree utility.
@@ -1516,4 +1526,86 @@
                 " is already present " + "in file " + oldNode.getFileName() +
                 " at " + "line " + oldNode.getLineNumber() + "" + ".";
     }
+
+    /**
+     * Returns the augmented node schema info for given class canonical name.
+     *
+     * @param s                     class canonical name
+     * @param augmentResolutionList augment resolution list
+     * @return augmented node schema info
+     * @throws IllegalArgumentException when provided class canonical name is
+     *                                  not valid augment node path
+     */
+    public static AugmentedSchemaInfo getAugSchemaInfo(
+            String s, List<YangResolutionInfo> augmentResolutionList)
+            throws IllegalArgumentException {
+        String[] p1 = s.split(DOT_REGEX);
+
+        Iterator<YangResolutionInfo> it = augmentResolutionList.iterator();
+        while (it.hasNext()) {
+            YangNode node = ((YangNode) it.next().getEntityToResolveInfo()
+                    .getEntityToResolve());
+            String as = node.getJavaPackage();
+            // Splitting the augmented node package using '.'
+            String[] p2 = as.split(DOT_REGEX);
+            int i = p2.length;
+            int p1Len = p1.length;
+            StringBuilder sb = new StringBuilder();
+
+            /*
+             * This is to avoid unnecessary iteration if the entity to
+             * resolve splitted array last node is same as package need to be
+             * found last node then only proceed else go to next iteration.
+             *
+             * for example: if given class canonical name is
+             *  org.onosproject.yang.gen.v1.yrtnetworktopology
+             * .rev20151208.yrtnetworktopology.networks.network
+             * .augmentedndnetwork.Link
+             *
+             * so search needs to be till org.onosproject.yang.gen.v1
+             * .yrtnetworktopology.rev20151208.yrtnetworktopology.networks.network
+             * where the augmentedndnetwork represents the java name of the node
+             */
+            if (i <= p1Len - 2 && p2[i - 1].equals(p1[i - 1])) {
+                sb.append(QNAME_PRE);
+                for (int j = 4; j < i; j++) {
+                    sb.append(PERIOD);
+                    sb.append(p1[j]);
+                }
+                if (sb.toString().equals(as)) {
+                    int targetndex = i + 1;
+                    String name = p1[targetndex];
+
+                    // check for the last node does it starts with "Default"
+                    if (targetndex == p1Len - 1) {
+                        name = name.replaceFirst(DEFAULT, "");
+                    }
+
+                    /*
+                     * Once node is found then iterating threw the ysn context
+                     * info map to find targeted node
+                     */
+
+                    Map<YangSchemaNodeIdentifier, YangSchemaNodeContextInfo> m =
+                            node.getYsnContextInfoMap();
+                    if (!m.isEmpty()) {
+                        Iterator<YangSchemaNodeContextInfo> mapIt =
+                                m.values().iterator();
+                        while (mapIt.hasNext()) {
+                            YangSchemaNodeContextInfo in = mapIt.next();
+                            YangSchemaNode schema = in.getSchemaNode();
+                            if (schema instanceof SchemaDataNode) {
+                                if (schema.getJavaAttributeName()
+                                        .equalsIgnoreCase(name)) {
+                                    return new AugmentedSchemaInfo(
+                                            schema, targetndex);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        throw new IllegalArgumentException(errorMsg(INVAL_ANYDATA, s));
+    }
 }
diff --git a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/XpathLinkingTypes.java b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/XpathLinkingTypes.java
index 602247a..a37d1fd 100644
--- a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/XpathLinkingTypes.java
+++ b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/XpathLinkingTypes.java
@@ -33,5 +33,8 @@
     DEVIATION_LINKING,
 
     // Uses augment linking
-    USES_AUGMENT_LINKING
+    USES_AUGMENT_LINKING,
+
+    // Anydata linking
+    ANYDATA_LINKING
 }
diff --git a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java
index 37f2542..9e894dc 100644
--- a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java
+++ b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java
@@ -73,7 +73,7 @@
 import static org.onosproject.yang.compiler.datamodel.TraversalType.PARENT;
 import static org.onosproject.yang.compiler.datamodel.TraversalType.ROOT;
 import static org.onosproject.yang.compiler.datamodel.TraversalType.SIBLING;
-import static org.onosproject.yang.compiler.datamodel.YangNode.cloneSubTree;
+import static org.onosproject.yang.compiler.datamodel.YangNode.cloneGroupingTree;
 import static org.onosproject.yang.compiler.datamodel.YangPathArgType.ABSOLUTE_PATH;
 import static org.onosproject.yang.compiler.datamodel.YangPathArgType.RELATIVE_PATH;
 import static org.onosproject.yang.compiler.datamodel.exceptions.ErrorMessages.getErrorMsg;
@@ -1373,7 +1373,7 @@
         }
 
         // clone subtree
-        cloneSubTree(srcNode, dstNode, null, true);
+        cloneGroupingTree(srcNode, dstNode, null, true);
 
         /*
          * Cloning of deviated module is done, set isDeviatedNodeCloned
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 8a02940..27223f2 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
@@ -16,6 +16,7 @@
 
 package org.onosproject.yang.compiler.translator.tojava;
 
+import com.google.common.base.Throwables;
 import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
 import org.onosproject.yang.compiler.datamodel.SchemaDataNode;
 import org.onosproject.yang.compiler.datamodel.TraversalType;
@@ -26,13 +27,12 @@
 import org.onosproject.yang.compiler.datamodel.YangNodeType;
 import org.onosproject.yang.compiler.datamodel.YangNotification;
 import org.onosproject.yang.compiler.datamodel.YangOutput;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
 import org.onosproject.yang.compiler.datamodel.YangUses;
 import org.onosproject.yang.compiler.translator.exception.InvalidNodeForTranslatorException;
 import org.onosproject.yang.compiler.translator.exception.TranslatorException;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 
-import com.google.common.base.Throwables;
-
 import java.io.IOException;
 
 import static org.onosproject.yang.compiler.datamodel.TraversalType.CHILD;
@@ -66,10 +66,53 @@
     public static void translate(YangNode rootNode, YangPluginConfig yangPlugin,
                                  boolean codeGen)
             throws TranslatorException, IOException {
-        YangNode codeGenNode = rootNode;
-        TraversalType curTraversal = ROOT;
+        translateToJava(rootNode, yangPlugin, codeGen, true);
+    }
 
-        while (codeGenNode != null) {
+    /**
+     * Updates tree context including parent context and YsnContextInfoMap.
+     *
+     * @param rootNode          root node
+     * @param yangPlugin        YANG plugin configurations
+     * @param codeGen           true if code generation is required
+     * @param translateComplete true if translation is for complete tree
+     * @throws IllegalArgumentException when fails to set the parent context
+     *                                  for provided anydata contained node
+     */
+    public static void updateTreeContext(YangSchemaNode rootNode, YangPluginConfig
+            yangPlugin, boolean codeGen, boolean translateComplete)
+            throws IllegalArgumentException {
+        try {
+            translateToJava((YangNode) rootNode, yangPlugin, codeGen,
+                            translateComplete);
+        } catch (IOException e) {
+            throw new IllegalArgumentException("Updating parent context for "
+                                                       + rootNode.getName() +
+                                                       " failed.");
+        }
+    }
+
+    /**
+     * Translated YANG info to java info.
+     *
+     * @param rootNode          root node
+     * @param yangPlugin        YANG plugin configurations
+     * @param codeGen           true if code generation is required
+     * @param translateComplete true if translation is for complete tree
+     * @throws TranslatorException when fails to generate java code file the current node
+     * @throws IOException         when fails to do IO operations
+     */
+    private static void translateToJava(YangNode rootNode, YangPluginConfig
+            yangPlugin, boolean codeGen, boolean translateComplete)
+            throws TranslatorException, IOException {
+        YangNode codeGenNode = rootNode;
+        YangNode parentNode = null;
+        TraversalType curTraversal = ROOT;
+        if (!translateComplete) {
+            parentNode = rootNode.getParent();
+        }
+
+        while (codeGenNode != parentNode) {
             if (curTraversal != PARENT) {
                 if (!(codeGenNode instanceof JavaCodeGenerator)) {
                     throw new TranslatorException("Unsupported node to generate code " +
@@ -86,7 +129,9 @@
                         } else {
                             //this will update java file info for the target
                             // node.
-                            updateJavaInfo(codeGenNode, yangPlugin);
+                            if (translateComplete) {
+                                updateJavaInfo(codeGenNode, yangPlugin);
+                            }
                             if (codeGenNode instanceof YangNotification) {
                                 //to know in generated code what was the enum
                                 // name generated for current notification
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
index 9605aa7..783fcc3 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
@@ -16,6 +16,7 @@
 package org.onosproject.yang.compiler.translator.tojava;
 
 import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
+import org.onosproject.yang.compiler.datamodel.YangAnydata;
 import org.onosproject.yang.compiler.datamodel.YangAugment;
 import org.onosproject.yang.compiler.datamodel.YangAugmentableNode;
 import org.onosproject.yang.compiler.datamodel.YangCase;
@@ -76,10 +77,11 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGenerator.generateDefaultClassFile;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGenerator.generateInterfaceFile;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGenerator.generateKeyClassFile;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getAddToListMethodInterface;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
+import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getYangDataStructure;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAddToListMethodImpl;
-import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getAddToListMethodInterface;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getDefaultConstructorString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getEqualsMethod;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getFromStringMethod;
@@ -89,7 +91,6 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterForClass;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethod;
-import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getYangDataStructure;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getOverRideString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorErrorType.INVALID_LEAF_HOLDER;
@@ -98,6 +99,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorErrorType.MISSING_PARENT_NODE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getErrorMsg;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ANYDATA;
 import static org.onosproject.yang.compiler.utils.UtilConstants.AUGMENTABLE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS_STRING;
@@ -1565,8 +1567,14 @@
     public void generateJavaFile(int fileType, YangNode curNode)
             throws IOException {
 
-        addImportInfoOfNode(MODEL_OBJECT, MODEL_OBJECT_PKG, getGeneratedJavaClassName(),
-                            getJavaFileInfo().getPackage(), false);
+        if (curNode instanceof YangAnydata) {
+            addImportInfoOfNode(ANYDATA, MODEL_OBJECT_PKG,
+                                getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
+        } else {
+            addImportInfoOfNode(MODEL_OBJECT, MODEL_OBJECT_PKG, getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
+        }
 
         JavaQualifiedTypeInfoTranslator info = null;
         if (curNode instanceof YangAugmentableNode) {
@@ -1637,7 +1645,12 @@
             //add model object to extend list
             JavaQualifiedTypeInfoTranslator typeInfo = new
                     JavaQualifiedTypeInfoTranslator();
-            typeInfo.setClassInfo(MODEL_OBJECT);
+            if (curNode instanceof YangAnydata) {
+                typeInfo.setClassInfo(ANYDATA);
+            } else {
+                typeInfo.setClassInfo(MODEL_OBJECT);
+            }
+
             typeInfo.setForInterface(false);
             typeInfo.setPkgInfo(MODEL_OBJECT_PKG);
             typeInfo.setQualified(false);
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java
index 9ac00e5..598ac92 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java
@@ -23,7 +23,10 @@
 import org.onosproject.yang.compiler.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 
+import java.io.IOException;
+
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
+import static org.onosproject.yang.compiler.translator.tojava.YangJavaModelUtils.generateCodeAndUpdateInParent;
 
 /**
  * Represents container information extended to support java code generation.
@@ -105,17 +108,16 @@
      */
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
-        // TODO uncomment this part if code needs to be generated for anydata
-        //        try {
-//            generateCodeAndUpdateInParent(this, yangPlugin, false);
-//        } catch (IOException e) {
-//            throw new TranslatorException(
-//                    "Failed to prepare generate code entry for anydata node " +
-//                            getName() + " in " +
-//                            getLineNumber() + " at " +
-//                            getCharPosition()
-//                            + " in " + getFileName() + " " + e.getLocalizedMessage());
-//        }
+        try {
+            generateCodeAndUpdateInParent(this, yangPlugin, false);
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to generate code for " +
+                                                  "anydata node " +
+                                                  getName() + " in " +
+                                                  getLineNumber() + " at " +
+                                                  getCharPosition()
+                                                  + " in " + getFileName() + " " + e.getLocalizedMessage());
+        }
     }
 
     /**
@@ -125,17 +127,16 @@
      */
     @Override
     public void generateCodeExit() throws TranslatorException {
-        // TODO uncomment this part if code needs to be generated for anydata
-//        try {
-//            generateJava(GENERATE_INTERFACE_WITH_BUILDER, this);
-//        } catch (IOException e) {
-//            throw new TranslatorException("Failed to generate code for " +
-//                                                  "anydata node " +
-//                                                  getName() + " in " +
-//                                                  getLineNumber() + " at " +
-//                                                  getCharPosition()
-//                                                  + " in " + getFileName() +
-//                                                  " " + e.getLocalizedMessage());
-//        }
+        try {
+            getTempJavaCodeFragmentFiles().generateJavaFile(
+                    GENERATE_INTERFACE_WITH_BUILDER, this);
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to generate code for " +
+                                                  "anydata node " +
+                                                  getName() + " in " +
+                                                  getLineNumber() + " at " +
+                                                  getCharPosition()
+                                                  + " in " + getFileName() + " " + e.getLocalizedMessage());
+        }
     }
 }
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
index 811c8b6..0ddaf5b 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
@@ -1964,6 +1964,8 @@
     public static final String IDENTITY = "_identity";
     public static final String TYPEDEF = "_typedef";
 
+    public static final String ANYDATA = "Anydata";
+
     // Regex for model id validation
     public static final String REGEX = "[A-Za-z0-9_\\-.@]+";
 
diff --git a/model/src/main/java/org/onosproject/yang/model/Anydata.java b/model/src/main/java/org/onosproject/yang/model/Anydata.java
new file mode 100644
index 0000000..165bb4c
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/Anydata.java
@@ -0,0 +1,71 @@
+/*
+ * 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.model;
+
+import com.google.common.collect.ImmutableMap;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * Abstraction of anydata behavior generated anydata nodes interfaces
+ * will inherit it.
+ */
+public abstract class Anydata extends InnerModelObject {
+
+    private final ConcurrentMap<Class<? extends InnerModelObject>, InnerModelObject> anydatas =
+            new ConcurrentHashMap<>();
+
+    /**
+     * Adds the specified anydata to this model object.
+     *
+     * @param obj model object of anydata
+     */
+    public void addAnydata(InnerModelObject obj) {
+        anydatas.put(obj.getClass(), obj);
+    }
+
+    /**
+     * Removes the specified anydata to this model object.
+     *
+     * @param obj model object of anydata
+     */
+    public void removeAnydata(InnerModelObject obj) {
+        anydatas.remove(obj.getClass());
+    }
+
+    /**
+     * Returns the map of anydatas available to this model object.
+     *
+     * @return map of anydatas
+     */
+    public Map<Class<? extends InnerModelObject>, InnerModelObject> anydatas() {
+        return ImmutableMap.copyOf(anydatas);
+    }
+
+    /**
+     * Returns the anydata for to a given anydata class.
+     *
+     * @param c   anydata class
+     * @param <T> anydata class type
+     * @return anydata object if available, null otherwise
+     */
+    public <T extends InnerModelObject> T anydata(Class<T> c) {
+        return (T) anydatas.get(c);
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/AnydataHandler.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/AnydataHandler.java
new file mode 100644
index 0000000..6541e3e
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/AnydataHandler.java
@@ -0,0 +1,124 @@
+/*
+ * 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.onosproject.yang.compiler.datamodel.AugmentedSchemaInfo;
+import org.onosproject.yang.compiler.datamodel.SchemaDataNode;
+import org.onosproject.yang.compiler.datamodel.YangModule;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNodeContextInfo;
+
+import java.util.Iterator;
+
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.DOT_REGEX;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.INVAL_ANYDATA;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.QNAME_PRE;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.errorMsg;
+import static org.onosproject.yang.runtime.RuntimeHelper.PERIOD;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.REV_REGEX;
+
+public final class AnydataHandler {
+
+    /**
+     * Prevent creation of anydataHandler.
+     */
+    private AnydataHandler() {
+    }
+
+    /**
+     * Returns schema node corresponding to a given class.
+     *
+     * @param c   generated class
+     * @param reg YANG model registry
+     * @return module schema node
+     * @throws IllegalArgumentException when provided identifier is not
+     *                                  not valid
+     */
+    public static YangSchemaNode getSchemaNode(Class c,
+                                               DefaultYangModelRegistry reg) {
+        String cn = c.getCanonicalName();
+        String[] paths = cn.split(DOT_REGEX);
+        // index 6 always we the revision in the given class path if path
+        // contains the revision
+        int index = 6;
+        if (paths[index].matches(REV_REGEX)) {
+            index++;
+        }
+        StringBuilder sb = new StringBuilder();
+        sb.append(QNAME_PRE);
+        for (int i = 4; i <= index; i++) {
+            sb.append(PERIOD);
+            sb.append(paths[i]);
+        }
+        YangSchemaNode module = reg.getForRegClassQualifiedName(sb.toString(),
+                                                                false);
+
+        if (module == null) {
+            throw new IllegalArgumentException(errorMsg(INVAL_ANYDATA, c));
+        }
+
+        YangSchemaNode targetNode = getTargetNode(cn, paths, module, index + 1);
+        return targetNode;
+    }
+
+    /**
+     * Returns the targeted child node YANG schema from the given schema node.
+     *
+     * @param paths canonical name of class
+     * @param s     top level schema node
+     * @param index index of child in module
+     * @return targeted child node YANG schema
+     * @throws IllegalArgumentException when provided identifier is not
+     *                                  not valid
+     */
+    private static YangSchemaNode getTargetNode(
+            String cn, String[] paths, YangSchemaNode s,
+            int index) throws IllegalArgumentException {
+        int i = index;
+        YangSchemaNodeContextInfo info;
+        YangSchemaNode schema = s;
+
+        while (i < paths.length) {
+            Iterator<YangSchemaNodeContextInfo> it = schema.getYsnContextInfoMap()
+                    .values().iterator();
+            boolean isSuccess = false;
+            while (it.hasNext()) {
+                info = it.next();
+                schema = info.getSchemaNode();
+                if (schema instanceof SchemaDataNode) {
+                    if (schema.getJavaAttributeName().equalsIgnoreCase(paths[i])) {
+                        isSuccess = true;
+                        break;
+                    }
+                }
+            }
+            if (!isSuccess) {
+                // In case of augment the top level node will not be found in
+                // above iteration.
+                if (i == index && i < paths.length - 1) {
+                    AugmentedSchemaInfo in = ((YangModule) s).getAugmentedSchemaInfo(cn);
+                    i = in.getPosition();
+                    schema = in.getSchemaNode();
+                } else {
+                    throw new IllegalArgumentException(errorMsg(INVAL_ANYDATA, cn));
+                }
+            }
+            i++;
+        }
+        return schema;
+    }
+}
\ No newline at end of file
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java
index 8f7a11b..0f56b4b 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DataTreeBuilderHelper.java
@@ -28,6 +28,7 @@
 import org.onosproject.yang.compiler.datamodel.YangList;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.Anydata;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.InnerNode;
 import org.onosproject.yang.model.LeafNode;
@@ -43,6 +44,7 @@
 import static org.onosproject.yang.compiler.datamodel.TraversalType.PARENT;
 import static org.onosproject.yang.compiler.datamodel.TraversalType.ROOT;
 import static org.onosproject.yang.compiler.datamodel.TraversalType.SIBLING;
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.ANYDATA_NODE;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.nonEmpty;
 import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE;
 import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
@@ -64,6 +66,7 @@
 import static org.onosproject.yang.runtime.impl.ModelConverterUtil.isNodeProcessCompleted;
 import static org.onosproject.yang.runtime.impl.ModelConverterUtil.isNonProcessableNode;
 import static org.onosproject.yang.runtime.impl.ModelConverterUtil.isTypeEmpty;
+import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_LOAD_CLASS;
 
 
 /**
@@ -438,6 +441,7 @@
         }
 
         switch (curNode.getYangSchemaNodeType()) {
+            case YANG_ANYDATA_NODE:
             case YANG_SINGLE_INSTANCE_NODE:
                 curNodeInfo.type(SINGLE_INSTANCE_NODE);
                 nodeObj = processSingleInstanceNode(curNode, curNodeInfo,
@@ -696,6 +700,11 @@
      */
     Object getChildObject(YangNode curNode,
                           DataTreeNodeInfo parentNodeInfo) {
+        // check current node parent linking status if current node
+        if (curNode.getParent() != null && curNode.getParent()
+                .getNodeType() == ANYDATA_NODE) {
+            return getAnydataChildObject(curNode, parentNodeInfo);
+        }
         String nodeJavaName = curNode.getJavaAttributeName();
         Object parentObj = getParentObjectOfNode(parentNodeInfo,
                                                  curNode.getParent());
@@ -707,6 +716,42 @@
     }
 
     /**
+     * Returns the child object from the parent object for anydatad. Uses java
+     * name of the current node to search the attribute in the parent object.
+     *
+     * @param curNode current YANG node
+     * @param info    parent data tree node info
+     * @return object of the child node
+     */
+    private Object getAnydataChildObject(YangNode curNode,
+                                         DataTreeNodeInfo info) {
+        // Getting the curNode anydata parent object
+        Anydata parentObj = (Anydata) getParentObjectOfNode(
+                info, curNode.getParent());
+        List<Object> objs = new ArrayList<>();
+        YangSchemaNode node = reg.getForNameSpace(
+                curNode.getNameSpace().getModuleNamespace(), false);
+        // Getting the module class
+        Class<?> moduleClass = reg.getRegisteredClass(node);
+        if (moduleClass == null) {
+            throw new ModelConverterException(E_FAIL_TO_LOAD_CLASS + node
+                    .getJavaClassNameOrBuiltInType());
+        }
+
+        // Forming the default class name for the curNode object creation.
+        String className = curNode.getJavaPackage() + PERIOD + DEFAULT_CAPS +
+                getCapitalCase(curNode.getJavaAttributeName());
+        Class childClass;
+        try {
+            childClass = moduleClass.getClassLoader().loadClass(className);
+        } catch (ClassNotFoundException e) {
+            throw new ModelConverterException(E_FAIL_TO_LOAD_CLASS + className);
+        }
+        objs.add(parentObj.anydata(childClass));
+        return objs;
+    }
+
+    /**
      * Adds the child node to the data tree by taking operation type from the
      * object. Also, binds the object to the data node through data tree node
      * info.
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 c20fc12..7e95130 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
@@ -48,14 +48,24 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.Collections.sort;
 import static java.util.Collections.unmodifiableSet;
+import static org.onosproject.yang.compiler.datamodel.YangSchemaNodeType.YANG_ANYDATA_NODE;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getNodeIdFromSchemaId;
+import static org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorUtil.updateTreeContext;
 import static org.onosproject.yang.compiler.utils.UtilConstants.REGEX;
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
 import static org.onosproject.yang.runtime.RuntimeHelper.getNodes;
 import static org.onosproject.yang.runtime.RuntimeHelper.getSelfNodes;
 import static org.onosproject.yang.runtime.RuntimeHelper.getServiceName;
+import static org.onosproject.yang.runtime.impl.AnydataHandler.getSchemaNode;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.AT;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.E_MEXIST;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.E_NEXIST;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.E_NOT_VAL;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.E_NULL;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.FMT_INV;
+import static org.onosproject.yang.runtime.impl.UtilsConstants.errorMsg;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -63,14 +73,8 @@
  */
 public class DefaultYangModelRegistry implements YangModelRegistry,
         SingleInstanceNodeContext {
-
-    private static final String AT = "@";
-    private static final String E_NEXIST = "node with {} namespace not found.";
-    private static final String E_MEXIST =
-            "Model with given modelId already exist";
-    private static final String E_NULL = "Model must not be null";
-    private static final String E_NOT_VAL = "Model id is invalid";
     private final Logger log = getLogger(getClass());
+
     /*
      * Map for storing YANG schema nodes. Key will be the schema name of
      * module node defined in YANG file.
@@ -165,9 +169,20 @@
     }
 
     @Override
-    public void registerAnydataSchema(Class id, Class id1) throws
-            IllegalArgumentException{
-        //TODO implemention
+    public void registerAnydataSchema(Class ac, Class cc) throws
+            IllegalArgumentException {
+        YangSchemaNode anySchema = getSchemaNode(ac, this);
+        if (anySchema != null && anySchema.getYangSchemaNodeType() == YANG_ANYDATA_NODE) {
+            YangSchemaNode cSchema = getSchemaNode(cc, this);
+            if (cSchema != null) {
+                YangSchemaNode clonedNode = anySchema.addSchema(cSchema);
+                updateTreeContext(clonedNode, null, false, false);
+            } else {
+                throw new IllegalArgumentException(errorMsg(FMT_INV, cc));
+            }
+        } else {
+            throw new IllegalArgumentException(errorMsg(FMT_INV, ac));
+        }
     }
 
     @Override
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/UtilsConstants.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/UtilsConstants.java
new file mode 100644
index 0000000..13a67b2
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/UtilsConstants.java
@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+public final class UtilsConstants {
+
+    static final String AT = "@";
+    static final String E_NEXIST = "node with {} namespace not found.";
+    static final String E_MEXIST =
+            "Model with given modelId already exist";
+    static final String E_NULL = "Model must not be null";
+    static final String E_NOT_VAL = "Model id is invalid";
+    static final String REV_REGEX =
+            "rev([12]\\d{3}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01]))";
+    private static final String FMT_NOT_EXIST =
+            "Schema node with name %s doesn't exist.";
+    public static final String FMT_NREG =
+            "Node with requested %s identifier is not registered.";
+    public static final String FMT_INV =
+            "Requested %s identifier is invalid.";
+    public static final String E_NCLONE =
+            "Unenable to clone node with given identifer %s .";
+
+    // No instantiation.
+    private UtilsConstants() {
+    }
+
+    /**
+     * Returns the error string by filling the parameters in the given
+     * formatted error string.
+     *
+     * @param fmt    error format string
+     * @param params parameters to be filled in formatted string
+     * @return error string
+     */
+    public static String errorMsg(String fmt, Object... params) {
+        return String.format(fmt, params);
+    }
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandler.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandler.java
index f772742..bcdebf0 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandler.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobHandler.java
@@ -16,10 +16,13 @@
 
 package org.onosproject.yang.runtime.impl;
 
+import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.runtime.YangModelRegistry;
 
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.ANYDATA_NODE;
+import static org.onosproject.yang.runtime.impl.YobUtils.ANYDATA_SETTER;
 import static org.onosproject.yang.runtime.impl.YobUtils.getClassLoader;
 import static org.onosproject.yang.runtime.impl.YobUtils.getInstanceOfClass;
 import static org.onosproject.yang.runtime.impl.YobUtils.getQualifiedDefaultClass;
@@ -40,13 +43,25 @@
     YobWorkBench createObject(YangSchemaNode schemaNode,
                               DefaultYangModelRegistry reg) {
         YangSchemaNode node = schemaNode;
+        String setterName;
+        YangNode n = (YangNode) node;
+        /**
+         * if current node parent is anydata then it need to be added into
+         * anydata map, so in setter for same in parent will be addAnydata
+         */
+        if (n.getParent() != null && (n.getParent().getNodeType() ==
+                ANYDATA_NODE)) {
+            setterName = ANYDATA_SETTER;
+        } else {
+            setterName = schemaNode.getJavaAttributeName();
+        }
+
         while (node.getReferredSchema() != null) {
             node = node.getReferredSchema();
         }
 
         String qualName = getQualifiedDefaultClass(node);
         ClassLoader classLoader = getClassLoader(node, reg);
-        String setterName = schemaNode.getJavaAttributeName();
         Object builtObject = getInstanceOfClass(classLoader, qualName);
         return new YobWorkBench(classLoader, builtObject, setterName,
                                 schemaNode);
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobUtils.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobUtils.java
index 63505ad..3f10d34 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobUtils.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobUtils.java
@@ -83,6 +83,7 @@
     public static final String FORWARD_SLASH = "/";
     private static final Logger log = LoggerFactory.getLogger(YobUtils.class);
     private static final String ENUM_LEAF_IDENTIFIER = "$LeafIdentifier";
+    static final String ANYDATA_SETTER = "addAnydata";
 
     // no instantiation
     private YobUtils() {
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobWorkBench.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobWorkBench.java
index ddef955..63875e5 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobWorkBench.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/YobWorkBench.java
@@ -46,6 +46,7 @@
 import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_GET_FIELD;
 import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_GET_METHOD;
 import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_INVOKE_METHOD;
+import static org.onosproject.yang.runtime.impl.YobUtils.ANYDATA_SETTER;
 import static org.onosproject.yang.runtime.impl.YobUtils.getCapitalCase;
 import static org.onosproject.yang.runtime.impl.YobUtils.getInstanceOfClass;
 import static org.onosproject.yang.runtime.impl.YobUtils.getQualifiedDefaultClass;
@@ -221,6 +222,12 @@
         String parentClassName = parentClass.getName();
         try {
             Class<?> classType = null;
+            if (setter.equals(ANYDATA_SETTER)) {
+                Method method = parentClass.getSuperclass()
+                        .getDeclaredMethod(setter, InnerModelObject.class);
+                method.invoke(parentObj, curObj);
+                return;
+            }
             Field fieldName = parentClass.getDeclaredField(setter);
             if (fieldName != null) {
                 classType = fieldName.getType();
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
index 50acec5..f059e1f 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
@@ -60,7 +60,7 @@
     public static final String L_NAME = "list";
     public static final String LMNG = "yrt.Logistics-manager";
     public static final String LMNG_N = "Logistics-manager";
-
+    public static final String TANY_NS = "yrt:list.test.anydata";
     // Logger list is used for walker testing.
     private static final List<String> LOGGER = new ArrayList<>();
 
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
index c2f8f0e..ef73cc1 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
@@ -30,10 +30,23 @@
  */
 public class TestYangSerializerContext implements YangSerializerContext {
 
+    // Reference for YANG model registry
+    private DefaultYangModelRegistry reg;
+
+    /**
+     * Returns the YANG model registry.
+     *
+     * @return YANG model registry
+     */
+    public DefaultYangModelRegistry getRegistry() {
+        return reg;
+    }
+
     @Override
     public SchemaContext getContext() {
         processSchemaRegistry();
-        return registry();
+        reg = registry();
+        return reg;
     }
 
     @Override
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobAnydataTest.java
new file mode 100644
index 0000000..75b1544
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobAnydataTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.DefaultNode;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.node.SupportingNode;
+import org.onosproject.yang.gen.v1.yrtnetworktopology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
+import org.onosproject.yang.gen.v1.yrtnetworktopology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.ytbaugmentfromanotherfile.rev20160826.ytbaugmentfromanotherfile.networks.network.node.augmentedndnode.terminationpoint.SupportingTerminationPoint;
+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.anytest.rev20160624.anytest.c1.Mydata2;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultResourceData;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+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.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.IETFNS;
+import static org.onosproject.yang.runtime.impl.TestUtils.TANY_NS;
+
+/**
+ * Tests the YANG object building for the YANG data nodes based on the non
+ * schema augmented nodes.
+ */
+public class YobAnydataTest {
+    private static final String NW_TOPO_NAME_SPACE = "urn:ietf:params:xml:ns:yang:yrt-ietf-network-topology";
+    TestYangSerializerContext context = new TestYangSerializerContext();
+    DataNode.Builder dBlr;
+    String value;
+
+    public DataNode buildDnForAnydata() {
+        dBlr = initializeDataNode(context);
+        value = null;
+        // Adding container c1
+        dBlr = addDataNode(dBlr, "c1", TANY_NS, value, null);
+        // Adding anydata container
+        dBlr = addDataNode(dBlr, "mydata2", TANY_NS, value, null);
+        context.getRegistry().registerAnydataSchema(Mydata2.class, Node.class);
+        context.getRegistry().registerAnydataSchema(Mydata2.class, DefaultLink.class);
+        context.getRegistry().registerAnydataSchema(Mydata2.class, SupportingTerminationPoint.class);
+
+        // Adding list inside anydata container
+        dBlr = addDataNode(dBlr, "link", NW_TOPO_NAME_SPACE, value, null);
+        value = "link-id";
+        dBlr = addDataNode(dBlr, "link-id", NW_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "source", NW_TOPO_NAME_SPACE, value, null);
+        value = "source-node";
+        dBlr = addDataNode(dBlr, "source-node", NW_TOPO_NAME_SPACE, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr); // exit source
+        dBlr = exitDataNode(dBlr); // exit link
+
+        // Adding list inside anydata container
+        value = null;
+        dBlr = addDataNode(dBlr, "node", IETFNS, value, null);
+        // Adding key element node-id
+        value = "node1";
+        dBlr = addDataNode(dBlr, "node-id", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = null;
+        // Adding list inside list
+        dBlr = addDataNode(dBlr, "supporting-node", null, value, null);
+        // Adding key element network-ref
+        value = "network3";
+        dBlr = addDataNode(dBlr, "network-ref", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "network4";
+        // Adding key element node-ref
+        dBlr = addDataNode(dBlr, "node-ref", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+
+    @Test
+    public void anydataTest() {
+        DataNode dataNode = buildDnForAnydata();
+        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);
+        DefaultC1 c1 = ((DefaultC1) modelObject);
+        DefaultMydata2 mydata2 = ((DefaultMydata2) c1.mydata2());
+
+        Link link = mydata2.anydata(DefaultLink.class);
+        assertThat(link.linkId().toString(), is("link-id"));
+        assertThat(link.source().sourceNode().toString(), is("source-node"));
+
+        Node node = mydata2.anydata(DefaultNode.class);
+        assertThat(node.nodeId().toString(), is("node1"));
+        SupportingNode snode = (SupportingNode) node.supportingNode().get(0);
+        assertThat(snode.networkRef().toString(), is("network3"));
+        assertThat(snode.nodeRef().toString(), is("network4"));
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbAnydataTest.java
new file mode 100644
index 0000000..eef9de7
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbAnydataTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.yrtietfinettypes.rev20130715.yrtietfinettypes.Uri;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.NetworkId;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.NodeId;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.DefaultNode;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.node.DefaultSupportingNode;
+import org.onosproject.yang.gen.v1.yrtnetworktopology.rev20151208.yrtnetworktopology.LinkId;
+import org.onosproject.yang.gen.v1.yrtnetworktopology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
+import org.onosproject.yang.gen.v1.yrtnetworktopology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.yrtnetworktopology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.link.DefaultSource;
+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.anytest.rev20160624.anytest.c1.Mydata2;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultModelObjectData.Builder;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaId;
+
+import java.util.Iterator;
+import java.util.List;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+import static org.onosproject.yang.runtime.impl.TestUtils.IETFNS;
+import static org.onosproject.yang.runtime.impl.TestUtils.TANY_NS;
+import static org.onosproject.yang.runtime.impl.TestUtils.TOPONS;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+
+/**
+ * Unit test cases for resource id conversion from model object id.
+ */
+public class YtbAnydataTest {
+
+    @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() {
+
+        reg.registerAnydataSchema(Mydata2.class, Node.class);
+        reg.registerAnydataSchema(Mydata2.class, Link.class);
+        DefaultC1 c1 = new DefaultC1();
+        DefaultMydata2 mydata2 = new DefaultMydata2();
+
+        // link
+        DefaultLink link = new DefaultLink();
+        link.linkId(new LinkId(new Uri("link-id")));
+        DefaultSource source = new DefaultSource();
+        source.sourceNode(new NodeId(new Uri("source-node")));
+        link.source(source);
+
+        //node
+        DefaultNode node = new DefaultNode();
+        node.nodeId(new NodeId(new Uri("node1")));
+        DefaultSupportingNode sn = new DefaultSupportingNode();
+        sn.networkRef(new NetworkId(new Uri("network3")));
+        sn.nodeRef(new NodeId(new Uri("network4")));
+        node.addToSupportingNode(sn);
+        mydata2.addAnydata(link);
+        mydata2.addAnydata(node);
+
+        c1.mydata2(mydata2);
+        data = new Builder();
+        data.addModelObject(c1);
+        rscData = treeBuilder.getResourceData(data.build());
+
+        List<DataNode> nodes = rscData.dataNodes();
+        DataNode n = nodes.get(0);
+        validateDataNode(n, "c1", TANY_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+        n = ((InnerNode) n).childNodes().values().iterator().next();
+        validateDataNode(n, "mydata2", TANY_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+        Iterator<DataNode> it = ((InnerNode) n).childNodes().values().iterator();
+
+        // node validation
+        n = it.next();
+        validateDataNode(n, "node", IETFNS, MULTI_INSTANCE_NODE,
+                         true, null);
+
+        Iterator<DataNode> it1 = ((InnerNode) n).childNodes().values().iterator();
+        n = it1.next();
+        validateDataNode(n, "node-id", IETFNS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "node1");
+        n = it1.next();
+        validateDataNode(n, "supporting-node", IETFNS, MULTI_INSTANCE_NODE,
+                         true, null);
+
+        Iterator<DataNode> it2 = ((InnerNode) n).childNodes().values()
+                .iterator();
+        n = it2.next();
+        validateDataNode(n, "network-ref", IETFNS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "network3");
+        n = it2.next();
+        validateDataNode(n, "node-ref", IETFNS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "network4");
+
+        //link validation
+        n = it.next();
+        validateDataNode(n, "link", TOPONS, MULTI_INSTANCE_NODE,
+                         true, null);
+
+        it1 = ((InnerNode) n).childNodes().values().iterator();
+        n = it1.next();
+        validateDataNode(n, "link-id", TOPONS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "link-id");
+        n = it1.next();
+        validateDataNode(n, "source", TOPONS, SINGLE_INSTANCE_NODE,
+                         true, null);
+
+        it2 = ((InnerNode) n).childNodes().values().iterator();
+        n = it2.next();
+        validateDataNode(n, "source-node", TOPONS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "source-node");
+    }
+}
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
new file mode 100644
index 0000000..5ffbb8e
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/AnydataNegativeScenarioTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.check.check.List52Keys;
+import org.onosproject.yang.gen.v1.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v11.listanydata.rev20160624.ListAnydata;
+import org.onosproject.yang.gen.v11.listanydata.rev20160624.ListAnydataOpParam;
+import org.onosproject.yang.gen.v11.listanydata.rev20160624.listanydata.Mydata;
+import org.onosproject.yang.model.DataNode;
+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.
+ */
+public class AnydataNegativeScenarioTest {
+
+    TestYangSerializerContext context = new TestYangSerializerContext();
+
+    /*
+     * Reference for data node builder.
+     */
+    DataNode.Builder dBlr;
+
+    /**
+     * Test anydata add to data node negative test scenario when given
+     * referenced node is not of type anydata.
+     */
+    @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));
+        }
+        assertEquals(isExpOccurred, true);
+    }
+
+    /**
+     * Test anydata add to data node negative test scenario when given
+     * referenced node module is not registered.
+     */
+    @Test
+    public void addToData2Test() {
+        boolean isExpOccurred = false;
+        context.getContext();
+        try {
+            context.getRegistry().registerAnydataSchema(Mydata.class,
+                                                        ListAnydataOpParam.class);
+        } catch (IllegalArgumentException e) {
+            isExpOccurred = true;
+            assertEquals(e.getMessage(), String.format(
+                    INVAL_ANYDATA, ListAnydataOpParam.class));
+        }
+        assertEquals(isExpOccurred, true);
+    }
+
+
+    /**
+     * Test anydata add to data node negative test scenario when given
+     * referenced node is not of type list/container.
+     */
+    @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));
+        }
+        assertEquals(isExpOccurred, true);
+    }
+
+    /**
+     * Test anydata add to data node negative test scenario when given
+     * referenced node is not of type list/container.
+     */
+    @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()));
+        }
+        assertEquals(isExpOccurred, true);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/IetfNetAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/IetfNetAnydataTest.java
new file mode 100644
index 0000000..8b9a9cd
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/IetfNetAnydataTest.java
@@ -0,0 +1,226 @@
+/*
+ * 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.yrtietfnetwork.rev20151208.yrtietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v1.yrtnetworktopology.rev20151208.yrtnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v11.anytest.rev20160624.anytest.c1.Mydata2;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.runtime.HelperContext;
+import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_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.IETFNS;
+import static org.onosproject.yang.runtime.impl.TestUtils.TANY_NS;
+import static org.onosproject.yang.runtime.impl.TestUtils.TOPONS;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
+
+/**
+ * Tests the serializer helper methods.
+ */
+public class IetfNetAnydataTest {
+
+    TestYangSerializerContext context = new TestYangSerializerContext();
+
+    /*
+     * Reference for data node info.
+     */
+    HelperContext info;
+
+    /*
+     * Reference for data node builder.
+     */
+    DataNode.Builder dBlr;
+
+    /*
+     * Reference for resource id.
+     */
+    ResourceId id;
+
+    /*
+     * Reference for the value.
+     */
+    String value;
+
+    /*
+     * Reference for string array to used for resource id testing.
+     */
+    String[] nA;
+    String[] nsA;
+    String[] valA;
+
+    private static final String[] EXPECTED = {
+            "Entry Node is /.",
+            "Entry Node is c1.",
+            "Entry Node is mydata2.",
+            "Entry Node is link.",
+            "Entry Node is link-id.",
+            "Exit Node is link-id.",
+            "Entry Node is source.",
+            "Entry Node is source-node.",
+            "Exit Node is source-node.",
+            "Exit Node is source.",
+            "Exit Node is link.",
+            "Entry Node is node.",
+            "Entry Node is node-id.",
+            "Exit Node is node-id.",
+            "Entry Node is supporting-node.",
+            "Entry Node is network-ref.",
+            "Exit Node is network-ref.",
+            "Entry Node is node-ref.",
+            "Exit Node is node-ref.",
+            "Exit Node is supporting-node.",
+            "Exit Node is node.",
+            "Exit Node is mydata2.",
+            "Exit Node is c1.",
+            "Exit Node is /."
+    };
+
+    /**
+     * Test anydata add to data node builder.
+     */
+    @Test
+    public void addToDataTest() {
+
+        dBlr = initializeDataNode(context);
+        value = null;
+        // Adding container c1
+        dBlr = addDataNode(dBlr, "c1", TANY_NS, value, null);
+        // Adding anydata container
+        dBlr = addDataNode(dBlr, "mydata2", TANY_NS, value, null);
+        context.getRegistry().registerAnydataSchema(Mydata2.class, Node.class);
+        context.getRegistry().registerAnydataSchema(Mydata2.class, Link.class);
+        // Adding list inside anydata container
+        dBlr = addDataNode(dBlr, "link", TOPONS, value, null);
+        value = "link-id";
+        dBlr = addDataNode(dBlr, "link-id", TOPONS, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = null;
+        dBlr = addDataNode(dBlr, "source", TOPONS, value, null);
+        value = "source-node";
+        dBlr = addDataNode(dBlr, "source-node", TOPONS, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr); // exit source
+        dBlr = exitDataNode(dBlr); // exit link
+
+        // Adding list inside anydata container
+        value = null;
+        dBlr = addDataNode(dBlr, "node", IETFNS, value, null);
+        // Adding key element node-id
+        value = "node1";
+        dBlr = addDataNode(dBlr, "node-id", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = null;
+        // Adding list inside list
+        dBlr = addDataNode(dBlr, "supporting-node", null, value, null);
+        // Adding key element network-ref
+        value = "network3";
+        dBlr = addDataNode(dBlr, "network-ref", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = "network4";
+        // Adding key element node-ref
+        dBlr = addDataNode(dBlr, "node-ref", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+
+        // Validating the data node.
+        DataNode node = dBlr.build();
+        validateDataNode(node, "/", null, SINGLE_INSTANCE_NODE, true, null);
+
+        Map<NodeKey, DataNode> childMap = ((InnerNode) node).childNodes();
+        Iterator<Map.Entry<NodeKey, DataNode>> iter = childMap.entrySet()
+                .iterator();
+        DataNode n = iter.next().getValue();
+        validateDataNode(n, "c1", TANY_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+        n = ((InnerNode) n).childNodes().values().iterator().next();
+        validateDataNode(n, "mydata2", TANY_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+        Iterator<DataNode> it = ((InnerNode) n).childNodes().values().iterator();
+
+        //link validation
+        n = it.next();
+        validateDataNode(n, "link", TOPONS, MULTI_INSTANCE_NODE,
+                         true, null);
+        Iterator<KeyLeaf> keyIt = ((ListKey) n.key()).keyLeafs().iterator();
+
+        validateLeafDataNode(keyIt.next(), "link-id", TOPONS, "link-id");
+        Iterator<DataNode> it1 = ((InnerNode) n).childNodes().values().iterator();
+        n = it1.next();
+        validateDataNode(n, "link-id", TOPONS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "link-id");
+        n = it1.next();
+        validateDataNode(n, "source", TOPONS, SINGLE_INSTANCE_NODE,
+                         true, null);
+
+        Iterator<DataNode> it2 = ((InnerNode) n).childNodes().values().iterator();
+        n = it2.next();
+        validateDataNode(n, "source-node", TOPONS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "source-node");
+
+        // node validation
+        n = it.next();
+        validateDataNode(n, "node", IETFNS, MULTI_INSTANCE_NODE,
+                         true, null);
+        keyIt = ((ListKey) n.key()).keyLeafs().iterator();
+
+        validateLeafDataNode(keyIt.next(), "node-id", IETFNS, "node1");
+
+        it1 = ((InnerNode) n).childNodes().values().iterator();
+        n = it1.next();
+        validateDataNode(n, "node-id", IETFNS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "node1");
+        n = it1.next();
+        validateDataNode(n, "supporting-node", IETFNS, MULTI_INSTANCE_NODE,
+                         true, null);
+
+        keyIt = ((ListKey) n.key()).keyLeafs().iterator();
+
+        validateLeafDataNode(keyIt.next(), "network-ref", IETFNS, "network3");
+
+        it2 = ((InnerNode) n).childNodes().values().iterator();
+        n = it2.next();
+        validateDataNode(n, "network-ref", IETFNS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "network3");
+        n = it2.next();
+        validateDataNode(n, "node-ref", IETFNS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "network4");
+
+        walkINTree(dBlr.build(), EXPECTED);
+    }
+}
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/anyTest.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/anyTest.yang
new file mode 100644
index 0000000..d125541
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/anyTest.yang
@@ -0,0 +1,24 @@
+module anyTest {
+
+    yang-version 1.1;
+
+    namespace "yrt:list.test.anydata";
+
+    prefix "l";
+
+    organization "ON-LAB";
+
+    description "This module defines for list.";
+
+    revision "2016-06-24" {
+        description "Initial revision.";
+    }
+
+    anydata mydata {
+
+    }
+    container c1 {
+        anydata mydata2 {
+        }
+    }
+}
\ No newline at end of file