diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
index f63d8df..8cfe779 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerManager.java
@@ -16,9 +16,15 @@
 
 package org.onosproject.yangutils.linker.impl;
 
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Set;
 import org.onosproject.yangutils.datamodel.ResolvableType;
+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.YangSubModule;
@@ -73,6 +79,9 @@
         // Add reference to include list.
         addRefToYangFilesIncludeList(yangNodeSet);
 
+        // Update the priority for all the files.
+        updateFilePriority(yangNodeSet);
+
         // TODO check for circular import/include.
 
         // Carry out inter-file linking.
@@ -154,7 +163,10 @@
      */
     public void processInterFileLinking(Set<YangNode> yangNodeSet)
             throws LinkerException {
-        for (YangNode yangNode : yangNodeSet) {
+        List<YangNode> yangNodeSortedList = new LinkedList<>();
+        yangNodeSortedList.addAll(yangNodeSet);
+        Collections.sort(yangNodeSortedList);
+        for (YangNode yangNode : yangNodeSortedList) {
             try {
                 ((YangReferenceResolver) yangNode)
                         .resolveInterFileLinking(ResolvableType.YANG_IF_FEATURE);
@@ -178,4 +190,53 @@
             }
         }
     }
+
+    /**
+     * Updates the priority for all the input files.
+     *
+     * @param yangNodeSet set of YANG files info
+     */
+    public void updateFilePriority(Set<YangNode> yangNodeSet) {
+        for (YangNode yangNode : yangNodeSet) {
+            updateFilePriorityOfNode(yangNode);
+        }
+    }
+
+    /**
+     * Updates priority of the node.
+     *
+     * @param yangNode YANG node information
+     */
+    public void updateFilePriorityOfNode(YangNode yangNode) {
+        int curNodePriority = yangNode.getPriority();
+        if (yangNode instanceof YangReferenceResolver) {
+            List<YangImport> yangImportList = ((YangReferenceResolver) yangNode).getImportList();
+            if (yangImportList != null && !yangImportList.isEmpty()) {
+                Iterator<YangImport> importInfoIterator = yangImportList.iterator();
+                // Run through the imported list to update priority.
+                while (importInfoIterator.hasNext()) {
+                    YangImport yangImport = importInfoIterator.next();
+                    YangNode importedNode = yangImport.getImportedNode();
+                    if (curNodePriority >= importedNode.getPriority()) {
+                        importedNode.setPriority(curNodePriority + 1);
+                        updateFilePriorityOfNode(importedNode);
+                    }
+                }
+            }
+
+            List<YangInclude> yangIncludeList = ((YangReferenceResolver) yangNode).getIncludeList();
+            if (yangIncludeList != null && !yangIncludeList.isEmpty()) {
+                Iterator<YangInclude> includeInfoIterator = yangIncludeList.iterator();
+                // Run through the imported list to update priority.
+                while (includeInfoIterator.hasNext()) {
+                    YangInclude yangInclude = includeInfoIterator.next();
+                    YangNode includedNode = yangInclude.getIncludedNode();
+                    if (curNodePriority >= includedNode.getPriority()) {
+                        includedNode.setPriority(curNodePriority + 1);
+                        updateFilePriorityOfNode(includedNode);
+                    }
+                }
+            }
+        }
+    }
 }
