diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/TraversalType.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/TraversalType.java
new file mode 100644
index 0000000..e1a25c6
--- /dev/null
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/TraversalType.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.datamodel;
+
+/**
+ * Represents data model tree traversal types.
+ */
+public enum TraversalType {
+
+    /**
+     * Start of traversal at the tree root.
+     */
+    ROOT,
+
+    /**
+     * Child node traversal.
+     */
+    CHILD,
+
+    /**
+     * Sibling node traversal.
+     */
+    SIBILING,
+
+    /**
+     * Parent node traversal.
+     */
+    PARENT
+}
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
index 820b0b4..7a963f5 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
@@ -17,6 +17,13 @@
 
 import java.io.Serializable;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.datamodel.utils.Parsable;
+
+import static org.onosproject.yangutils.datamodel.TraversalType.CHILD;
+import static org.onosproject.yangutils.datamodel.TraversalType.PARENT;
+import static org.onosproject.yangutils.datamodel.TraversalType.SIBILING;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.cloneLeaves;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.updateClonedLeavesUnionEnumRef;
 
 /**
  * Represents base class of a node in data model tree.
@@ -226,4 +233,189 @@
             newChild.setPreviousSibling(curNode);
         }
     }
+
+    /**
+     * Clones the current node contents and create a new node.
+     *
+     * @return cloned node
+     * @throws CloneNotSupportedException clone is not supported by the referred
+     *                                    node
+     */
+    public YangNode clone()
+            throws CloneNotSupportedException {
+        YangNode clonedNode = (YangNode) super.clone();
+        if (clonedNode instanceof YangLeavesHolder) {
+            try {
+                cloneLeaves((YangLeavesHolder) clonedNode);
+            } catch (DataModelException e) {
+                throw new CloneNotSupportedException(e.getMessage());
+            }
+        }
+
+        clonedNode.setParent(null);
+        clonedNode.setChild(null);
+        clonedNode.setNextSibling(null);
+        clonedNode.setPreviousSibling(null);
+        return clonedNode;
+    }
+
+    /**
+     * 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
+     * @throws DataModelException data model error
+     */
+    public static void cloneSubTree(YangNode srcRootNode, YangNode dstRootNode)
+            throws DataModelException {
+
+        YangNode nextNodeToClone = srcRootNode;
+        TraversalType curTraversal;
+
+        YangNode clonedTreeCurNode = dstRootNode;
+        YangNode newNode = null;
+
+        nextNodeToClone = nextNodeToClone.getChild();
+        if (nextNodeToClone == null) {
+            return;
+        } else {
+            /**
+             * Root level cloning is taken care in the caller.
+             */
+            curTraversal = CHILD;
+        }
+
+        /**
+         * Caller ensures the cloning of the root nodes
+         */
+        try {
+            while (nextNodeToClone != srcRootNode) {
+                if (nextNodeToClone == null) {
+                    throw new DataModelException("Internal error: Cloning failed, source tree null pointer reached");
+                }
+                if (curTraversal != PARENT) {
+                    newNode = nextNodeToClone.clone();
+                    detectCollisionWhileCloning(clonedTreeCurNode, newNode, curTraversal);
+                }
+
+                if (curTraversal == CHILD) {
+
+                    /**
+                     * add the new node to the cloned tree.
+                     */
+                    clonedTreeCurNode.addChild(newNode);
+
+                    /**
+                     * update the cloned tree's traversal current node as the
+                     * new node.
+                     */
+                    clonedTreeCurNode = newNode;
+                } else if (curTraversal == SIBILING) {
+
+                    clonedTreeCurNode.addNextSibling(newNode);
+                    clonedTreeCurNode = newNode;
+                } else if (curTraversal == PARENT) {
+                    if (clonedTreeCurNode instanceof YangLeavesHolder) {
+                        updateClonedLeavesUnionEnumRef((YangLeavesHolder) clonedTreeCurNode);
+                    }
+                    clonedTreeCurNode = clonedTreeCurNode.getParent();
+                }
+
+                if (curTraversal != PARENT && nextNodeToClone.getChild() != null) {
+                    curTraversal = CHILD;
+
+                    /**
+                     * update the traversal's current node.
+                     */
+                    nextNodeToClone = nextNodeToClone.getChild();
+
+                } else if (nextNodeToClone.getNextSibling() != null) {
+
+                    curTraversal = SIBILING;
+
+                    nextNodeToClone = nextNodeToClone.getNextSibling();
+                } else {
+                    curTraversal = PARENT;
+                    nextNodeToClone = nextNodeToClone.getParent();
+                }
+            }
+        } catch (CloneNotSupportedException e) {
+            throw new DataModelException("Failed to clone the tree");
+        }
+
+    }
+
+    /**
+     * Detects collision when the grouping is deep copied to the uses's parent.
+     *
+     * @param currentNode parent/previous sibling node for the new node
+     * @param newNode     node which has to be added
+     * @param addAs       traversal type of the node
+     * @throws DataModelException data model error
+     */
+    private static void detectCollisionWhileCloning(YangNode currentNode, YangNode newNode, TraversalType addAs)
+            throws DataModelException {
+        if (!(currentNode instanceof CollisionDetector)
+                || !(newNode instanceof Parsable)) {
+            throw new DataModelException("Node in data model tree does not support collision detection");
+        }
+
+        CollisionDetector collisionDetector = (CollisionDetector) currentNode;
+        Parsable parsable = (Parsable) newNode;
+        if (addAs == TraversalType.CHILD) {
+            collisionDetector.detectCollidingChild(newNode.getName(), parsable.getYangConstructType());
+        } else if (addAs == TraversalType.SIBILING) {
+            currentNode = currentNode.getParent();
+            if (!(currentNode instanceof CollisionDetector)) {
+                throw new DataModelException("Node in data model tree does not support collision detection");
+            }
+            collisionDetector = (CollisionDetector) currentNode;
+            collisionDetector.detectCollidingChild(newNode.getName(), parsable.getYangConstructType());
+        } else {
+            throw new DataModelException("Errored tree cloning");
+        }
+
+    }
+
+    /**
+     * Adds a new next sibling.
+     *
+     * @param newSibling new sibling to be added
+     * @throws DataModelException data model error
+     */
+    private void addNextSibling(YangNode newSibling)
+            throws DataModelException {
+
+        if (newSibling.getNodeType() == null) {
+            throw new DataModelException("Cloned abstract node cannot be inserted into a tree");
+        }
+
+        if (newSibling.getParent() == null) {
+            /**
+             * Since the siblings needs to have a common parent, set the parent
+             * as the current node's parent
+             */
+            newSibling.setParent(getParent());
+
+        } else {
+            throw new DataModelException("Node is already part of a tree, and cannot be added as a sibling");
+        }
+
+        if (newSibling.getPreviousSibling() == null) {
+            newSibling.setPreviousSibling(this);
+            setNextSibling(newSibling);
+        } else {
+            throw new DataModelException("New sibling to be added is not atomic, it already has a previous sibling");
+        }
+
+        if (newSibling.getChild() != null) {
+            throw new DataModelException("Sibling to be added is not atomic, it already has a child");
+        }
+
+        if (newSibling.getNextSibling() != null) {
+            throw new DataModelException("Sibling to be added is not atomic, it already has a next sibling");
+        }
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
index 6f7137d..51cd310 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
@@ -25,6 +25,7 @@
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.updateClonedLeavesUnionEnumRef;
 
 /*-
  * Reference RFC 6020.
@@ -329,42 +330,45 @@
         }
 
         YangLeavesHolder usesParentLeavesHolder = (YangLeavesHolder) usesParentNode;
-        if (referredGrouping.getListOfLeaf() != null
-                && referredGrouping.getListOfLeaf().size() != 0) {
-            addLeavesOfGrouping(
-                    cloneLeavesList(referredGrouping.getListOfLeaf(),
-                            usesParentLeavesHolder));
-        }
+        if (referredGrouping.getListOfLeaf() != null) {
+            for (YangLeaf leaf : referredGrouping.getListOfLeaf()) {
+                YangLeaf clonedLeaf = null;
+                try {
+                    ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leaf.getName(),
+                            YangConstructType.LEAF_DATA);
+                    clonedLeaf = leaf.clone();
 
-        if (referredGrouping.getListOfLeafList() != null
-                && referredGrouping.getListOfLeafList().size() != 0) {
-            addListOfLeafListOfGrouping(
-                    cloneListOfLeafList(referredGrouping.getListOfLeafList(),
-                            usesParentLeavesHolder));
-        }
+                } catch (CloneNotSupportedException | DataModelException e) {
+                    throw new DataModelException(e.getMessage());
+                }
 
-        YangNode childInGrouping = referredGrouping.getChild();
-
-        while (childInGrouping != null) {
-            if (childInGrouping instanceof YangEnumeration
-                    || childInGrouping instanceof YangUnion
-                    || childInGrouping instanceof YangTypeDef) {
-
-                /*
-                 * No need to copy the leaves, union / enum class, as these will
-                 * be generated in the scope of grouping
-                 */
-                childInGrouping = childInGrouping.getNextSibling();
-                continue;
-            } else if (childInGrouping instanceof YangUses) {
-                addResolvedUsesInfoOfGrouping((YangUses) childInGrouping,
-                        usesParentLeavesHolder);
-            } else {
-                addNodeOfGrouping(childInGrouping);
+                clonedLeaf.setContainedIn(usesParentLeavesHolder);
+                usesParentLeavesHolder.addLeaf(clonedLeaf);
             }
-
-            childInGrouping = childInGrouping.getNextSibling();
         }
+        if (referredGrouping.getListOfLeafList() != null) {
+            for (YangLeafList leafList : referredGrouping.getListOfLeafList()) {
+                YangLeafList clonedLeafList = null;
+                try {
+                    ((CollisionDetector) usesParentLeavesHolder).detectCollidingChild(leafList.getName(),
+                            YangConstructType.LEAF_LIST_DATA);
+                    clonedLeafList = leafList.clone();
+
+                } catch (CloneNotSupportedException | DataModelException e) {
+                    throw new DataModelException(e.getMessage());
+                }
+
+                clonedLeafList.setContainedIn(usesParentLeavesHolder);
+                usesParentLeavesHolder.addLeafList(clonedLeafList);
+            }
+        }
+
+        try {
+            YangNode.cloneSubTree(referredGrouping, usesParentNode);
+        } catch (DataModelException e) {
+            throw new DataModelException(e.getMessage());
+        }
+        updateClonedLeavesUnionEnumRef(usesParentLeavesHolder);
     }
 
     /**
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
index 410e025..1e15d1d 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
@@ -28,6 +29,7 @@
 import org.onosproject.yangutils.datamodel.YangIfFeature;
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangBase;
+import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangIdentityRef;
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
@@ -38,8 +40,10 @@
 import org.onosproject.yangutils.datamodel.YangResolutionInfo;
 import org.onosproject.yangutils.datamodel.YangRpc;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangUnion;
 import org.onosproject.yangutils.datamodel.YangUses;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 
 /**
  * Represents utilities for data model tree.
@@ -307,4 +311,104 @@
         }
         return nodes;
     }
+
+    /**
+     * Clones the list of leaves and list of leaf list in the leaves holder.
+     *
+     * @param leavesHolder YANG node potentially containing leaves or leaf lists
+     * @throws CloneNotSupportedException clone is not supported
+     * @throws DataModelException         data model error
+     */
+    public static void cloneLeaves(YangLeavesHolder leavesHolder)
+            throws CloneNotSupportedException, DataModelException {
+        List<YangLeaf> currentListOfLeaves = leavesHolder.getListOfLeaf();
+        if (currentListOfLeaves != null) {
+            List<YangLeaf> clonedLeavesList = new LinkedList<YangLeaf>();
+            for (YangLeaf leaf : currentListOfLeaves) {
+                YangLeaf clonedLeaf = leaf.clone();
+                clonedLeaf.setContainedIn(leavesHolder);
+                clonedLeavesList.add(clonedLeaf);
+            }
+            leavesHolder.setListOfLeaf(clonedLeavesList);
+        }
+
+        List<YangLeafList> currentListOfLeafList = leavesHolder.getListOfLeafList();
+        if (currentListOfLeafList != null) {
+            List<YangLeafList> clonedListOfLeafList = new LinkedList<YangLeafList>();
+            for (YangLeafList leafList : currentListOfLeafList) {
+                YangLeafList clonedLeafList = leafList.clone();
+                clonedLeafList.setContainedIn(leavesHolder);
+                clonedListOfLeafList.add(clonedLeafList);
+            }
+            leavesHolder.setListOfLeafList(clonedListOfLeafList);
+        }
+    }
+
+    /**
+     * Clones the union or enum leaves. If there is any cloned leaves whose type is union/enum then the corresponding
+     * type info needs to be updated to the cloned new type node.
+     *
+     * @param leavesHolder cloned leaves holder, for whom the leaves reference needs to be updated
+     */
+    public static void updateClonedLeavesUnionEnumRef(YangLeavesHolder leavesHolder) throws DataModelException {
+        List<YangLeaf> currentListOfLeaves = leavesHolder.getListOfLeaf();
+        if (currentListOfLeaves != null) {
+            for (YangLeaf leaf : currentListOfLeaves) {
+                if (leaf.getDataType().getDataType() == YangDataTypes.ENUMERATION
+                        || leaf.getDataType().getDataType() == YangDataTypes.UNION) {
+                    try {
+                        updateClonedTypeRef(leaf.getDataType(), leavesHolder);
+                    } catch (DataModelException e) {
+                        throw e;
+                    }
+                }
+            }
+
+        }
+
+        List<YangLeafList> currentListOfLeafList = leavesHolder.getListOfLeafList();
+        if (currentListOfLeafList != null) {
+            for (YangLeafList leafList : currentListOfLeafList) {
+                if (leafList.getDataType().getDataType() == YangDataTypes.ENUMERATION
+                        || leafList.getDataType().getDataType() == YangDataTypes.UNION) {
+                    try {
+                        updateClonedTypeRef(leafList.getDataType(), leavesHolder);
+                    } catch (DataModelException e) {
+                        throw e;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Updates the types extended info pointer to point to the cloned type node.
+     *
+     * @param dataType     data type, whose extended info needs to be pointed to the cloned type
+     * @param leavesHolder the leaves holder having the cloned type
+     */
+    private static void updateClonedTypeRef(YangType dataType, YangLeavesHolder leavesHolder)
+            throws DataModelException {
+        if (!(leavesHolder instanceof YangNode)) {
+            throw new DataModelException("Data model error: cloned leaves holder is not a node");
+        }
+        YangNode potentialTypeNode = ((YangNode) leavesHolder).getChild();
+        while (potentialTypeNode != null) {
+            String dataTypeName = null;
+            if (dataType.getDataType() == YangDataTypes.ENUMERATION) {
+                YangEnumeration enumNode = (YangEnumeration) dataType.getDataTypeExtendedInfo();
+                dataTypeName = enumNode.getName();
+            } else if (dataType.getDataType() == YangDataTypes.UNION) {
+                YangUnion unionNode = (YangUnion) dataType.getDataTypeExtendedInfo();
+                dataTypeName = unionNode.getName();
+            }
+            if (potentialTypeNode.getName().contentEquals(dataTypeName)) {
+                dataType.setDataTypeExtendedInfo((Object) potentialTypeNode);
+                return;
+            }
+            potentialTypeNode = potentialTypeNode.getNextSibling();
+        }
+
+        throw new DataModelException("Data model error: cloned leaves type is not found");
+    }
 }
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/exception/InvalidNodeForTranslatorException.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/exception/InvalidNodeForTranslatorException.java
new file mode 100644
index 0000000..03b0382
--- /dev/null
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/exception/InvalidNodeForTranslatorException.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.translator.exception;
+
+/**
+ * Represents custom translator exception for translator's operations.
+ */
+public class InvalidNodeForTranslatorException extends RuntimeException {
+
+    private static final long serialVersionUID = 20160311L;
+    private String fileName;
+
+    /**
+     * Create a new exception.
+     */
+    public InvalidNodeForTranslatorException() {
+        super();
+    }
+
+    /**
+     * Creates a new exception with given message.
+     *
+     * @param message the detail of exception in string
+     */
+    public InvalidNodeForTranslatorException(String message) {
+        super(message);
+    }
+
+    /**
+     * Creates a new exception from given message and cause.
+     *
+     * @param message the detail of exception in string
+     * @param cause   underlying cause of the error
+     */
+    public InvalidNodeForTranslatorException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Creates a new exception from cause.
+     *
+     * @param cause underlying cause of the error
+     */
+    public InvalidNodeForTranslatorException(final Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Returns generated file name for the exception.
+     *
+     * @return generated file name for the exception
+     */
+    public String getFileName() {
+        return this.fileName;
+    }
+
+    /**
+     * Sets file name in translator exception.
+     *
+     * @param fileName generated file name
+     */
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+}
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index 83a2999..04bb2e2 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -17,17 +17,16 @@
 package org.onosproject.yangutils.translator.tojava;
 
 import java.io.IOException;
-
+import org.onosproject.yangutils.datamodel.TraversalType;
 import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.datamodel.YangTypeDef;
-import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
+import org.onosproject.yangutils.translator.exception.InvalidNodeForTranslatorException;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
-import static org.onosproject.yangutils.translator.tojava.TraversalType.CHILD;
-import static org.onosproject.yangutils.translator.tojava.TraversalType.PARENT;
-import static org.onosproject.yangutils.translator.tojava.TraversalType.ROOT;
-import static org.onosproject.yangutils.translator.tojava.TraversalType.SIBILING;
+import static org.onosproject.yangutils.datamodel.TraversalType.CHILD;
+import static org.onosproject.yangutils.datamodel.TraversalType.PARENT;
+import static org.onosproject.yangutils.datamodel.TraversalType.ROOT;
+import static org.onosproject.yangutils.datamodel.TraversalType.SIBILING;
 
 /**
  * Representation of java code generator based on application schema.
@@ -82,23 +81,18 @@
                 if (!(codeGenNode instanceof JavaCodeGenerator)) {
                     throw new TranslatorException("Unsupported node to generate code");
                 }
-                if (codeGenNode instanceof YangTypeDef) {
-                    YangTypeDef typeDef = (YangTypeDef) codeGenNode;
-                    if (typeDef.getTypeDefBaseType().getDataType() == YangDataTypes.LEAFREF
-                            || typeDef.getTypeDefBaseType().getDataType() == YangDataTypes.IDENTITYREF) {
-                        if (codeGenNode.getNextSibling() != null) {
-                            curTraversal = SIBILING;
-                            codeGenNode = codeGenNode.getNextSibling();
-                        } else {
-                            curTraversal = PARENT;
-                            codeGenNode = codeGenNode.getParent();
-                        }
-                        continue;
-                    }
-                }
                 setCurNode(codeGenNode);
                 try {
                     generateCodeEntry(codeGenNode, yangPlugin);
+                } catch (InvalidNodeForTranslatorException e) {
+                    if (codeGenNode.getNextSibling() != null) {
+                        curTraversal = SIBILING;
+                        codeGenNode = codeGenNode.getNextSibling();
+                    } else {
+                        curTraversal = PARENT;
+                        codeGenNode = codeGenNode.getParent();
+                    }
+                    continue;
                 } catch (Exception e) {
                     throw new TranslatorException(e.getMessage());
                 }
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
index 808c4c1..6a496ce 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
@@ -15,9 +15,8 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
-import java.io.IOException;
-
 import org.onosproject.yangutils.datamodel.YangGrouping;
+import org.onosproject.yangutils.translator.exception.InvalidNodeForTranslatorException;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
@@ -25,8 +24,6 @@
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
-import static org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModelUtils.updatePackageInfo;
-
 /**
  * Represents grouping information extended to support java code generation.
  */
@@ -102,11 +99,7 @@
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin)
             throws TranslatorException {
-        try {
-            updatePackageInfo(this, yangPlugin);
-        } catch (IOException e) {
-            throw new TranslatorException(e.getCause());
-        }
+        throw new InvalidNodeForTranslatorException();
     }
 
     @Override
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
index cef6202..409688f 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
@@ -15,14 +15,8 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
-import java.io.IOException;
-import java.util.List;
-
-import org.onosproject.yangutils.datamodel.YangGrouping;
-import org.onosproject.yangutils.datamodel.YangLeaf;
-import org.onosproject.yangutils.datamodel.YangLeafList;
-import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangUses;
+import org.onosproject.yangutils.translator.exception.InvalidNodeForTranslatorException;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
@@ -30,10 +24,6 @@
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
-import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
-import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeAsAttributeInTargetTempFile;
-import static org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModelUtils.updatePackageInfo;
-
 /**
  * Represents uses information extended to support java code generation.
  */
@@ -108,42 +98,7 @@
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin)
             throws TranslatorException {
-        try {
-            updatePackageInfo(this, yangPlugin);
-
-            if (!(getParentNodeInGenCode(this) instanceof JavaCodeGeneratorInfo)) {
-                throw new TranslatorException("invalid container of uses");
-            }
-            JavaCodeGeneratorInfo javaCodeGeneratorInfo = (JavaCodeGeneratorInfo) getParentNodeInGenCode(this);
-
-            if (javaCodeGeneratorInfo instanceof YangGrouping) {
-                /*
-                 * Do nothing, since it will taken care in the groupings uses.
-                 */
-                return;
-            }
-
-            for (List<YangLeaf> leavesList : getUsesResolvedLeavesList()) {
-                // add the resolved leaves to the parent as an attribute
-                javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
-                        .getBeanTempFiles().addLeavesInfoToTempFiles(leavesList, yangPlugin);
-            }
-
-            for (List<YangLeafList> listOfLeafLists : getUsesResolvedListOfLeafList()) {
-                // add the resolved leaf-list to the parent as an attribute
-                javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
-                        .getBeanTempFiles().addLeafListInfoToTempFiles(listOfLeafLists, yangPlugin);
-            }
-
-            for (YangNode usesResolvedNode : getUsesResolvedNodeList()) {
-                // add the resolved nodes to the parent as an attribute
-                addCurNodeAsAttributeInTargetTempFile(usesResolvedNode, yangPlugin,
-                        getParentNodeInGenCode(this));
-            }
-
-        } catch (IOException e) {
-            throw new TranslatorException(e.getCause());
-        }
+        throw new InvalidNodeForTranslatorException();
     }
 
     @Override
diff --git a/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/IntraFileUsesLinkingTest.java b/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/IntraFileUsesLinkingTest.java
index 43a7c02..44ce858 100644
--- a/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/IntraFileUsesLinkingTest.java
+++ b/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/IntraFileUsesLinkingTest.java
@@ -17,14 +17,13 @@
 package org.onosproject.yangutils.plugin.manager;
 
 import java.io.IOException;
-import java.util.List;
 import java.util.ListIterator;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.onosproject.yangutils.datamodel.YangContainer;
-import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.datamodel.YangGrouping;
+import org.onosproject.yangutils.datamodel.YangInput;
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangModule;
@@ -33,6 +32,7 @@
 import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.YangUses;
 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
+import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.linker.exceptions.LinkerException;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
@@ -70,8 +70,13 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator;
-        YangLeaf leafInfo;
+        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leafInfo = leafIterator.next();
+
+        // Check whether the information in the leaf is correct under module.
+        assertThat(leafInfo.getName(), is("hello"));
+        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
+        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
 
         // Check whether grouping is the sibling of module's child.
         assertThat((yangNode.getChild().getNextSibling() instanceof YangGrouping), is(true));
@@ -89,20 +94,9 @@
         assertThat((yangNode.getChild() instanceof YangUses), is(true));
         YangUses uses = (YangUses) yangNode.getChild();
 
-        // Check whether uses get resolved.
+        // Check whether uses get resolved
         assertThat(uses.getResolvableStatus(),
                 is(ResolvableStatus.RESOLVED));
-
-        ListIterator<List<YangLeaf>> leafIterator1 = uses.getUsesResolvedLeavesList().listIterator();
-        List<YangLeaf> leafInfo1 = leafIterator1.next();
-        ListIterator<YangLeaf> leafIterator2 = leafInfo1.listIterator();
-        YangLeaf leafInfo2 = leafIterator2.next();
-
-        // Check whether the information in the leaf is correct under module.
-        assertThat(leafInfo2.getName(), is("hello"));
-        assertThat(leafInfo2.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo2.getDataType().getDataType(), is(YangDataTypes.STRING));
-
     }
 
     /**
@@ -129,6 +123,27 @@
         ListIterator<YangLeaf> leafIterator;
         YangLeaf leafInfo;
 
+        ListIterator<YangLeaf> leafIterator1 = yangNode.getListOfLeaf().listIterator();
+        YangLeaf leafInfo1 = leafIterator1.next();
+
+        // Check whether the information in the leaf is correct under module.
+        assertThat(leafInfo1.getName(), is("treat"));
+        assertThat(leafInfo1.getDataType().getDataTypeName(), is("string"));
+        assertThat(leafInfo1.getDataType().getDataType(), is(YangDataTypes.STRING));
+
+        YangContainer container = (YangContainer) yangNode.getChild().getNextSibling().getNextSibling();
+
+        // Check whether the container name is set correctly which is under module.
+        assertThat(container.getName(), is("test"));
+
+        leafIterator = container.getListOfLeaf().listIterator();
+        leafInfo = leafIterator.next();
+
+        // Check whether the information in the leaf is correct under container which is under module.
+        assertThat(leafInfo.getName(), is("leaf2"));
+        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
+        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
+
         // Check whether grouping is the sibling of module's child.
         assertThat((yangNode.getChild().getNextSibling() instanceof YangGrouping), is(true));
 
@@ -143,7 +158,7 @@
 
         // Check whether container is the child of grouping.
         assertThat((grouping.getChild() instanceof YangContainer), is(true));
-        YangContainer container = (YangContainer) grouping.getChild();
+        container = (YangContainer) grouping.getChild();
 
         // Check whether the container name is set correctly which is under grouping.
         assertThat(container.getName(), is("test"));
@@ -164,32 +179,6 @@
         assertThat(uses.getResolvableStatus(),
                 is(ResolvableStatus.RESOLVED));
 
-        ListIterator<List<YangLeaf>> leafIterator1 = uses.getUsesResolvedLeavesList().listIterator();
-        List<YangLeaf> leafInfo1 = leafIterator1.next();
-        ListIterator<YangLeaf> leafIterator2 = leafInfo1.listIterator();
-        YangLeaf leafInfo2 = leafIterator2.next();
-
-        // Check whether the information in the leaf is correct under module.
-        assertThat(leafInfo2.getName(), is("treat"));
-        assertThat(leafInfo2.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo2.getDataType().getDataType(), is(YangDataTypes.STRING));
-
-        ListIterator<YangNode> usesChildren = uses.getUsesResolvedNodeList().listIterator();
-        YangNode usesChild = usesChildren.next();
-        // Check whether container is the child of module.
-        assertThat((usesChild instanceof YangContainer), is(true));
-        container = (YangContainer) usesChild;
-
-        // Check whether the container name is set correctly which is under module.
-        assertThat(container.getName(), is("test"));
-
-        leafIterator = container.getListOfLeaf().listIterator();
-        leafInfo = leafIterator.next();
-
-        // Check whether the information in the leaf is correct under container which is under module.
-        assertThat(leafInfo.getName(), is("leaf2"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
     }
 
     /**
@@ -245,18 +234,12 @@
         YangUses uses = (YangUses) yangNode.getChild().getChild().getNextSibling().getChild();
 
         // Check whether uses get resolved.
-        assertThat(uses.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
+        assertThat(uses.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
 
-        ListIterator<YangNode> usesChildren = uses.getUsesResolvedNodeList().listIterator();
-        YangNode usesChild = usesChildren.next();
+        YangInput inputNode = ((YangInput) yangNode.getChild().getChild().getNextSibling());
+        assertThat((inputNode.getChild() instanceof YangUses), is(true));
 
-        // Check whether list is the sibling of uses which has been deep copied from grouping.
-        assertThat((usesChild instanceof YangList), is(true));
-
-        YangList yangList = (YangList) usesChild;
-
-        // Check whether the list name is set correctly.
+        YangList yangList = ((YangList) inputNode.getChild().getNextSibling());
         assertThat(yangList.getName(), is("valid"));
 
         leafIterator = yangList.getListOfLeaf().listIterator();
@@ -268,36 +251,6 @@
         assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16));
         assertThat(leafInfo.getUnits(), is("\"seconds\""));
         assertThat(leafInfo.getReference(), is("\"RFC 6020\""));
-
-        // Check whether uses is output's child.
-        assertThat((yangNode.getChild().getChild().getNextSibling().getNextSibling().getChild() instanceof YangUses),
-                is(true));
-        YangUses usesInOuput = (YangUses) yangNode.getChild().getChild().getNextSibling().getNextSibling().getChild();
-
-        // Check whether uses get resolved.
-        assertThat(usesInOuput.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
-
-        ListIterator<YangNode> usesInOuputChildren = usesInOuput.getUsesResolvedNodeList().listIterator();
-        YangNode usesInOuputChild = usesInOuputChildren.next();
-
-        // Check whether list is the sibling of uses which has been deep copied from grouping.
-        assertThat((usesInOuputChild instanceof YangList), is(true));
-
-        YangList yangListInOutput = (YangList) usesInOuputChild;
-
-        // Check whether the list name is set correctly.
-        assertThat(yangListInOutput.getName(), is("valid"));
-
-        leafIterator = yangListInOutput.getListOfLeaf().listIterator();
-        leafInfo = leafIterator.next();
-
-        // Check whether the information in the leaf is correct under list which is deep copied.
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16));
-        assertThat(leafInfo.getUnits(), is("\"seconds\""));
-        assertThat(leafInfo.getReference(), is("\"RFC 6020\""));
     }
 
     /**
@@ -350,18 +303,16 @@
         YangUses firstUses = (YangUses) grouping.getChild();
 
         // Check whether uses get resolved.
-        assertThat(firstUses.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
+        assertThat(firstUses.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
 
-        ListIterator<YangNode> firstUsesChildren = firstUses.getUsesResolvedNodeList().listIterator();
-        YangNode firstUsesChild = firstUsesChildren.next();
+        // Validate first uses child is cloned properly
+        assertThat((firstUses.getNextSibling().getNextSibling()
+                .getNextSibling().getNextSibling() instanceof YangList), is(true));
+        YangList firstUsesChild = ((YangList) firstUses.getNextSibling().getNextSibling().getNextSibling()
+                .getNextSibling());
+        assertThat(firstUsesChild.getName(), is("valid"));
 
-        // Check whether list is the sibling of uses.
-        assertThat((firstUsesChild instanceof YangList), is(true));
-        YangList yangList = (YangList) firstUsesChild;
-        assertThat(yangList.getName(), is("valid"));
-
-        leafIterator = yangList.getListOfLeaf().listIterator();
+        leafIterator = firstUsesChild.getListOfLeaf().listIterator();
         leafInfo = leafIterator.next();
 
         // Check whether the information in the leaf is correct under list which has been deep copied from grouping.
@@ -371,134 +322,45 @@
         assertThat(leafInfo.getUnits(), is("\"seconds\""));
         assertThat(leafInfo.getReference(), is("\"RFC 6020\""));
 
-        // Check whether container is the sibling of uses.
+        //validate uses second
         assertThat((firstUses.getNextSibling() instanceof YangContainer), is(true));
-        YangContainer yangContainer = (YangContainer) firstUses.getNextSibling();
+        YangContainer container = (YangContainer) firstUses.getNextSibling();
+        assertThat(container.getName(), is("design"));
 
-        // Check whether the container name is set correctly.
-        assertThat(yangContainer.getName(), is("design"));
+        assertThat((container.getChild() instanceof YangUses), is(true));
+        assertThat((container.getListOfLeaf().iterator().next().getName()), is("ink"));
 
-        // Check whether uses is design-container's child.
-        assertThat((yangContainer.getChild() instanceof YangUses), is(true));
-        YangUses secondUses = (YangUses) yangContainer.getChild();
+        //validate uses third
+        assertThat((container.getChild().getNextSibling() instanceof YangContainer), is(true));
+        YangContainer container2 = ((YangContainer) container.getChild().getNextSibling());
+        assertThat(container2.getName(), is("correct"));
+        assertThat((container2.getChild() instanceof YangUses), is(true));
+        assertThat((container2.getChild().getNextSibling() instanceof YangContainer), is(true));
+        YangContainer thirdUsesChild = ((YangContainer) container2.getChild().getNextSibling());
+        assertThat(thirdUsesChild.getListOfLeaf().iterator().next().getName(), is("zip-code"));
 
-        // Check whether uses get resolved.
-        assertThat(secondUses.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
+        //validate fourth uses
+        assertThat((firstUses.getNextSibling().getNextSibling() instanceof YangUses), is(true));
+        YangUses fourthUses = ((YangUses) firstUses.getNextSibling().getNextSibling());
+        assertThat((fourthUses.getNextSibling().getNextSibling().getNextSibling() instanceof YangTypeDef),
+                is(true));
+        assertThat(fourthUses.getNextSibling().getNextSibling().getNextSibling().getName(), is("my-type"));
 
-        ListIterator<List<YangLeaf>> leafIterator1 = secondUses.getUsesResolvedLeavesList().listIterator();
-        List<YangLeaf> leafInfo1 = leafIterator1.next();
-        ListIterator<YangLeaf> leafIterator2 = leafInfo1.listIterator();
-        YangLeaf leafInfo2 = leafIterator2.next();
+        //validate fifth uses
+        assertThat((firstUses.getNextSibling().getNextSibling().getNextSibling() instanceof YangUses),
+                is(true));
 
-        // Check whether the information in the leaf is correct under design-container.
-        assertThat(leafInfo2.getName(), is("ink"));
-        assertThat(leafInfo2.getDataType().getDataTypeName(), is("int32"));
-        assertThat(leafInfo2.getDataType().getDataType(), is(YangDataTypes.INT32));
-
-        // Check whether container is the sibling of uses.
-        assertThat((secondUses.getNextSibling() instanceof YangContainer), is(true));
-        YangContainer yangContainer2 = (YangContainer) secondUses.getNextSibling();
-        assertThat(yangContainer2.getName(), is("correct"));
-
-        leafIterator = yangContainer2.getListOfLeaf().listIterator();
-        leafInfo = leafIterator.next();
-
-        // Check whether the information in the leaf is correct under correct-container.
-        assertThat(leafInfo.getName(), is("newone"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-
-        // Check whether uses is correct container's child.
-        assertThat((yangContainer2.getChild() instanceof YangUses), is(true));
-        YangUses thirdUses = (YangUses) yangContainer2.getChild();
-
-        // Check whether uses get resolved.
-        assertThat(thirdUses.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
-
-        ListIterator<YangNode> thirdUsesChildren = thirdUses.getUsesResolvedNodeList().listIterator();
-        YangNode thirdUsesChild = thirdUsesChildren.next();
-
-        // Check whether container is the child of uses.
-        assertThat((thirdUsesChild instanceof YangContainer), is(true));
-
-        YangContainer yangContainer3 = (YangContainer) thirdUsesChild;
-        assertThat(yangContainer3.getName(), is("value"));
-
-        leafIterator = yangContainer3.getListOfLeaf().listIterator();
-        leafInfo = leafIterator.next();
-
-        // Check whether the information in the leaf is correct under container
-        // which has been deep copied from grouping.
-        assertThat(leafInfo.getName(), is("zip-code"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("string"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.STRING));
-
-
-        // Check whether uses is the sibling of container-design.
-        assertThat((yangContainer.getNextSibling() instanceof YangUses), is(true));
-        YangUses fourthUses = (YangUses) yangContainer.getNextSibling();
-        assertThat(fourthUses.getName(), is("fourth"));
-        // Check whether uses get resolved.
-        assertThat(fourthUses.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
-
-        ListIterator<List<YangLeaf>> fourthUsesChildren = fourthUses.getUsesResolvedLeavesList().listIterator();
-        List<YangLeaf> fourthUsesChild = fourthUsesChildren.next();
-        ListIterator<YangLeaf> fourthUsesChildren1 = fourthUsesChild.listIterator();
-        YangLeaf fourthUsesChild1 = fourthUsesChildren1.next();
-
-        // Check whether the information in the leaf is correct under correct-container.
-        assertThat(fourthUsesChild1.getName(), is("correct"));
-        assertThat(fourthUsesChild1.getDataType().getDataTypeName(), is("my-type"));
-        assertThat(fourthUsesChild1.getDataType().getDataType(), is(YangDataTypes.DERIVED));
-
-        // Check whether uses is the sibling of previous uses.
-        assertThat((fourthUses.getNextSibling() instanceof YangUses), is(true));
-        YangUses fifthUses = (YangUses) fourthUses.getNextSibling();
-        assertThat(fifthUses.getName(), is("fifth"));
-
-        // Check whether uses get resolved.
-        assertThat(fifthUses.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
-
-        ListIterator<List<YangLeaf>> fifthUsesChildren = fifthUses.getUsesResolvedLeavesList().listIterator();
-        List<YangLeaf> fifthUsesChild = fifthUsesChildren.next();
-        ListIterator<YangLeaf> fifthUsesChildren1 = fifthUsesChild.listIterator();
-        YangLeaf fifthUsesChild1 = fifthUsesChildren1.next();
-
-        //Check whether the information in the leaf is correct under correct-container.
-        assertThat(fifthUsesChild1.getName(), is("abc"));
-        assertThat(fifthUsesChild1.getDataType().getDataTypeName(), is("string"));
-        assertThat(fifthUsesChild1.getDataType().getDataType(), is(YangDataTypes.STRING));
-
-        //Check whether uses is endpoint-grouping's sibling.
-        assertThat((grouping.getNextSibling() instanceof YangUses), is(true));
-        YangUses endpointUses = (YangUses) grouping.getNextSibling();
-
-        // Check whether uses get resolved.
-        assertThat(endpointUses.getResolvableStatus(),
-                is(ResolvableStatus.RESOLVED));
-        assertThat(endpointUses.getName(), is("endpoint"));
-
-        ListIterator<YangNode> endpointUsesUsesChildren = endpointUses.getUsesResolvedNodeList().listIterator();
-        YangNode endpointUsesUsesChild = endpointUsesUsesChildren.next();
-
-        // Check whether list is the sibling of uses.
-        assertThat((endpointUsesUsesChild instanceof YangList), is(true));
-        YangList yangList1 = (YangList) firstUsesChild;
-        assertThat(yangList1.getName(), is("valid"));
-
-        leafIterator = yangList1.getListOfLeaf().listIterator();
-        leafInfo = leafIterator.next();
-
-        // Check whether the information in the leaf is correct under list which has been deep copied from grouping.
-        assertThat(leafInfo.getName(), is("invalid-interval"));
-        assertThat(leafInfo.getDataType().getDataTypeName(), is("uint16"));
-        assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.UINT16));
-        assertThat(leafInfo.getUnits(), is("\"seconds\""));
-        assertThat(leafInfo.getReference(), is("\"RFC 6020\""));
+        //validate end point uses
+        assertThat(grouping.getNextSibling() instanceof YangUses, is(true));
+        assertThat(grouping.getNextSibling().getNextSibling().getNextSibling().getNextSibling()
+                        .getNextSibling().getNextSibling().getNextSibling().getNextSibling() instanceof YangContainer,
+                is(true));
+        container = (YangContainer) grouping.getNextSibling().getNextSibling().getNextSibling().getNextSibling()
+                .getNextSibling().getNextSibling().getNextSibling().getNextSibling();
+        assertThat(container.getName(), is("design"));
+        container2 = (YangContainer) container.getChild().getNextSibling();
+        assertThat(container2.getName(), is("correct"));
+        assertThat(container2.getChild().getNextSibling().getName(), is("value"));
     }
 
     /**
diff --git a/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/YangXpathLinkerTest.java b/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/YangXpathLinkerTest.java
index 946bac1..5d1251a 100644
--- a/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/YangXpathLinkerTest.java
+++ b/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/plugin/manager/YangXpathLinkerTest.java
@@ -26,6 +26,7 @@
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
 import org.onosproject.yangutils.datamodel.YangResolutionInfo;
+import org.onosproject.yangutils.linker.exceptions.LinkerException;
 import org.onosproject.yangutils.linker.impl.YangLinkerManager;
 import org.onosproject.yangutils.linker.impl.YangXpathLinker;
 import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
@@ -229,7 +230,7 @@
      *
      * @throws IOException when fails to do IO operations
      */
-    @Test
+    @Test(expected = LinkerException.class)
     public void processIntraFileLinkingInUsesSingleLevel() throws IOException {
 
         utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(INTRA_FILE_PATH + "IntraSingleUses/"));
@@ -259,7 +260,7 @@
      *
      * @throws IOException when fails to do IO operations
      */
-    @Test
+    @Test(expected = LinkerException.class)
     public void processIntraFileLinkingInUsesMultiLevel() throws IOException {
 
         utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(INTRA_FILE_PATH + "IntraMultiUses/"));
@@ -568,7 +569,7 @@
      *
      * @throws IOException when fails to do IO operations
      */
-    @Test
+    @Test(expected = LinkerException.class)
     public void processInterFileLinkingInUsesMultiLevel() throws IOException {
 
         utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(INTER_FILE_PATH + "InterMultiUses/"));
