diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
index 65a0545..d4e3065 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangIdentityRef.java
@@ -16,6 +16,7 @@
 package org.onosproject.yangutils.datamodel;
 
 import java.io.Serializable;
+
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.datamodel.utils.Parsable;
 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
@@ -43,7 +44,9 @@
 /**
  * Represents data model node to maintain information defined in YANG identityref.
  */
-public class YangIdentityRef extends YangNode implements Parsable, Resolvable, Serializable {
+public class YangIdentityRef
+        extends YangNode
+        implements Parsable, Resolvable, Serializable, LocationInfo {
 
     private static final long serialVersionUID = 806201692L;
 
@@ -61,6 +64,17 @@
      */
     private ResolvableStatus resolvableStatus;
 
+    /**
+     * Resolution for interfile grouping.
+     */
+    private boolean isIdentityForInterFileGroupingResolution;
+
+    // Error line number.
+    private transient int lineNumber;
+
+    // Error character position in number.
+    private transient int charPositionInLine;
+
     // Creates a specific identityref of node.
     public YangIdentityRef() {
         super(YangNodeType.IDENTITYREF_NODE, null);
@@ -70,7 +84,7 @@
 
     @Override
     public void addToChildSchemaMap(YangSchemaNodeIdentifier schemaNodeIdentifier,
-                                    YangSchemaNodeContextInfo yangSchemaNodeContextInfo)
+            YangSchemaNodeContextInfo yangSchemaNodeContextInfo)
             throws DataModelException {
         // Do nothing.
     }
@@ -101,7 +115,8 @@
     }
 
     @Override
-    public Object resolve() throws DataModelException {
+    public Object resolve()
+            throws DataModelException {
 
         // Check if the derived info is present.
         YangIdentity identity = getReferredIdentity();
@@ -191,11 +206,13 @@
     }
 
     @Override
-    public void validateDataOnEntry() throws DataModelException {
+    public void validateDataOnEntry()
+            throws DataModelException {
     }
 
     @Override
-    public void validateDataOnExit() throws DataModelException {
+    public void validateDataOnExit()
+            throws DataModelException {
     }
 
     /**
@@ -215,4 +232,33 @@
     public void setReferredIdentity(YangIdentity referredIdentity) {
         this.referredIdentity = referredIdentity;
     }
+
+    @Override
+    public int getLineNumber() {
+        return lineNumber;
+    }
+
+    @Override
+    public int getCharPosition() {
+        return charPositionInLine;
+    }
+
+    @Override
+    public void setLineNumber(int lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    @Override
+    public void setCharPosition(int charPositionInLine) {
+        this.charPositionInLine = charPositionInLine;
+    }
+
+    public boolean isIdentityForInterFileGroupingResolution() {
+        return isIdentityForInterFileGroupingResolution;
+    }
+
+    public void setIdentityForInterFileGroupingResolution(boolean identityForInterFileGroupingResolution) {
+        isIdentityForInterFileGroupingResolution = identityForInterFileGroupingResolution;
+    }
+
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
index ca442e6..80c53ec 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
@@ -64,7 +64,7 @@
  * @param <T> YANG data type info
  */
 public class YangType<T>
-        implements Parsable, Resolvable, Serializable {
+        implements Parsable, Resolvable, Serializable, LocationInfo {
 
     private static final long serialVersionUID = 8062016054L;
 
@@ -93,6 +93,29 @@
      */
     private ResolvableStatus resolvableStatus;
 
+
+    /**
+     * Resolution for interfile grouping.
+     */
+    private boolean isTypeForInterFileGroupingResolution;
+
+    /**
+     * Resolved within the grouping where the type is used.
+     */
+    private boolean isTypeNotResolvedTillRootNode;
+
+
+    /**
+     * Error line number.
+     */
+    private transient int lineNumber;
+
+    /**
+     * Error character position in number.
+     */
+    private transient int charPositionInLine;
+
+
     /**
      * Creates a YANG type object.
      */
@@ -276,7 +299,8 @@
      * @param value input data value
      * @throws DataModelException a violation of data model rules
      */
-    void isValidValue(String value) throws DataModelException {
+    void isValidValue(String value)
+            throws DataModelException {
         switch (getDataType()) {
             case INT8:
             case INT16:
@@ -501,4 +525,40 @@
 
         return isMatched;
     }
+
+    @Override
+    public int getLineNumber() {
+        return lineNumber;
+    }
+
+    @Override
+    public int getCharPosition() {
+        return charPositionInLine;
+    }
+
+    @Override
+    public void setLineNumber(int lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    @Override
+    public void setCharPosition(int charPositionInLine) {
+        this.charPositionInLine = charPositionInLine;
+    }
+
+    public boolean isTypeForInterFileGroupingResolution() {
+        return isTypeForInterFileGroupingResolution;
+    }
+
+    public void setTypeForInterFileGroupingResolution(boolean typeForInterFileGroupingResolution) {
+        isTypeForInterFileGroupingResolution = typeForInterFileGroupingResolution;
+    }
+
+    public boolean isTypeNotResolvedTillRootNode() {
+        return isTypeNotResolvedTillRootNode;
+    }
+
+    public void setTypeNotResolvedTillRootNode(boolean typeNotResolvedTillRootNode) {
+        isTypeNotResolvedTillRootNode = typeNotResolvedTillRootNode;
+    }
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
index db0eeb9..42e4237 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangUses.java
@@ -28,8 +28,8 @@
 import static org.onosproject.yangutils.datamodel.TraversalType.SIBILING;
 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.resolveLeafrefUnderGroupingForLeaf;
-import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveLeafrefUnderGroupingForLeafList;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveYangConstructsUnderGroupingForLeaf;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.resolveYangConstructsUnderGroupingForLeafList;
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.updateClonedLeavesUnionEnumRef;
 
 /*-
@@ -408,8 +408,8 @@
                             YangConstructType.LEAF_DATA);
                     clonedLeaf = leaf.clone();
                     if (getCurrentGroupingDepth() == 0) {
-                        YangEntityToResolveInfoImpl resolveInfo = resolveLeafrefUnderGroupingForLeaf(clonedLeaf,
-                                usesParentLeavesHolder, this);
+                        YangEntityToResolveInfoImpl resolveInfo = resolveYangConstructsUnderGroupingForLeaf(
+                                clonedLeaf, usesParentLeavesHolder, this);
                         if (resolveInfo != null) {
                             addEntityToResolve(resolveInfo);
                         }
@@ -431,7 +431,8 @@
                     clonedLeafList = leafList.clone();
                     if (getCurrentGroupingDepth() == 0) {
                         YangEntityToResolveInfoImpl resolveInfo =
-                                resolveLeafrefUnderGroupingForLeafList(clonedLeafList, usesParentLeavesHolder);
+                                resolveYangConstructsUnderGroupingForLeafList(clonedLeafList,
+                                                                                   usesParentLeavesHolder, this);
                         if (resolveInfo != null) {
                             addEntityToResolve(resolveInfo);
                         }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
index 29896ef..9547e78 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
@@ -226,7 +226,7 @@
      * @throws DataModelException a violation of data model rules
      */
     public static void resolveLinkingForResolutionList(List<YangResolutionInfo> resolutionList,
-                                                       YangReferenceResolver dataModelRootNode)
+            YangReferenceResolver dataModelRootNode)
             throws DataModelException {
 
         for (YangResolutionInfo resolutionInfo : resolutionList) {
@@ -242,7 +242,7 @@
      * @throws DataModelException a violation of data model rules
      */
     public static void linkInterFileReferences(List<YangResolutionInfo> resolutionList,
-                                               YangReferenceResolver dataModelRootNode)
+            YangReferenceResolver dataModelRootNode)
             throws DataModelException {
         /*
          * Run through the resolution list, find type/uses referring to inter
@@ -313,7 +313,8 @@
      * @return de-serializes YANG data-model nodes
      * @throws IOException when fails do IO operations
      */
-    public static YangNode deSerializeDataModel(String serializedFileInfo) throws IOException {
+    public static YangNode deSerializeDataModel(String serializedFileInfo)
+            throws IOException {
 
         YangNode node;
         try {
@@ -346,7 +347,7 @@
                 YangLeaf clonedLeaf = leaf.clone();
                 if (yangUses.getCurrentGroupingDepth() == 0) {
                     YangEntityToResolveInfoImpl resolveInfo =
-                            resolveLeafrefUnderGroupingForLeaf(clonedLeaf, leavesHolder, yangUses);
+                            resolveYangConstructsUnderGroupingForLeaf(clonedLeaf, leavesHolder, yangUses);
                     if (resolveInfo != null) {
                         yangUses.addEntityToResolve(resolveInfo);
                     }
@@ -364,7 +365,8 @@
                 YangLeafList clonedLeafList = leafList.clone();
                 if (yangUses.getCurrentGroupingDepth() == 0) {
                     YangEntityToResolveInfoImpl resolveInfo =
-                            resolveLeafrefUnderGroupingForLeafList(clonedLeafList, leavesHolder);
+                            resolveYangConstructsUnderGroupingForLeafList(clonedLeafList, leavesHolder,
+                                    yangUses);
                     if (resolveInfo != null) {
                         yangUses.addEntityToResolve(resolveInfo);
                     }
@@ -386,8 +388,9 @@
      * @throws DataModelException data model error
      */
     public static YangEntityToResolveInfoImpl resolveLeafrefUnderGroupingForLeaf(YangLeaf clonedLeaf,
-                                                                                 YangLeavesHolder leafParentHolder,
-                                                                                 YangUses yangUses) throws
+            YangLeavesHolder leafParentHolder,
+            YangUses yangUses)
+            throws
             DataModelException {
         if (clonedLeaf.getDataType().getDataTypeExtendedInfo() instanceof YangLeafRef) {
             YangLeafRef leafrefForCloning = (YangLeafRef) clonedLeaf.getDataType().getDataTypeExtendedInfo();
@@ -405,14 +408,123 @@
     }
 
     /**
+     * Resolves leafRef, identityRef and derived type in leaf, which are under grouping by adding it to the resolution
+     * list.
+     *
+     * @param clonedLeaf       cloned leaf in uses from grouping
+     * @param leafParentHolder holder of the leaf from uses
+     * @param yangUses         YANG uses
+     * @return entity of leafRef/identityRef/derived type which has to be resolved
+     * @throws DataModelException data model error
+     */
+    public static YangEntityToResolveInfoImpl resolveYangConstructsUnderGroupingForLeaf(YangLeaf clonedLeaf,
+            YangLeavesHolder leafParentHolder, YangUses yangUses)
+            throws DataModelException {
+        int lineNumber;
+        int charPosition;
+        YangDataTypes dataTypes = clonedLeaf.getDataType().getDataType();
+        YangEntityToResolveInfoImpl yangEntityToResolveInfo = new YangEntityToResolveInfoImpl();
+        switch (dataTypes) {
+            case LEAFREF:
+                YangLeafRef leafRefForCloning = (YangLeafRef) clonedLeaf.getDataType().getDataTypeExtendedInfo();
+                // Conversion of prefixes in absolute path while cloning them.
+                convertThePrefixesDuringChange(leafRefForCloning, yangUses);
+                leafRefForCloning.setParentNodeOfLeafref((YangNode) leafParentHolder);
+                yangEntityToResolveInfo.setEntityToResolve(leafRefForCloning);
+                lineNumber = leafRefForCloning.getCharPosition();
+                charPosition = leafRefForCloning.getLineNumber();
+                break;
+            case IDENTITYREF:
+                YangIdentityRef identityRef = (YangIdentityRef) clonedLeaf.getDataType().getDataTypeExtendedInfo();
+                if (identityRef.isIdentityForInterFileGroupingResolution()) {
+                    return null;
+                }
+                yangEntityToResolveInfo.setEntityToResolve(identityRef);
+                lineNumber = identityRef.getCharPosition();
+                charPosition = identityRef.getLineNumber();
+                break;
+            case DERIVED:
+                YangType type = clonedLeaf.getDataType();
+                if (type.isTypeForInterFileGroupingResolution()) {
+                    return null;
+                }
+                yangEntityToResolveInfo.setEntityToResolve(type);
+                lineNumber = type.getCharPosition();
+                charPosition = type.getLineNumber();
+                break;
+            default:
+                return null;
+        }
+        yangEntityToResolveInfo.setHolderOfEntityToResolve((YangNode) leafParentHolder);
+        yangEntityToResolveInfo.setCharPosition(charPosition);
+        yangEntityToResolveInfo.setLineNumber(lineNumber);
+        return yangEntityToResolveInfo;
+    }
+
+    /**
+     * Resolves leafRef, identityRef and derived type in leaf-list, which are under grouping by adding it to the
+     * resolution list.
+     *
+     * @param clonedLeafList   cloned leaf-list in uses from grouping
+     * @param leafParentHolder holder of the leaf from uses
+     * @param yangUses         YANG uses
+     * @return entity of leafRef/identityRef/derived type which has to be resolved
+     * @throws DataModelException data model error
+     */
+    public static YangEntityToResolveInfoImpl resolveYangConstructsUnderGroupingForLeafList(
+            YangLeafList clonedLeafList, YangLeavesHolder leafParentHolder, YangUses yangUses)
+            throws DataModelException {
+        int lineNumber;
+        int charPosition;
+        YangDataTypes dataTypes = clonedLeafList.getDataType().getDataType();
+        YangEntityToResolveInfoImpl yangEntityToResolveInfo = new YangEntityToResolveInfoImpl();
+        switch (dataTypes) {
+            case LEAFREF:
+                YangLeafRef leafRefForCloning = (YangLeafRef) clonedLeafList.getDataType().getDataTypeExtendedInfo();
+                // Conversion of prefixes in absolute path while cloning them.
+                convertThePrefixesDuringChange(leafRefForCloning, yangUses);
+                leafRefForCloning.setParentNodeOfLeafref((YangNode) leafParentHolder);
+                yangEntityToResolveInfo.setEntityToResolve(leafRefForCloning);
+                lineNumber = leafRefForCloning.getCharPosition();
+                charPosition = leafRefForCloning.getLineNumber();
+                break;
+            case IDENTITYREF:
+                YangIdentityRef identityRef = (YangIdentityRef) clonedLeafList.getDataType().getDataTypeExtendedInfo();
+
+                if (identityRef.isIdentityForInterFileGroupingResolution()) {
+                    return null;
+                }
+                yangEntityToResolveInfo.setEntityToResolve(identityRef);
+                lineNumber = identityRef.getCharPosition();
+                charPosition = identityRef.getLineNumber();
+                break;
+            case DERIVED:
+                YangType type = clonedLeafList.getDataType();
+                if (type.isTypeForInterFileGroupingResolution() && type.isTypeNotResolvedTillRootNode()) {
+                    return null;
+                }
+                yangEntityToResolveInfo.setEntityToResolve(type);
+                lineNumber = type.getCharPosition();
+                charPosition = type.getLineNumber();
+                break;
+            default:
+                return null;
+        }
+        yangEntityToResolveInfo.setHolderOfEntityToResolve((YangNode) leafParentHolder);
+        yangEntityToResolveInfo.setCharPosition(charPosition);
+        yangEntityToResolveInfo.setLineNumber(lineNumber);
+        return yangEntityToResolveInfo;
+    }
+
+    /**
      * Converts the prefixes in all the nodes of the leafref with respect to the uses node.
      *
      * @param leafrefForCloning leafref that is to be cloned
      * @param yangUses          instance of YANG uses where cloning is done
      * @throws DataModelException data model error
      */
-    private static void convertThePrefixesDuringChange(YangLeafRef leafrefForCloning, YangUses yangUses) throws
-            DataModelException {
+    private static void convertThePrefixesDuringChange(YangLeafRef leafrefForCloning, YangUses yangUses)
+            throws DataModelException {
         List<YangAtomicPath> atomicPathList = leafrefForCloning.getAtomicPath();
         if (atomicPathList != null && !atomicPathList.isEmpty()) {
             Iterator<YangAtomicPath> atomicPathIterator = atomicPathList.listIterator();
@@ -435,7 +547,8 @@
      * @throws DataModelException data model error
      */
     private static void assignCurrentLeafedWithNewPrefixes(String importedNodeName, YangAtomicPath atomicPath,
-                                                           YangNode node) throws DataModelException {
+            YangNode node)
+            throws DataModelException {
         while (!(node instanceof YangReferenceResolver)) {
             node = node.getParent();
             if (node == null) {
@@ -457,38 +570,14 @@
     }
 
     /**
-     * Resolves leafref in leaf-list, which are under grouping by adding it to the resolution list.
-     *
-     * @param clonedLeafList       cloned leaf-list in uses from grouping
-     * @param leafListParentHolder holder of the leaf-list from uses
-     * @return entity of leafref which has to be resolved
-     * @throws DataModelException data model error
-     */
-    public static YangEntityToResolveInfoImpl resolveLeafrefUnderGroupingForLeafList(YangLeafList clonedLeafList,
-                                                                                     YangLeavesHolder
-                                                                                             leafListParentHolder)
-            throws DataModelException {
-        if (clonedLeafList.getDataType().getDataTypeExtendedInfo() instanceof YangLeafRef) {
-            YangLeafRef leafrefForCloning = (YangLeafRef) clonedLeafList.getDataType().getDataTypeExtendedInfo();
-            leafrefForCloning.setParentNodeOfLeafref((YangNode) leafListParentHolder);
-            YangEntityToResolveInfoImpl yangEntityToResolveInfo = new YangEntityToResolveInfoImpl();
-            yangEntityToResolveInfo.setEntityToResolve(leafrefForCloning);
-            yangEntityToResolveInfo.setHolderOfEntityToResolve((YangNode) leafListParentHolder);
-            yangEntityToResolveInfo.setLineNumber(leafrefForCloning.getLineNumber());
-            yangEntityToResolveInfo.setCharPosition(leafrefForCloning.getCharPosition());
-            return yangEntityToResolveInfo;
-        }
-        return null;
-    }
-
-    /**
      * 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
      * @throws DataModelException when fails to do data model operations
      */
-    public static void updateClonedLeavesUnionEnumRef(YangLeavesHolder leavesHolder) throws DataModelException {
+    public static void updateClonedLeavesUnionEnumRef(YangLeavesHolder leavesHolder)
+            throws DataModelException {
         List<YangLeaf> currentListOfLeaves = leavesHolder.getListOfLeaf();
         if (currentListOfLeaves != null) {
             for (YangLeaf leaf : currentListOfLeaves) {
diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
index 17c3238..641af4c 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
@@ -21,6 +21,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
@@ -115,7 +116,8 @@
      * @param yangNodeSet set of YANG files info
      * @throws LinkerException fails to find imported module
      */
-    public void addRefToYangFilesImportList(Set<YangNode> yangNodeSet) throws LinkerException {
+    public void addRefToYangFilesImportList(Set<YangNode> yangNodeSet)
+            throws LinkerException {
         for (YangNode yangNode : yangNodeSet) {
             if (yangNode instanceof YangReferenceResolver) {
                 try {
@@ -137,7 +139,8 @@
      * @param yangNodeSet set of YANG files info
      * @throws LinkerException fails to find included sub-module
      */
-    public void addRefToYangFilesIncludeList(Set<YangNode> yangNodeSet) throws LinkerException {
+    public void addRefToYangFilesIncludeList(Set<YangNode> yangNodeSet)
+            throws LinkerException {
         for (YangNode yangNode : yangNodeSet) {
             if (yangNode instanceof YangReferenceResolver) {
                 try {
diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
index c9fedd8..fb80076 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
@@ -22,12 +22,15 @@
 import java.util.Set;
 import java.util.regex.Pattern;
 
+import org.onosproject.yangutils.datamodel.TraversalType;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangAugmentedInfo;
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
+import org.onosproject.yangutils.datamodel.YangGrouping;
+import org.onosproject.yangutils.datamodel.YangIdentityRef;
 import org.onosproject.yangutils.datamodel.YangImport;
 import org.onosproject.yangutils.datamodel.YangInclude;
 import org.onosproject.yangutils.datamodel.YangLeaf;
@@ -37,9 +40,21 @@
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangTypeDef;
+import org.onosproject.yangutils.datamodel.YangUses;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
 import org.onosproject.yangutils.linker.exceptions.LinkerException;
 
+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;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.addResolutionInfo;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
 import static org.onosproject.yangutils.utils.UtilConstants.COLON;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 
@@ -187,7 +202,8 @@
      * @return parent node which can hold data
      * @throws LinkerException a violation of linker rules
      */
-    static YangNode skipInvalidDataNodes(YangNode currentParent, YangLeafRef leafref) throws LinkerException {
+    static YangNode skipInvalidDataNodes(YangNode currentParent, YangLeafRef leafref)
+            throws LinkerException {
         while (currentParent instanceof YangChoice || currentParent instanceof YangCase) {
             if (currentParent.getParent() == null) {
                 throw new LinkerException("YANG file error: The target node, in the leafref path " +
@@ -206,7 +222,7 @@
      * @return valid node identifier
      */
     static YangNodeIdentifier getValidNodeIdentifier(String nodeIdentifierString,
-                                                     YangConstructType yangConstruct) {
+            YangConstructType yangConstruct) {
         String[] tmpData = nodeIdentifierString.split(Pattern.quote(COLON));
         if (tmpData.length == 1) {
             YangNodeIdentifier nodeIdentifier = new YangNodeIdentifier();
@@ -294,4 +310,163 @@
             }
         }
     }
+
+    /**
+     * Add the unresolved data under the root leve grouping to be resolved, since it will be used in interfile uses.
+     *
+     * @param referenceResolver module / sub-module
+     */
+    public static void resolveGroupingInDefinationScope(YangReferenceResolver referenceResolver) {
+        YangNode potentialInterFileGrouping = ((YangNode) referenceResolver).getChild();
+
+        while (potentialInterFileGrouping != null) {
+            if (potentialInterFileGrouping instanceof YangGrouping) {
+                addGroupingResolvableEntitiesToResolutionList((YangGrouping) potentialInterFileGrouping);
+            }
+
+            potentialInterFileGrouping = potentialInterFileGrouping.getNextSibling();
+        }
+    }
+
+    /**
+     * Add the interfile grouping resolvable entities to reesolution list.
+     *
+     * @param interFileGrouping interfile grouping
+     */
+    private static void addGroupingResolvableEntitiesToResolutionList(YangGrouping interFileGrouping) {
+        YangNode curNode = interFileGrouping;
+        TraversalType curTraversal = ROOT;
+        addResolvableLeavesToResolutionList((YangLeavesHolder) curNode);
+        curTraversal = CHILD;
+        curNode = interFileGrouping.getChild();
+        if (curNode == null) {
+            return;
+        }
+        while (curNode != interFileGrouping) {
+            if (curTraversal != PARENT) {
+                if (curNode instanceof YangGrouping || curNode instanceof YangUses) {
+                    if (curNode.getNextSibling() != null) {
+                        curTraversal = SIBILING;
+                        curNode = curNode.getNextSibling();
+                    } else {
+                        curTraversal = PARENT;
+                        curNode = curNode.getParent();
+                    }
+                    continue;
+                }
+
+                if (curNode instanceof YangLeavesHolder) {
+                    addResolvableLeavesToResolutionList((YangLeavesHolder) curNode);
+                } else if (curNode instanceof YangTypeDef) {
+                    List<YangType<?>> typeList = ((YangTypeDef) curNode).getTypeList();
+                    if (!typeList.isEmpty()) {
+                        YangType<?> type = typeList.get(0);
+                        if (type.getDataType() == DERIVED) {
+                            if (type.getResolvableStatus() != ResolvableStatus.RESOLVED) {
+
+                                type.setTypeForInterFileGroupingResolution(true);
+
+                                // Add resolution information to the list
+                                YangResolutionInfoImpl resolutionInfo =
+                                        new YangResolutionInfoImpl<YangType>(type, curNode, type.getLineNumber(),
+                                                type.getCharPosition());
+                                try {
+                                    addResolutionInfo(resolutionInfo);
+                                } catch (DataModelException e) {
+                                    throw new LinkerException("Failed to add type info in grouping to resolution ");
+                                }
+                            }
+                        }
+                    }
+                }
+
+            }
+            if (curTraversal != PARENT && curNode.getChild() != null) {
+                curTraversal = CHILD;
+                curNode = curNode.getChild();
+            } else if (curNode.getNextSibling() != null) {
+
+                curTraversal = SIBILING;
+                curNode = curNode.getNextSibling();
+            } else {
+                curTraversal = PARENT;
+                curNode = curNode.getParent();
+            }
+        }
+    }
+
+    /**
+     * Add resolvable leaves type info to resolution list.
+     *
+     * @param leavesHolder leaves holder node
+     */
+    private static void addResolvableLeavesToResolutionList(YangLeavesHolder leavesHolder) {
+        if (leavesHolder.getListOfLeaf() != null && !leavesHolder.getListOfLeaf().isEmpty()) {
+            for (YangLeaf leaf : leavesHolder.getListOfLeaf()) {
+                YangType type = leaf.getDataType();
+                if (type.getDataType() == DERIVED) {
+
+                    type.setTypeForInterFileGroupingResolution(true);
+
+                    // Add resolution information to the list
+                    YangResolutionInfoImpl resolutionInfo =
+                            new YangResolutionInfoImpl<YangType>(type, (YangNode) leavesHolder,
+                                    type.getLineNumber(), type.getCharPosition());
+                    try {
+                        addResolutionInfo(resolutionInfo);
+                    } catch (DataModelException e) {
+                        throw new LinkerException("Failed to add leaf type info in grouping, to resolution ");
+                    }
+                } else if (type.getDataType() == IDENTITYREF) {
+                    YangIdentityRef identityRef = (YangIdentityRef) type.getDataTypeExtendedInfo();
+
+                    identityRef.setIdentityForInterFileGroupingResolution(true);
+
+                    // Add resolution information to the list
+                    YangResolutionInfoImpl resolutionInfo =
+                            new YangResolutionInfoImpl<YangIdentityRef>(identityRef, (YangNode) leavesHolder,
+                                    identityRef.getLineNumber(), identityRef.getCharPosition());
+                    try {
+                        addResolutionInfo(resolutionInfo);
+                    } catch (DataModelException e) {
+                        throw new LinkerException("Failed to add leaf identity ref info in grouping, to resolution ");
+                    }
+                }
+            }
+        }
+
+        if (leavesHolder.getListOfLeafList() != null && !leavesHolder.getListOfLeafList().isEmpty()) {
+            for (YangLeafList leafList : leavesHolder.getListOfLeafList()) {
+                YangType type = leafList.getDataType();
+                if (type.getDataType() == DERIVED) {
+
+                    type.setTypeForInterFileGroupingResolution(true);
+
+                    // Add resolution information to the list
+                    YangResolutionInfoImpl resolutionInfo =
+                            new YangResolutionInfoImpl<YangType>(type, (YangNode) leavesHolder,
+                                    type.getLineNumber(), type.getCharPosition());
+                    try {
+                        addResolutionInfo(resolutionInfo);
+                    } catch (DataModelException e) {
+                        throw new LinkerException("Failed to add leaf type info in grouping, to resolution ");
+                    }
+                } else if (type.getDataType() == IDENTITYREF) {
+                    YangIdentityRef identityRef = (YangIdentityRef) type.getDataTypeExtendedInfo();
+
+                    identityRef.setIdentityForInterFileGroupingResolution(true);
+                    // Add resolution information to the list
+                    YangResolutionInfoImpl resolutionInfo =
+                            new YangResolutionInfoImpl<YangIdentityRef>(identityRef, (YangNode) leavesHolder,
+                                    identityRef.getLineNumber(), identityRef.getCharPosition());
+                    try {
+                        addResolutionInfo(resolutionInfo);
+                    } catch (DataModelException e) {
+                        throw new LinkerException("Failed to add leaf identity ref info in grouping, to resolution ");
+                    }
+                }
+            }
+        }
+    }
+
 }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
index f338672..00fb699 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
@@ -21,6 +21,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Stack;
+
 import org.onosproject.yangutils.datamodel.Resolvable;
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.TraversalType;
@@ -286,7 +287,8 @@
      * Adds the leafref/identityref type to the type, which has derived type referring to
      * typedef with leafref/identityref type.
      */
-    private void addDerivedRefTypeToRefTypeResolutionList() throws DataModelException {
+    private void addDerivedRefTypeToRefTypeResolutionList()
+            throws DataModelException {
 
         YangNode potentialAncestorWithReferredNode = getEntityToResolveInfo().getHolderOfEntityToResolve();
 
@@ -377,7 +379,7 @@
         if (entityToResolve != null && !entityToResolve.isEmpty()) {
             Iterator<T> entityToResolveIterator = entityToResolve.listIterator();
             while (entityToResolveIterator.hasNext()) {
-                addUnresolvedEntitiesToStack(entityToResolveIterator.next());
+                addUnresolvedEntitiesToResolutionList(entityToResolveIterator.next());
             }
         }
         if (((Resolvable) getCurrentEntityToResolveFromStack()).getResolvableStatus() != INTRA_FILE_RESOLVED
@@ -393,7 +395,8 @@
      * @param entityToResolve entity to resolve
      * @throws DataModelException a violation of data model rules
      */
-    private void addUnresolvedEntitiesToStack(T entityToResolve) throws DataModelException {
+    private void addUnresolvedEntitiesToResolutionList(T entityToResolve)
+            throws DataModelException {
         if (entityToResolve instanceof YangEntityToResolveInfoImpl) {
             YangEntityToResolveInfoImpl entityToResolveInfo = (YangEntityToResolveInfoImpl) entityToResolve;
             if (entityToResolveInfo.getEntityToResolve() instanceof YangLeafRef) {
@@ -403,12 +406,13 @@
                 if (leafref.getResolvableStatus() == UNRESOLVED) {
                     leafref.setResolvableStatus(INTRA_FILE_RESOLVED);
                 }
-                // Add resolution information to the list.
-                YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<YangLeafRef>(leafref,
-                        parentNodeOfLeafref, entityToResolveInfo.getLineNumber(),
-                        entityToResolveInfo.getCharPosition());
-                addResolutionInfo(resolutionInfoImpl);
             }
+
+            // Add resolution information to the list.
+            YangResolutionInfoImpl resolutionInfoImpl = new YangResolutionInfoImpl<>(
+                    entityToResolveInfo.getEntityToResolve(), entityToResolveInfo.getHolderOfEntityToResolve(),
+                    entityToResolveInfo.getLineNumber(), entityToResolveInfo.getCharPosition());
+            addResolutionInfo(resolutionInfoImpl);
         }
     }
 
@@ -450,6 +454,11 @@
             return;
         } else {
 
+            YangType type = null;
+            if (getCurrentEntityToResolveFromStack() instanceof YangType) {
+                type = (YangType) getCurrentEntityToResolveFromStack();
+            }
+
             /**
              * Traverse up in the ancestor tree to check if the referred node is
              * defined
@@ -465,6 +474,12 @@
                 }
 
                 potentialAncestorWithReferredNode = potentialAncestorWithReferredNode.getParent();
+
+                if (type != null && potentialAncestorWithReferredNode != null) {
+                    if (potentialAncestorWithReferredNode.getParent() == null) {
+                        type.setTypeNotResolvedTillRootNode(true);
+                    }
+                }
             }
         }
 
@@ -719,7 +734,8 @@
      * @throws DataModelException data model errors
      */
     private YangNode isReferredNodeInSiblingProcessedForIdentity(YangNode potentialReferredNode,
-                                                                 String referredNodeName) throws DataModelException {
+            String referredNodeName)
+            throws DataModelException {
 
         while (potentialReferredNode != null) {
             if (potentialReferredNode instanceof YangIdentity) {
@@ -902,7 +918,8 @@
         return false;
     }
 
-    private boolean isFeatureDefinedInNode(YangNode node) throws DataModelException {
+    private boolean isFeatureDefinedInNode(YangNode node)
+            throws DataModelException {
         YangNodeIdentifier ifFeature = ((YangIfFeature) getCurrentEntityToResolveFromStack()).getName();
         List<YangFeature> featureList = ((YangFeatureHolder) node).getFeatureList();
         if (featureList != null && !featureList.isEmpty()) {
@@ -1209,7 +1226,7 @@
      * @param root            root node
      */
     private void processXPathLinking(T entityToResolve,
-                                     YangReferenceResolver root) {
+            YangReferenceResolver root) {
 
         YangXpathLinker<T> xPathLinker = new YangXpathLinker<T>();
 
@@ -1455,7 +1472,8 @@
      * @param resolutionInfo information about the YANG construct which has to be resolved
      * @throws DataModelException a violation of data model rules
      */
-    public void setAbsolutePathFromRelativePathInLeafref(T resolutionInfo) throws DataModelException {
+    public void setAbsolutePathFromRelativePathInLeafref(T resolutionInfo)
+            throws DataModelException {
         if (resolutionInfo instanceof YangLeafRef) {
 
             YangNode parentOfLeafref = ((YangLeafRef) resolutionInfo).getParentNodeOfLeafref();
@@ -1504,7 +1522,8 @@
      * @throws DataModelException a violation of data model rules
      */
     private void fillAbsolutePathValuesInLeafref(YangLeafRef leafref, String pathNameToBePrefixed,
-                                                 List<YangAtomicPath> atomicPathsInRelative) throws DataModelException {
+            List<YangAtomicPath> atomicPathsInRelative)
+            throws DataModelException {
 
         leafref.setPathType(YangPathArgType.ABSOLUTE_PATH);
         String[] pathName = new String[0];
diff --git a/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IdentityrefListener.java b/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IdentityrefListener.java
index 49037e2..2d04602 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IdentityrefListener.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IdentityrefListener.java
@@ -33,11 +33,13 @@
 import static org.onosproject.yangutils.datamodel.utils.YangConstructType.IDENTITYREF_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction
+        .constructExtendedListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction
+        .constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerUtil.getValidNodeIdentifier;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
@@ -71,7 +73,7 @@
      * @param ctx      context object of the grammar rule
      */
     public static void processIdentityrefEntry(TreeWalkListener listener,
-                                        GeneratedYangParser.IdentityrefSpecificationContext ctx) {
+            GeneratedYangParser.IdentityrefSpecificationContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, IDENTITYREF_DATA, "", ENTRY);
@@ -85,7 +87,7 @@
 
             // Validate node identifier.
             YangNodeIdentifier nodeIdentifier = getValidNodeIdentifier(ctx.baseStatement().string().getText(),
-                                                                       BASE_DATA, ctx);
+                    BASE_DATA, ctx);
             identityRef.setBaseIdentity(nodeIdentifier);
             ((YangType) typeData).setDataTypeExtendedInfo(identityRef);
 
@@ -106,16 +108,17 @@
                     // Verify parent node of leaf
                     if (!(parentNodeOfLeaf instanceof YangNode)) {
                         throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
-                                                                                IDENTITYREF_DATA, ctx.getText(), EXIT));
+                                IDENTITYREF_DATA, ctx.getText(), EXIT));
                     }
 
                     identityRef.setResolvableStatus(UNRESOLVED);
 
-                    // Add resolution information to the list
-                    resolutionInfo =  new YangResolutionInfoImpl<YangIdentityRef>(identityRef,
-                                                  (YangNode) parentNodeOfLeaf, errorLine, errorPosition);
-                    addToResolutionList(resolutionInfo, ctx);
-
+                    if (listener.getGroupingDepth() == 0) {
+                        // Add resolution information to the list
+                        resolutionInfo = new YangResolutionInfoImpl<YangIdentityRef>(identityRef,
+                                (YangNode) parentNodeOfLeaf, errorLine, errorPosition);
+                        addToResolutionList(resolutionInfo, ctx);
+                    }
                     break;
                 case LEAF_LIST_DATA:
 
@@ -129,15 +132,17 @@
                     // Verify parent node of leaf
                     if (!(parentNodeOfLeafList instanceof YangNode)) {
                         throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
-                                                                                IDENTITYREF_DATA, ctx.getText(), EXIT));
+                                IDENTITYREF_DATA, ctx.getText(), EXIT));
                     }
 
                     identityRef.setResolvableStatus(UNRESOLVED);
 
-                    // Add resolution information to the list
-                    resolutionInfo = new YangResolutionInfoImpl<YangIdentityRef>(identityRef,
-                                               (YangNode) parentNodeOfLeafList, errorLine, errorPosition);
-                    addToResolutionList(resolutionInfo, ctx);
+                    if (listener.getGroupingDepth() == 0) {
+                        // Add resolution information to the list
+                        resolutionInfo = new YangResolutionInfoImpl<YangIdentityRef>(identityRef,
+                                (YangNode) parentNodeOfLeafList, errorLine, errorPosition);
+                        addToResolutionList(resolutionInfo, ctx);
+                    }
                     break;
                 case UNION_DATA:
 
@@ -146,16 +151,17 @@
                     // Verify parent node of leaf
                     if (!(parentNodeOfUnionNode instanceof YangNode)) {
                         throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
-                                                                                IDENTITYREF_DATA, ctx.getText(), EXIT));
+                                IDENTITYREF_DATA, ctx.getText(), EXIT));
                     }
 
                     identityRef.setResolvableStatus(UNRESOLVED);
 
-                    // Add resolution information to the list
-                    resolutionInfo = new YangResolutionInfoImpl<YangIdentityRef>(identityRef,
-                                              (YangNode) parentNodeOfUnionNode, errorLine, errorPosition);
-                    addToResolutionList(resolutionInfo, ctx);
-
+                    if (listener.getGroupingDepth() == 0) {
+                        // Add resolution information to the list
+                        resolutionInfo = new YangResolutionInfoImpl<YangIdentityRef>(identityRef,
+                                (YangNode) parentNodeOfUnionNode, errorLine, errorPosition);
+                        addToResolutionList(resolutionInfo, ctx);
+                    }
                     break;
                 case TYPEDEF_DATA:
                     /**
@@ -167,11 +173,11 @@
                     break;
                 default:
                     throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, IDENTITYREF_DATA,
-                                                                            ctx.getText(), EXIT));
+                            ctx.getText(), EXIT));
             }
             listener.getParsedDataStack().push(typeData);
             listener.getParsedDataStack().push(identityRef);
-         } else {
+        } else {
             throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, IDENTITYREF_DATA, "", ENTRY));
         }
     }
@@ -184,7 +190,7 @@
      * @param ctx      context object of the grammar rule
      */
     public static void processIdentityrefExit(TreeWalkListener listener,
-                                       GeneratedYangParser.IdentityrefSpecificationContext ctx) {
+            GeneratedYangParser.IdentityrefSpecificationContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_CURRENT_HOLDER, IDENTITYREF_DATA, ctx.getText(), EXIT);
@@ -192,7 +198,7 @@
         Parsable parsableType = listener.getParsedDataStack().pop();
         if (!(parsableType instanceof YangIdentityRef)) {
             throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, IDENTITYREF_DATA,
-                                                                    ctx.getText(), EXIT));
+                    ctx.getText(), EXIT));
         }
     }
 
@@ -203,12 +209,12 @@
      * @param ctx            context object of the grammar rule
      */
     private static void addToResolutionList(YangResolutionInfoImpl<YangIdentityRef> resolutionInfo,
-                                            GeneratedYangParser.IdentityrefSpecificationContext ctx) {
+            GeneratedYangParser.IdentityrefSpecificationContext ctx) {
         try {
             addResolutionInfo(resolutionInfo);
         } catch (DataModelException e) {
             throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
-                                               IDENTITYREF_DATA, ctx.getText(), ENTRY, e.getMessage()));
+                    IDENTITYREF_DATA, ctx.getText(), ENTRY, e.getMessage()));
         }
     }
 }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java b/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
index 972d1ef..c77ffea 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
@@ -17,6 +17,7 @@
 package org.onosproject.yangutils.parser.impl.listeners;
 
 import java.util.Date;
+
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java b/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
index 3c7fba9..73b62b2 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
@@ -38,8 +38,10 @@
 import static org.onosproject.yangutils.datamodel.utils.YangConstructType.TYPE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction
+        .constructExtendedListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction
+        .constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
@@ -82,7 +84,7 @@
      * @param ctx      context object of the grammar rule
      */
     public static void processTypeEntry(TreeWalkListener listener,
-                                        GeneratedYangParser.TypeStatementContext ctx) {
+            GeneratedYangParser.TypeStatementContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPE_DATA, ctx.string().getText(), ENTRY);
@@ -136,10 +138,12 @@
 
                     type.setResolvableStatus(UNRESOLVED);
 
-                    // Add resolution information to the list
-                    YangResolutionInfoImpl resolutionInfo = new YangResolutionInfoImpl<YangType>(type,
-                            (YangNode) parentNodeOfLeaf, errorLine, errorPosition);
-                    addToResolutionList(resolutionInfo, ctx);
+                    if (listener.getGroupingDepth() == 0) {
+                        // Add resolution information to the list
+                        YangResolutionInfoImpl resolutionInfo = new YangResolutionInfoImpl<YangType>(type,
+                                (YangNode) parentNodeOfLeaf, errorLine, errorPosition);
+                        addToResolutionList(resolutionInfo, ctx);
+                    }
                 }
                 break;
             case LEAF_LIST_DATA:
@@ -166,11 +170,13 @@
                     YangDerivedInfo<?> yangDerivedInfo = new YangDerivedInfo<>();
                     ((YangType<YangDerivedInfo>) type).setDataTypeExtendedInfo(yangDerivedInfo);
 
-                    // Add resolution information to the list
-                    YangResolutionInfoImpl resolutionInfo =
-                            new YangResolutionInfoImpl<YangType>(type, (YangNode) parentNodeOfLeafList, errorLine,
-                                    errorPosition);
-                    addToResolutionList(resolutionInfo, ctx);
+                    if (listener.getGroupingDepth() == 0) {
+                        // Add resolution information to the list
+                        YangResolutionInfoImpl resolutionInfo =
+                                new YangResolutionInfoImpl<YangType>(type, (YangNode) parentNodeOfLeafList, errorLine,
+                                        errorPosition);
+                        addToResolutionList(resolutionInfo, ctx);
+                    }
                 }
                 break;
             case UNION_DATA:
@@ -196,10 +202,12 @@
 
                     type.setResolvableStatus(UNRESOLVED);
 
-                    // Add resolution information to the list
-                    YangResolutionInfoImpl resolutionInfo =
-                            new YangResolutionInfoImpl<YangType>(type, unionNode, errorLine, errorPosition);
-                    addToResolutionList(resolutionInfo, ctx);
+                    if (listener.getGroupingDepth() == 0) {
+                        // Add resolution information to the list
+                        YangResolutionInfoImpl resolutionInfo =
+                                new YangResolutionInfoImpl<YangType>(type, unionNode, errorLine, errorPosition);
+                        addToResolutionList(resolutionInfo, ctx);
+                    }
                 }
 
                 break;
@@ -218,11 +226,12 @@
                     ((YangType<YangDerivedInfo>) type).setDataTypeExtendedInfo(yangDerivedInfo);
 
                     type.setResolvableStatus(UNRESOLVED);
-
-                    // Add resolution information to the list
-                    YangResolutionInfoImpl resolutionInfo =
-                            new YangResolutionInfoImpl<YangType>(type, typeDef, errorLine, errorPosition);
-                    addToResolutionList(resolutionInfo, ctx);
+                    if (listener.getGroupingDepth() == 0) {
+                        // Add resolution information to the list
+                        YangResolutionInfoImpl resolutionInfo =
+                                new YangResolutionInfoImpl<YangType>(type, typeDef, errorLine, errorPosition);
+                        addToResolutionList(resolutionInfo, ctx);
+                    }
                 }
                 break;
             //TODO: deviate replacement statement.
@@ -256,7 +265,7 @@
      * @param ctx      context object of the grammar rule
      */
     public static void processTypeExit(TreeWalkListener listener,
-                                       GeneratedYangParser.TypeStatementContext ctx) {
+            GeneratedYangParser.TypeStatementContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_CURRENT_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT);
@@ -275,7 +284,7 @@
      * @param ctx            context object of the grammar rule
      */
     private static void addToResolutionList(YangResolutionInfoImpl<YangType> resolutionInfo,
-                                            GeneratedYangParser.TypeStatementContext ctx) {
+            GeneratedYangParser.TypeStatementContext ctx) {
         try {
             addResolutionInfo(resolutionInfo);
         } catch (DataModelException e) {
@@ -291,7 +300,7 @@
      * @param yangDataType yang data type
      */
     private static void validateTypeSubStatementCardinality(GeneratedYangParser.TypeStatementContext ctx,
-                                                            YangDataTypes yangDataType) {
+            YangDataTypes yangDataType) {
         if (ctx.typeBodyStatements() == null || ctx.typeBodyStatements().isEmpty()) {
             ParserException parserException;
             switch (yangDataType) {
@@ -317,7 +326,7 @@
                     break;
                 case IDENTITYREF:
                     parserException = new ParserException("YANG file error : a type identityref" +
-                                                                  " must have base statement.");
+                            " must have base statement.");
                     break;
                 default:
                     return;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index af4deb9..9ffb424 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -32,6 +32,8 @@
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.YangReferenceResolver;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.linker.YangLinker;
 import org.onosproject.yangutils.linker.exceptions.LinkerException;
 import org.onosproject.yangutils.linker.impl.YangLinkerManager;
@@ -45,6 +47,9 @@
 
 import static org.apache.maven.plugins.annotations.LifecyclePhase.GENERATE_SOURCES;
 import static org.apache.maven.plugins.annotations.ResolutionScope.COMPILE;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_DERIVED_DATA_TYPE;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_IDENTITYREF;
+import static org.onosproject.yangutils.linker.impl.YangLinkerUtils.resolveGroupingInDefinationScope;
 import static org.onosproject.yangutils.plugin.manager.YangPluginUtils.addToCompilationRoot;
 import static org.onosproject.yangutils.plugin.manager.YangPluginUtils.copyYangFilesToTarget;
 import static org.onosproject.yangutils.plugin.manager.YangPluginUtils.resolveInterJarDependencies;
@@ -214,7 +219,6 @@
             if (getCurYangFileInfo() != null) {
                 fileName = getCurYangFileInfo().getYangFileName();
             }
-
             try {
                 translatorErrorHandler(getRootNode(), yangPlugin);
                 deleteDirectory(getDirectory(baseDir, classFileDir) + DEFAULT_PKG);
@@ -242,7 +246,8 @@
      *
      * @throws IOException when fails to do IO operations
      */
-    private void resolveInterJarDependency() throws IOException {
+    private void resolveInterJarDependency()
+            throws IOException {
         try {
             List<YangNode> interJarResolvedNodes = resolveInterJarDependencies(project, localRepository,
                     remoteRepository, getDirectory(baseDir, outputDirectory));
@@ -298,6 +303,13 @@
                     YangNode yangNode = yangUtilsParser.getDataModel(yangFileInfo.getYangFileName());
                     yangFileInfo.setRootNode(yangNode);
                     setRootNode(yangNode);
+                    resolveGroupingInDefinationScope((YangReferenceResolver) yangNode);
+                    try {
+                        ((YangReferenceResolver) yangNode).resolveSelfFileLinking(YANG_DERIVED_DATA_TYPE);
+                        ((YangReferenceResolver) yangNode).resolveSelfFileLinking(YANG_IDENTITYREF);
+                    } catch (DataModelException e) {
+                        //TODO: throw exception : throw e;
+                    }
                 } catch (ParserException e) {
                     String logInfo = "Error in file: " + e.getFileName();
                     if (e.getLineNumber() != 0) {
