diff --git a/src/main/java/org/onosproject/yangutils/linker/impl/YangEntityToResolveInfo.java b/src/main/java/org/onosproject/yangutils/linker/impl/YangEntityToResolveInfoImpl.java
similarity index 77%
rename from src/main/java/org/onosproject/yangutils/linker/impl/YangEntityToResolveInfo.java
rename to src/main/java/org/onosproject/yangutils/linker/impl/YangEntityToResolveInfoImpl.java
index f239692..b8f63eb 100644
--- a/src/main/java/org/onosproject/yangutils/linker/impl/YangEntityToResolveInfo.java
+++ b/src/main/java/org/onosproject/yangutils/linker/impl/YangEntityToResolveInfoImpl.java
@@ -15,17 +15,18 @@
  */
 package org.onosproject.yangutils.linker.impl;
 
+import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangUses;
 import org.onosproject.yangutils.linker.exceptions.LinkerException;
 
 /**
- * Represents information about entity being resolved.
+ * Represents implementation of information about entity being resolved.
  *
  * @param <T> type of entity being resolved, uses / grouping
  */
-public class YangEntityToResolveInfo<T> {
+public class YangEntityToResolveInfoImpl<T> implements YangEntityToResolveInfo<T> {
 
     // Parsable node for which resolution is to be performed.
     private T entityToResolve;
@@ -33,39 +34,22 @@
     // Holder of the YANG construct for which resolution has to be carried out.
     private YangNode holderOfEntityToResolve;
 
-    /**
-     * Retrieves the entity to be resolved.
-     *
-     * @return entity to be resolved
-     */
+    @Override
     public T getEntityToResolve() {
         return entityToResolve;
     }
 
-    /**
-     * Sets entity to be resolved.
-     *
-     * @param entityToResolve entity to be resolved
-     */
+    @Override
     public void setEntityToResolve(T entityToResolve) {
         this.entityToResolve = entityToResolve;
     }
 
-    /**
-     * Retrieves the parent node which contains the entity to be resolved.
-     *
-     * @return parent node which contains the entity to be resolved
-     */
+    @Override
     public YangNode getHolderOfEntityToResolve() {
         return holderOfEntityToResolve;
     }
 
-    /**
-     * Sets parent node which contains the entity to be resolved.
-     *
-     * @param holderOfEntityToResolve parent node which contains the entity to
-     *                                be resolved
-     */
+    @Override
     public void setHolderOfEntityToResolve(YangNode holderOfEntityToResolve) {
         this.holderOfEntityToResolve = holderOfEntityToResolve;
     }
diff --git a/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java b/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
index deaebb2..4e8a60a 100644
--- a/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
+++ b/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
@@ -16,14 +16,14 @@
 
 package org.onosproject.yangutils.linker.impl;
 
+import java.util.HashSet;
 import java.util.Set;
-
+import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.YangReferenceResolver;
 import org.onosproject.yangutils.datamodel.YangSubModule;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
-import org.onosproject.yangutils.linker.ResolvableType;
 import org.onosproject.yangutils.linker.YangLinker;
-import org.onosproject.yangutils.linker.YangReferenceResolver;
 import org.onosproject.yangutils.linker.exceptions.LinkerException;
 import org.onosproject.yangutils.plugin.manager.YangFileInfo;
 
@@ -34,9 +34,39 @@
  */
 public class YangLinkerManager
         implements YangLinker {
+
+    /*
+     * Set of all the YANG nodes, corresponding to the YANG files parsed by
+     * parser.
+     */
+    Set<YangNode> yangNodeSet = new HashSet<>();
+
+    /**
+     * Returns set of YANG node.
+     *
+     * @return set of YANG node
+     */
+    public Set<YangNode> getYangNodeSet() {
+        return yangNodeSet;
+    }
+
+    /**
+     * Creates YANG nodes set.
+     *
+     * @param yangFileInfoSet YANG file information set
+     */
+    public void createYangNodeSet(Set<YangFileInfo> yangFileInfoSet) {
+        for (YangFileInfo yangFileInfo : yangFileInfoSet) {
+            getYangNodeSet().add(yangFileInfo.getRootNode());
+        }
+    }
+
     @Override
     public void resolveDependencies(Set<YangFileInfo> yangFileInfoSet) {
 
+        // Create YANG node set.
+        createYangNodeSet(yangFileInfoSet);
+
         // Carry out linking of sub module with module.
         linkSubModulesToParentModule(yangFileInfoSet);
 
@@ -64,7 +94,7 @@
             YangNode yangNode = yangFileInfo.getRootNode();
             if (yangNode instanceof YangSubModule) {
                 try {
-                    ((YangSubModule) yangNode).linkWithModule(yangFileInfoSet);
+                    ((YangSubModule) yangNode).linkWithModule(getYangNodeSet());
                 } catch (DataModelException e) {
                     String errorInfo = "YANG file error: " + yangFileInfo.getYangFileName() + " at line: "
                             + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE
@@ -85,7 +115,14 @@
         for (YangFileInfo yangFileInfo : yangFileInfoSet) {
             YangNode yangNode = yangFileInfo.getRootNode();
             if (yangNode instanceof YangReferenceResolver) {
-                ((YangReferenceResolver) yangNode).addReferencesToImportList(yangFileInfoSet);
+                try {
+                    ((YangReferenceResolver) yangNode).addReferencesToImportList(getYangNodeSet());
+                } catch (DataModelException e) {
+                    String errorInfo = "Error in file: " + yangFileInfo.getYangFileName() + " at line: "
+                            + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE
+                            + e.getMessage();
+                    throw new LinkerException(errorInfo);
+                }
             }
         }
     }
@@ -100,7 +137,14 @@
         for (YangFileInfo yangFileInfo : yangFileInfoSet) {
             YangNode yangNode = yangFileInfo.getRootNode();
             if (yangNode instanceof YangReferenceResolver) {
-                ((YangReferenceResolver) yangNode).addReferencesToIncludeList(yangFileInfoSet);
+                try {
+                    ((YangReferenceResolver) yangNode).addReferencesToIncludeList(getYangNodeSet());
+                } catch (DataModelException e) {
+                    String errorInfo = "Error in file: " + yangFileInfo.getYangFileName() + " at line: "
+                            + e.getLineNumber() + " at position: " + e.getCharPositionInLine() + NEW_LINE
+                            + e.getMessage();
+                    throw new LinkerException(errorInfo);
+                }
             }
         }
     }
diff --git a/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java b/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
similarity index 94%
rename from src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java
rename to src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
index 83b11c4..0d43293 100644
--- a/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfo.java
+++ b/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
@@ -17,14 +17,14 @@
 package org.onosproject.yangutils.linker.impl;
 
 import java.util.Stack;
-
-import org.onosproject.yangutils.datamodel.LocationInfo;
 import org.onosproject.yangutils.datamodel.YangDataTypes;
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangGrouping;
 import org.onosproject.yangutils.datamodel.YangImport;
 import org.onosproject.yangutils.datamodel.YangInclude;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.YangReferenceResolver;
+import org.onosproject.yangutils.datamodel.YangResolutionInfo;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.YangUses;
@@ -32,7 +32,6 @@
 import org.onosproject.yangutils.linker.Resolvable;
 import org.onosproject.yangutils.linker.ResolvableStatus;
 import org.onosproject.yangutils.linker.YangLinkingPhase;
-import org.onosproject.yangutils.linker.YangReferenceResolver;
 
 import static org.onosproject.yangutils.linker.ResolvableStatus.INTER_FILE_LINKED;
 import static org.onosproject.yangutils.linker.ResolvableStatus.INTRA_FILE_RESOLVED;
@@ -41,21 +40,22 @@
 import static org.onosproject.yangutils.linker.ResolvableStatus.UNRESOLVED;
 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTER_FILE;
 import static org.onosproject.yangutils.linker.YangLinkingPhase.INTRA_FILE;
-import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR;
 import static org.onosproject.yangutils.utils.UtilConstants.GROUPING_LINKER_ERROR;
+import static org.onosproject.yangutils.utils.UtilConstants.TYPEDEF_LINKER_ERROR;
 
 /**
- * Represents resolution object which will be resolved by linker.
+ * Represents implementation of resolution object which will be resolved by
+ * linker.
  *
  * @param <T> type of resolution entity uses / type
  */
-public class YangResolutionInfo<T>
-        implements LocationInfo {
+public class YangResolutionInfoImpl<T>
+        implements YangResolutionInfo<T> {
 
     /**
      * Information about the entity that needs to be resolved.
      */
-    private YangEntityToResolveInfo<T> entityToResolveInfo;
+    private YangEntityToResolveInfoImpl<T> entityToResolveInfo;
 
     /**
      * Error line number.
@@ -77,14 +77,14 @@
      * Stack for type/uses is maintained for hierarchical references, this is
      * used during resolution.
      */
-    private Stack<YangEntityToResolveInfo<T>> partialResolvedStack;
+    private Stack<YangEntityToResolveInfoImpl<T>> partialResolvedStack;
 
     /**
      * It is private to ensure the overloaded method be invoked to create an
      * object.
      */
     @SuppressWarnings("unused")
-    private YangResolutionInfo() {
+    private YangResolutionInfoImpl() {
 
     }
 
@@ -96,8 +96,8 @@
      * @param lineNumber         error line number
      * @param charPositionInLine error character position in line
      */
-    public YangResolutionInfo(T dataNode, YangNode holderNode, int lineNumber, int charPositionInLine) {
-        setEntityToResolveInfo(new YangEntityToResolveInfo<>());
+    public YangResolutionInfoImpl(T dataNode, YangNode holderNode, int lineNumber, int charPositionInLine) {
+        setEntityToResolveInfo(new YangEntityToResolveInfoImpl<>());
         getEntityToResolveInfo().setEntityToResolve(dataNode);
         getEntityToResolveInfo().setHolderOfEntityToResolve(holderNode);
         this.setLineNumber(lineNumber);
@@ -105,13 +105,7 @@
         setPartialResolvedStack(new Stack<>());
     }
 
-    /**
-     * Resolves linking with all the ancestors node for a resolution info.
-     *
-     * @param dataModelRootNode module/sub-module node
-     * @throws DataModelException DataModelException a violation of data model
-     *                            rules
-     */
+    @Override
     public void resolveLinkingForResolutionInfo(YangReferenceResolver dataModelRootNode)
             throws DataModelException {
 
@@ -431,11 +425,12 @@
             if (((YangTypeDef) referredNode).getTypeDefBaseType().getDataType()
                     == YangDataTypes.DERIVED) {
 
-                YangEntityToResolveInfo<YangType<?>> unResolvedEntityInfo = new YangEntityToResolveInfo<>();
+                YangEntityToResolveInfoImpl<YangType<?>> unResolvedEntityInfo
+                        = new YangEntityToResolveInfoImpl<>();
                 unResolvedEntityInfo.setEntityToResolve(((YangTypeDef) referredNode)
                         .getTypeDefBaseType());
                 unResolvedEntityInfo.setHolderOfEntityToResolve(referredNode);
-                addInPartialResolvedStack((YangEntityToResolveInfo<T>) unResolvedEntityInfo);
+                addInPartialResolvedStack((YangEntityToResolveInfoImpl<T>) unResolvedEntityInfo);
             }
 
         } else if (getCurrentEntityToResolveFromStack() instanceof YangUses) {
@@ -462,10 +457,10 @@
         YangNode curNode = node.getChild();
         while (curNode != null) {
             if (curNode instanceof YangUses) {
-                YangEntityToResolveInfo<YangUses> unResolvedEntityInfo = new YangEntityToResolveInfo<>();
+                YangEntityToResolveInfoImpl<YangUses> unResolvedEntityInfo = new YangEntityToResolveInfoImpl<>();
                 unResolvedEntityInfo.setEntityToResolve((YangUses) curNode);
                 unResolvedEntityInfo.setHolderOfEntityToResolve(node);
-                addInPartialResolvedStack((YangEntityToResolveInfo<T>) unResolvedEntityInfo);
+                addInPartialResolvedStack((YangEntityToResolveInfoImpl<T>) unResolvedEntityInfo);
 
             }
             curNode = curNode.getNextSibling();
@@ -478,7 +473,7 @@
      *
      * @return partial resolved YANG construct stack
      */
-    private Stack<YangEntityToResolveInfo<T>> getPartialResolvedStack() {
+    private Stack<YangEntityToResolveInfoImpl<T>> getPartialResolvedStack() {
         return partialResolvedStack;
     }
 
@@ -487,7 +482,7 @@
      *
      * @param partialResolvedStack partial resolved YANG construct stack
      */
-    private void setPartialResolvedStack(Stack<YangEntityToResolveInfo<T>> partialResolvedStack) {
+    private void setPartialResolvedStack(Stack<YangEntityToResolveInfoImpl<T>> partialResolvedStack) {
         this.partialResolvedStack = partialResolvedStack;
     }
 
@@ -496,7 +491,7 @@
      *
      * @param partialResolvedInfo partial resolved YANG construct stack
      */
-    private void addInPartialResolvedStack(YangEntityToResolveInfo<T> partialResolvedInfo) {
+    private void addInPartialResolvedStack(YangEntityToResolveInfoImpl<T> partialResolvedInfo) {
         getPartialResolvedStack().push(partialResolvedInfo);
     }
 
@@ -510,12 +505,8 @@
         return getPartialResolvedStack().peek().getEntityToResolve();
     }
 
-    /**
-     * Retrieves information about the entity that needs to be resolved.
-     *
-     * @return information about the entity that needs to be resolved
-     */
-    public YangEntityToResolveInfo<T> getEntityToResolveInfo() {
+    @Override
+    public YangEntityToResolveInfoImpl<T> getEntityToResolveInfo() {
         return entityToResolveInfo;
     }
 
@@ -525,7 +516,7 @@
      * @param entityToResolveInfo information about the entity that needs to be
      *                            resolved
      */
-    private void setEntityToResolveInfo(YangEntityToResolveInfo<T> entityToResolveInfo) {
+    private void setEntityToResolveInfo(YangEntityToResolveInfoImpl<T> entityToResolveInfo) {
         this.entityToResolveInfo = entityToResolveInfo;
     }
 
@@ -569,13 +560,7 @@
         this.curReferenceResolver = curReferenceResolver;
     }
 
-    /**
-     * Performs inter file linking of uses/type referring to typedef/grouping
-     * of other YANG file.
-     *
-     * @param dataModelRootNode module/sub-module node
-     * @throws DataModelException a violation in data model rule
-     */
+    @Override
     public void linkInterFile(YangReferenceResolver dataModelRootNode)
             throws DataModelException {
 
