diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangIdentity.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangIdentity.java
index 608c1ea..8890aa4 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangIdentity.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangIdentity.java
@@ -70,6 +70,9 @@
     //YANG reference of the identity.
     private String reference;
 
+    //Status if identity is added to all the parent.
+    private boolean isAddedToAllParent;
+
     /*
      * Identity extend list to contain list of all the direct/indirect derived
      * identities.
@@ -213,4 +216,22 @@
     public void setConflictFlag() {
         nameConflict = true;
     }
+
+    /**
+     * Returns if the identity is added to all the parent nodes.
+     *
+     * @return returns true if added; false otherwise
+     */
+    public boolean isAddedToAllParent() {
+        return isAddedToAllParent;
+    }
+
+    /**
+     * Sets if the identity is added to all the parent nodes.
+     *
+     * @param addedToAllParent sets true if added; false otherwise
+     */
+    public void setAddedToAllParent(boolean addedToAllParent) {
+        isAddedToAllParent = addedToAllParent;
+    }
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
index ca23010..adc73c1 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
@@ -16,6 +16,7 @@
 package org.onosproject.yang.compiler.datamodel;
 
 import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.IdentityHandler;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
 import org.onosproject.yang.model.YangNamespace;
@@ -701,6 +702,18 @@
     }
 
     /**
+     * Adds all the derived identities to the base identity.
+     *
+     * @throws DataModelException a violation of data model rules
+     */
+    public void resolveIdentityExtendList() throws DataModelException {
+        for (YangResolutionInfo base : baseResolutionList) {
+           new IdentityHandler((YangBase) base.getEntityToResolveInfo()
+                   .getEntityToResolve());
+        }
+    }
+
+    /**
      * Returns the type of the parsed data.
      *
      * @return returns MODULE_DATA
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangReferenceResolver.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangReferenceResolver.java
index 865b020..9688b2a 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangReferenceResolver.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangReferenceResolver.java
@@ -149,6 +149,13 @@
     void resolveUniqueLinking() throws DataModelException;
 
     /**
+     * Resolves identity extend list.
+     *
+     * @throws DataModelException a violation in data model rule
+     */
+    void resolveIdentityExtendList() throws DataModelException;
+
+    /**
      * Adds references to include.
      *
      * @param yangNodeSet YANG node info set
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
index bab5092..a4ff0fc 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
@@ -16,6 +16,7 @@
 package org.onosproject.yang.compiler.datamodel;
 
 import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.IdentityHandler;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
 import org.onosproject.yang.model.YangNamespace;
@@ -965,6 +966,18 @@
         }
     }
 
+    /**
+     * Adds all the derived identities to the base identity.
+     *
+     * @throws DataModelException a violation of data model rules
+     */
+    public void resolveIdentityExtendList() throws DataModelException {
+        for (YangResolutionInfo base : baseResolutionList) {
+            new IdentityHandler((YangBase) base.getEntityToResolveInfo()
+                    .getEntityToResolve());
+        }
+    }
+
     @Override
     public void addToIdentityTypedefMap(String name, YangNode node)
             throws DataModelException {
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/IdentityHandler.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/IdentityHandler.java
new file mode 100644
index 0000000..94c0c26
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/IdentityHandler.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.yang.compiler.datamodel.utils;
+
+import org.onosproject.yang.compiler.datamodel.YangBase;
+import org.onosproject.yang.compiler.datamodel.YangIdentity;
+
+import java.util.List;
+import java.util.Stack;
+
+/**
+ * Represents identity extend-list handling.
+ */
+public class IdentityHandler {
+
+    /**
+     * Stack to store the resolvable identities.
+     */
+    private Stack<YangIdentity> stack;
+
+    /**
+     * Creates a new identity handler.
+     *
+     * @param base YANG base
+     */
+    public IdentityHandler(YangBase base) {
+        stack = new Stack<>();
+        YangIdentity id = base.getParentIdentity();
+        if (id.isAddedToAllParent()) {
+            return;
+        }
+        stack.push(id);
+        addToExtendList();
+    }
+
+    /**
+     * Adds to the extend list for all the parent nodes with its complete tree.
+     */
+    public void addToExtendList() {
+        while (!stack.empty()) {
+            YangIdentity baseId = stack.peek();
+            List<YangIdentity> exList = baseId.getExtendList();
+            if (exList != null && !exList.isEmpty()) {
+                for (YangIdentity id : exList) {
+                    if (!id.isAddedToAllParent()) {
+                        stack.push(id);
+                    }
+                }
+            }
+            YangIdentity resolvingId = stack.pop();
+            addToAllParent(resolvingId, resolvingId.getBaseNode().getReferredIdentity());
+        }
+    }
+
+    /**
+     * Adds an identity to all the parent nodes.
+     *
+     * @param referredId referred identity
+     * @param baseId     base identity
+     */
+    private void addToAllParent(YangIdentity referredId, YangIdentity baseId) {
+        YangIdentity baseIdentity = baseId;
+        while (baseIdentity != null) {
+            List<YangIdentity> list = baseIdentity.getExtendList();
+            if (!list.contains(referredId)) {
+                baseIdentity.addToExtendList(referredId);
+            }
+
+            YangBase base = baseIdentity.getBaseNode();
+            baseIdentity = null;
+            if (base != null) {
+                baseIdentity = base.getReferredIdentity();
+            }
+        }
+        referredId.setAddedToAllParent(true);
+    }
+}
diff --git a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerManager.java b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerManager.java
index 743207b..dacc201 100644
--- a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerManager.java
+++ b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerManager.java
@@ -96,6 +96,42 @@
         processInterFileLinking(yangNodeSet);
 
         processUniqueLinking(yangNodeSet);
+
+        processIdentityExtendList(yangNodeSet);
+    }
+
+    /**
+     * Processes the identities and add it to all the parents respectively.
+     *
+     * @param nodeSet set of YANG files info
+     */
+    public void processIdentityExtendList(Set<YangNode> nodeSet) {
+        List<YangNode> list = new LinkedList<>();
+        list.addAll(nodeSet);
+        sort(list);
+        for (YangNode yangNode : list) {
+            try {
+                YangReferenceResolver resolver =
+                        ((YangReferenceResolver) yangNode);
+                resolver.resolveIdentityExtendList();
+            } catch (DataModelException e) {
+                String errorInfo = "Error in file: " + yangNode.getName() +
+                        " in " + yangNode.getFileName() + " at " +
+                        "line: " + e.getLineNumber() + " at position: " +
+                        e.getCharPositionInLine() + NEW_LINE +
+                        e.getLocalizedMessage();
+                throw new LinkerException(errorInfo);
+                // TODO add file path in exception message in util manager.
+            } catch (LinkerException e) {
+                String errorInfo = "Error in file: " + yangNode.getName() +
+                        " in " + yangNode.getFileName() + " at " +
+                        "line: " + e.getLineNumber() + " at position: " +
+                        e.getCharPositionInLine() + NEW_LINE +
+                        e.getLocalizedMessage();
+                throw new LinkerException(errorInfo);
+                // TODO add file path in exception message in util manager.
+            }
+        }
     }
 
     /**
diff --git a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java
index 9e894dc..9d3ae68 100644
--- a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java
+++ b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangResolutionInfoImpl.java
@@ -855,15 +855,7 @@
     private void addToIdentityExtendList(YangIdentity baseIdentity, YangIdentity
             referredIdentity) {
         YangIdentity referredId = referredIdentity;
-        while (referredId != null) {
-            referredId.addToExtendList(baseIdentity);
-            YangBase base = referredId.getBaseNode();
-            if (base == null) {
-                return;
-            } else {
-                referredId = base.getReferredIdentity();
-            }
-        }
+        referredId.addToExtendList(baseIdentity);
     }
 
     /**
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IdentityTranslatorTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IdentityTranslatorTest.java
index 789b208..9c2ed6f 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IdentityTranslatorTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IdentityTranslatorTest.java
@@ -18,7 +18,10 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.junit.Test;
+import org.onosproject.yang.compiler.datamodel.YangContainer;
 import org.onosproject.yang.compiler.datamodel.YangIdentity;
+import org.onosproject.yang.compiler.datamodel.YangIdentityRef;
+import org.onosproject.yang.compiler.datamodel.YangLeaf;
 import org.onosproject.yang.compiler.datamodel.YangModule;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.linker.impl.YangLinkerManager;
@@ -31,8 +34,12 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Set;
 
+import static java.util.Arrays.asList;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.onosproject.yang.compiler.datamodel.YangNodeType.MODULE_NODE;
@@ -47,36 +54,37 @@
  */
 public class IdentityTranslatorTest {
 
-    private final YangLinkerManager yangLinkerManager = new YangLinkerManager();
-    private final YangCompilerManager utilManager =
-            new YangCompilerManager();
     private static final String DIR = "target/identity/";
-    private static final String COMP = System.getProperty("user.dir") + File
-            .separator + DIR;
+    private static final String COMP = System.getProperty("user.dir")
+            + File.separator + DIR;
+    private static final String RSC = "src/test/resources/";
+    private final YangLinkerManager linkMgr = new YangLinkerManager();
+    private final YangCompilerManager util = new YangCompilerManager();
 
     /**
      * Checks translation should not result in any exception.
      *
-     * @throws MojoExecutionException
+     * @throws MojoExecutionException if mojo exception occur
      */
     @Test
     public void processTranslator() throws IOException,
             ParserException, MojoExecutionException {
         deleteDirectory(DIR);
-        String searchDir = "src/test/resources/identityTranslator";
+        String searchDir = RSC + "identityTranslator";
         Set<Path> paths = new HashSet<>();
         for (String file : getYangFiles(searchDir)) {
             paths.add(Paths.get(file));
         }
 
-        utilManager.createYangFileInfoSet(paths);
-        utilManager.parseYangFileInfoSet();
-        utilManager.createYangNodeSet();
-        utilManager.resolveDependenciesUsingLinker();
+        util.createYangFileInfoSet(paths);
+        util.parseYangFileInfoSet();
+        util.createYangNodeSet();
+        util.resolveDependenciesUsingLinker();
 
-        YangPluginConfig yangPluginConfig = new YangPluginConfig();
-        yangPluginConfig.setCodeGenDir(DIR);
-        utilManager.translateToJava(yangPluginConfig);
+        YangPluginConfig config = new YangPluginConfig();
+
+        config.setCodeGenDir(DIR);
+        util.translateToJava(config);
         compileCode(COMP);
         deleteDirectory(DIR);
     }
@@ -84,48 +92,39 @@
     /**
      * Checks translation should not result in any exception.
      *
-     * @throws MojoExecutionException
+     * @throws MojoExecutionException if mojo exception occur
      */
     @Test
     public void processMultipleLevelIdentity() throws IOException,
             ParserException, MojoExecutionException {
         deleteDirectory(DIR);
-        String searchDir = "src/test/resources/multipleIdentity";
+        String searchDir = RSC + "multipleIdentity";
         Set<Path> paths = new HashSet<>();
         for (String file : getYangFiles(searchDir)) {
             paths.add(Paths.get(file));
         }
 
-        utilManager.createYangFileInfoSet(paths);
-        utilManager.parseYangFileInfoSet();
-        utilManager.createYangNodeSet();
+        util.createYangFileInfoSet(paths);
+        util.parseYangFileInfoSet();
+        util.createYangNodeSet();
 
         YangNode selfNode = null;
 
-        // Create YANG node set
-        yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
+        linkMgr.createYangNodeSet(util.getYangNodeSet());
+        linkMgr.addRefToYangFilesImportList(util.getYangNodeSet());
+        updateFilePriority(util.getYangNodeSet());
 
-        // Add references to import list.
-        yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
+        linkMgr.processInterFileLinking(util.getYangNodeSet());
+        linkMgr.processIdentityExtendList(util.getYangNodeSet());
 
-        updateFilePriority(utilManager.getYangNodeSet());
-
-        // Carry out inter-file linking.
-        yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
-
-        for (YangNode rootNode : utilManager.getYangNodeSet()) {
+        for (YangNode rootNode : util.getYangNodeSet()) {
             if (rootNode.getName().equals("test")) {
                 selfNode = rootNode;
             }
         }
 
-        // Check whether the data model tree returned is of type module.
         assertThat(selfNode instanceof YangModule, is(true));
-
-        // Check whether the node type is set properly to module.
         assertThat(selfNode.getNodeType(), is(MODULE_NODE));
-
-        // Check whether the module name is set correctly.
         YangModule yangNode = (YangModule) selfNode;
         assertThat(yangNode.getName(), is("test"));
 
@@ -137,8 +136,404 @@
 
         YangPluginConfig yangPluginConfig = new YangPluginConfig();
         yangPluginConfig.setCodeGenDir(DIR);
-        utilManager.translateToJava(yangPluginConfig);
+        util.translateToJava(yangPluginConfig);
         compileCode(COMP);
         deleteDirectory(DIR);
     }
+
+    /**
+     * Processes the extend list of an identity in self-file linking.
+     *
+     * @throws MojoExecutionException if mojo exception occur
+     */
+    @Test
+    public void processSelfFileIdExtendList1() throws IOException,
+            ParserException, MojoExecutionException {
+        deleteDirectory(DIR);
+        String searchDir = RSC + "identityextend/self/test1";
+        Set<Path> paths = new HashSet<>();
+        for (String file : getYangFiles(searchDir)) {
+            paths.add(Paths.get(file));
+        }
+
+        util.createYangFileInfoSet(paths);
+        util.parseYangFileInfoSet();
+        util.createYangNodeSet();
+
+        YangNode selfNode = null;
+        linkMgr.createYangNodeSet(util.getYangNodeSet());
+        linkMgr.addRefToYangFilesImportList(util.getYangNodeSet());
+        updateFilePriority(util.getYangNodeSet());
+
+        linkMgr.processInterFileLinking(util.getYangNodeSet());
+        linkMgr.processIdentityExtendList(util.getYangNodeSet());
+
+        for (YangNode rootNode : util.getYangNodeSet()) {
+            if (rootNode.getName().equals("self-id1")) {
+                selfNode = rootNode;
+            }
+        }
+
+        YangModule node = (YangModule) selfNode;
+        YangIdentity id3 = (YangIdentity) node.getChild();
+        YangIdentity id8 = (YangIdentity) id3.getNextSibling();
+        YangIdentity id2 = (YangIdentity) id8.getNextSibling();
+        YangIdentity id1 = (YangIdentity) id2.getNextSibling();
+        YangIdentity id4 = (YangIdentity) id1.getNextSibling();
+        YangIdentity id5 = (YangIdentity) id4.getNextSibling();
+        YangIdentity id6 = (YangIdentity) id5.getNextSibling();
+        YangIdentity id7 = (YangIdentity) id6.getNextSibling();
+
+        validateExtendListContent(id3, new LinkedList<>(
+                asList(id4, id5, id6, id7)));
+        validateExtendListContent(id8, new LinkedList<>());
+        validateExtendListContent(id2, new LinkedList<>(
+                asList(id3, id4, id5, id6, id7, id8)));
+        validateExtendListContent(id1, new LinkedList<>(
+                asList(id2, id3, id4, id5, id6, id7, id8)));
+        validateExtendListContent(id4, new LinkedList<>(asList(id5, id6, id7)));
+        validateExtendListContent(id5, new LinkedList<>());
+        validateExtendListContent(id6, new LinkedList<>(asList(id7)));
+        validateExtendListContent(id7, new LinkedList<>());
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        util.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        deleteDirectory(DIR);
+    }
+
+    /**
+     * Processes the extend list of an identity in self-file linking.
+     *
+     * @throws MojoExecutionException if mojo exception occur
+     */
+    @Test
+    public void processSelfFileIdExtendList2() throws IOException,
+            ParserException, MojoExecutionException {
+        deleteDirectory(DIR);
+        String searchDir = RSC + "identityextend/self/test2";
+        Set<Path> paths = new HashSet<>();
+        for (String file : getYangFiles(searchDir)) {
+            paths.add(Paths.get(file));
+        }
+
+        util.createYangFileInfoSet(paths);
+        util.parseYangFileInfoSet();
+        util.createYangNodeSet();
+
+        YangNode selfNode = null;
+        linkMgr.createYangNodeSet(util.getYangNodeSet());
+        linkMgr.addRefToYangFilesImportList(util.getYangNodeSet());
+        updateFilePriority(util.getYangNodeSet());
+
+        linkMgr.processInterFileLinking(util.getYangNodeSet());
+        linkMgr.processIdentityExtendList(util.getYangNodeSet());
+
+        for (YangNode rootNode : util.getYangNodeSet()) {
+            if (rootNode.getName().equals("self-id2")) {
+                selfNode = rootNode;
+            }
+        }
+
+        YangModule node = (YangModule) selfNode;
+        YangIdentity id1 = (YangIdentity) node.getChild();
+        YangIdentity id2 = (YangIdentity) id1.getNextSibling();
+        YangIdentity id5 = (YangIdentity) id2.getNextSibling();
+        YangIdentity id3 = (YangIdentity) id5.getNextSibling();
+        YangIdentity id6 = (YangIdentity) id3.getNextSibling();
+        YangIdentity id7 = (YangIdentity) id6.getNextSibling();
+        YangIdentity id8 = (YangIdentity) id7.getNextSibling();
+        YangIdentity id4 = (YangIdentity) id8.getNextSibling();
+        YangIdentity id9 = (YangIdentity) id4.getNextSibling();
+
+        validateExtendListContent(id1, new LinkedList<>(
+                asList(id2, id3, id4, id5, id6, id7, id8, id9)));
+        validateExtendListContent(id2, new LinkedList<>(
+                asList(id3, id4, id6, id9)));
+        validateExtendListContent(id5, new LinkedList<>(asList(id7, id8)));
+        validateExtendListContent(id3, new LinkedList<>(asList(id4, id9)));
+        validateExtendListContent(id6, new LinkedList<>());
+        validateExtendListContent(id7, new LinkedList<>());
+        validateExtendListContent(id8, new LinkedList<>());
+        validateExtendListContent(id4, new LinkedList<>());
+        validateExtendListContent(id9, new LinkedList<>());
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        util.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        deleteDirectory(DIR);
+    }
+
+    /**
+     * Processes the extend list of an identity in inter-file linking.
+     *
+     * @throws MojoExecutionException if mojo exception occur
+     */
+    @Test
+    public void processInterFileIdExtendList1() throws IOException,
+            ParserException, MojoExecutionException {
+        deleteDirectory(DIR);
+        String searchDir = RSC + "identityextend/inter/test1";
+        Set<Path> paths = new HashSet<>();
+        for (String file : getYangFiles(searchDir)) {
+            paths.add(Paths.get(file));
+        }
+
+        util.createYangFileInfoSet(paths);
+        util.parseYangFileInfoSet();
+        util.createYangNodeSet();
+
+        YangNode selfNode = null;
+        linkMgr.createYangNodeSet(util.getYangNodeSet());
+        linkMgr.addRefToYangFilesImportList(util.getYangNodeSet());
+        updateFilePriority(util.getYangNodeSet());
+
+        linkMgr.processInterFileLinking(util.getYangNodeSet());
+        linkMgr.processIdentityExtendList(util.getYangNodeSet());
+        YangNode refNode1 = null;
+        YangNode refNode2 = null;
+
+        for (YangNode rootNode : util.getYangNodeSet()) {
+            if (rootNode.getName().equals("file-test1-a")) {
+                selfNode = rootNode;
+            } else if (rootNode.getName().equals("file-test1-b")) {
+                refNode1 = rootNode;
+            } else {
+                refNode2 = rootNode;
+            }
+        }
+
+        YangModule node = (YangModule) selfNode;
+        YangIdentity id1 = (YangIdentity) node.getChild();
+        YangIdentity id2 = (YangIdentity) id1.getNextSibling();
+        YangIdentity id3 = (YangIdentity) id2.getNextSibling();
+
+        YangModule nodeb = (YangModule) refNode1;
+        YangIdentity id4 = (YangIdentity) nodeb.getChild();
+        YangIdentity id5 = (YangIdentity) id4.getNextSibling();
+        YangIdentity id6 = (YangIdentity) id5.getNextSibling();
+        YangIdentity id7 = (YangIdentity) id6.getNextSibling();
+
+        YangModule nodec = (YangModule) refNode2;
+        YangIdentity id8 = (YangIdentity) nodec.getChild();
+        YangIdentity id9 = (YangIdentity) id8.getNextSibling();
+        YangIdentity id10 = (YangIdentity) id9.getNextSibling();
+        YangIdentity id11 = (YangIdentity) id10.getNextSibling();
+
+        validateExtendListContent(id1, new LinkedList<>(asList(
+                id2, id3, id4, id5, id6, id7, id8, id9, id10, id11)));
+        validateExtendListContent(id2, new LinkedList<>(
+                asList(id4, id5, id10, id11)));
+        validateExtendListContent(id3, new LinkedList<>());
+        validateExtendListContent(id4, new LinkedList<>(asList(id10, id11)));
+        validateExtendListContent(id5, new LinkedList<>());
+        validateExtendListContent(id6, new LinkedList<>());
+        validateExtendListContent(id7, new LinkedList<>());
+        validateExtendListContent(id8, new LinkedList<>());
+        validateExtendListContent(id9, new LinkedList<>());
+        validateExtendListContent(id10, new LinkedList<>());
+        validateExtendListContent(id11, new LinkedList<>());
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        util.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        deleteDirectory(DIR);
+    }
+
+    /**
+     * Processes the extend list of an identity in inter-file linking.
+     *
+     * @throws MojoExecutionException if mojo exception occur
+     */
+    @Test
+    public void processInterFileIdExtendList2() throws IOException,
+            ParserException, MojoExecutionException {
+        deleteDirectory(DIR);
+        String searchDir = RSC + "identityextend/inter/test2";
+        Set<Path> paths = new HashSet<>();
+        for (String file : getYangFiles(searchDir)) {
+            paths.add(Paths.get(file));
+        }
+
+        util.createYangFileInfoSet(paths);
+        util.parseYangFileInfoSet();
+        util.createYangNodeSet();
+
+        YangNode selfNode = null;
+        linkMgr.createYangNodeSet(util.getYangNodeSet());
+        linkMgr.addRefToYangFilesImportList(util.getYangNodeSet());
+        updateFilePriority(util.getYangNodeSet());
+
+        linkMgr.processInterFileLinking(util.getYangNodeSet());
+        linkMgr.processIdentityExtendList(util.getYangNodeSet());
+        YangNode refNode1 = null;
+        YangNode refNode2 = null;
+
+        for (YangNode rootNode : util.getYangNodeSet()) {
+            if (rootNode.getName().equals("file-test2-a")) {
+                selfNode = rootNode;
+            } else if (rootNode.getName().equals("file-test2-b")) {
+                refNode1 = rootNode;
+            } else {
+                refNode2 = rootNode;
+            }
+        }
+
+        YangModule node = (YangModule) selfNode;
+        YangIdentity id2 = (YangIdentity) node.getChild();
+        YangIdentity id3 = (YangIdentity) id2.getNextSibling();
+        YangIdentity id4 = (YangIdentity) id3.getNextSibling();
+
+        YangModule nodeb = (YangModule) refNode1;
+        YangIdentity id1 = (YangIdentity) nodeb.getChild();
+        YangIdentity id5 = (YangIdentity) id1.getNextSibling();
+        YangIdentity id6 = (YangIdentity) id5.getNextSibling();
+
+        YangModule nodec = (YangModule) refNode2;
+        YangIdentity id7 = (YangIdentity) nodec.getChild();
+        YangIdentity id8 = (YangIdentity) id7.getNextSibling();
+        YangIdentity id9 = (YangIdentity) id8.getNextSibling();
+        YangIdentity id10 = (YangIdentity) id9.getNextSibling();
+        YangIdentity id11 = (YangIdentity) id10.getNextSibling();
+        YangIdentity id12 = (YangIdentity) id11.getNextSibling();
+        YangIdentity id13 = (YangIdentity) id12.getNextSibling();
+        YangIdentity id14 = (YangIdentity) id13.getNextSibling();
+        YangIdentity id15 = (YangIdentity) id14.getNextSibling();
+        YangIdentity id16 = (YangIdentity) id15.getNextSibling();
+        YangIdentity id17 = (YangIdentity) id16.getNextSibling();
+        YangIdentity id18 = (YangIdentity) id17.getNextSibling();
+
+        validateExtendListContent(id1, new LinkedList<>(asList(
+                id2, id3, id4, id5, id6, id7, id8, id9, id10, id11, id12,
+                id13, id14, id15, id16, id17, id18)));
+        validateExtendListContent(id2, new LinkedList<>(asList(id3, id4)));
+        validateExtendListContent(id3, new LinkedList<>());
+        validateExtendListContent(id4, new LinkedList<>());
+        validateExtendListContent(id5, new LinkedList<>());
+        validateExtendListContent(id6, new LinkedList<>(asList(
+                id7, id8, id9, id10, id11, id12, id13, id14, id15, id16, id17,
+                id18)));
+        validateExtendListContent(id7, new LinkedList<>(asList(
+                id11, id15, id16, id17, id18)));
+        validateExtendListContent(id8, new LinkedList<>(asList(id12)));
+        validateExtendListContent(id9, new LinkedList<>(asList(id13)));
+        validateExtendListContent(id10, new LinkedList<>(asList(id14)));
+        validateExtendListContent(id11, new LinkedList<>(asList(
+                id15, id16, id17, id18)));
+        validateExtendListContent(id12, new LinkedList<>());
+        validateExtendListContent(id13, new LinkedList<>());
+        validateExtendListContent(id14, new LinkedList<>());
+        validateExtendListContent(id15, new LinkedList<>());
+        validateExtendListContent(id16, new LinkedList<>());
+        validateExtendListContent(id17, new LinkedList<>());
+        validateExtendListContent(id18, new LinkedList<>());
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        util.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        deleteDirectory(DIR);
+    }
+
+    /**
+     * Processes the extend list of an identity in inter-file linking.
+     *
+     * @throws MojoExecutionException if mojo exception occur
+     */
+    @Test
+    public void processInterFileIdExtendListIssue() throws IOException,
+            ParserException, MojoExecutionException {
+        deleteDirectory(DIR);
+        String searchDir = RSC + "identityextend/inter/issue";
+        Set<Path> paths = new HashSet<>();
+        for (String file : getYangFiles(searchDir)) {
+            paths.add(Paths.get(file));
+        }
+
+        util.createYangFileInfoSet(paths);
+        util.parseYangFileInfoSet();
+        util.createYangNodeSet();
+
+        YangNode selfNode = null;
+        linkMgr.createYangNodeSet(util.getYangNodeSet());
+        linkMgr.addRefToYangFilesImportList(util.getYangNodeSet());
+        updateFilePriority(util.getYangNodeSet());
+
+        linkMgr.processInterFileLinking(util.getYangNodeSet());
+        linkMgr.processIdentityExtendList(util.getYangNodeSet());
+        YangNode refNode2 = null;
+
+        for (YangNode rootNode : util.getYangNodeSet()) {
+            if (rootNode.getName().equals("filea")) {
+                selfNode = rootNode;
+            } else if (rootNode.getName().equals("filec")) {
+                refNode2 = rootNode;
+            }
+        }
+
+        YangModule node = (YangModule) selfNode;
+        YangContainer container = (YangContainer) node.getChild();
+        Iterator<YangLeaf> it = container.getListOfLeaf().iterator();
+        YangLeaf leaf = it.next();
+        YangIdentityRef ref = (YangIdentityRef) leaf.getDataType()
+                .getDataTypeExtendedInfo();
+
+        YangIdentity intType = ref.getReferredIdentity();
+
+        YangModule nodec = (YangModule) refNode2;
+        YangIdentity jaT = (YangIdentity) nodec.getChild();
+        YangIdentity gtp = (YangIdentity) jaT.getNextSibling();
+        YangIdentity pdnLoop1 = (YangIdentity) gtp.getNextSibling();
+        YangIdentity pdnLoop2 = (YangIdentity) pdnLoop1.getNextSibling();
+        YangIdentity opChGr = (YangIdentity) pdnLoop2.getNextSibling();
+        YangIdentity home = (YangIdentity) opChGr.getNextSibling();
+
+        validateExtendListContent(intType, new LinkedList<>(asList(
+                jaT, gtp, pdnLoop1, pdnLoop2, opChGr, home)));
+        validateExtendListContent(jaT, new LinkedList<>(asList(
+                gtp, pdnLoop1, pdnLoop2, opChGr, home)));
+        validateExtendListContent(gtp, new LinkedList<>());
+        validateExtendListContent(pdnLoop1, new LinkedList<>());
+        validateExtendListContent(pdnLoop2, new LinkedList<>());
+        validateExtendListContent(opChGr, new LinkedList<>());
+        validateExtendListContent(home, new LinkedList<>());
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        util.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        deleteDirectory(DIR);
+    }
+
+    /**
+     * Validates the extend list content in an identity.
+     *
+     * @param id     YANG identity
+     * @param idList extend list to validate
+     */
+    private void validateExtendListContent(YangIdentity id,
+                                           List<YangIdentity> idList) {
+        List<YangIdentity> list = id.getExtendList();
+        assertThat(list.size(), is(idList.size()));
+        if (!idList.isEmpty()) {
+            for (YangIdentity ext : idList) {
+                assertThat(getErrMsg(ext, id), list.contains(ext), is(true));
+            }
+        }
+    }
+
+    /**
+     * Returns the error message for extend-list failure.
+     *
+     * @param ext extend list identity
+     * @param id  holder identity
+     * @return error message
+     */
+    private String getErrMsg(YangIdentity ext, YangIdentity id) {
+        return "Identity " + ext.getName() + " does not exist in the extend-" +
+                "list of " + id.getName();
+    }
 }
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/filea.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/filea.yang
new file mode 100644
index 0000000..e69c86c
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/filea.yang
@@ -0,0 +1,23 @@
+module filea {
+    yang-version 1;
+    namespace
+      "http://netconfcentral.org/ns/file/a";
+    prefix fa;
+
+    import fileb {
+        prefix f2;
+    }
+
+    revision "2009-11-20" {
+      description
+        "sample module in progress.";
+    }
+
+    container cc1 {
+        leaf type  {
+            type identityref {
+                base f2:int-type;
+            }
+        }
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/fileb.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/fileb.yang
new file mode 100644
index 0000000..cd45428
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/fileb.yang
@@ -0,0 +1,17 @@
+module fileb {
+    yang-version 1;
+    namespace
+      "http://netconfcentral.org/ns/file/b";
+    prefix fb;
+
+    revision "2009-11-20" {
+      description
+        "sample module in progress.";
+    }
+
+    identity int-type {
+    	description
+        "Base identity from which specific interface types are
+        derived.";
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/filec.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/filec.yang
new file mode 100644
index 0000000..1c51fa1
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/issue/filec.yang
@@ -0,0 +1,39 @@
+module filec {
+    yang-version 1;
+    namespace
+      "http://netconfcentral.org/ns/file/c";
+    prefix fc;
+
+    import fileb {
+        prefix f2;
+    }
+
+    revision "2009-11-20" {
+      description
+        "sample module in progress.";
+    }
+
+    identity ja-t {
+        base f2:int-type;
+    }
+
+    identity gtp {
+        base ja-t;
+    }
+
+    identity pdnEtherLoop1 {
+        base ja-t;
+    }
+
+    identity pdnEtherLoop2 {
+        base ja-t;
+    }
+
+    identity opticalChannelGroup {
+        base ja-t;
+    }
+
+    identity homepna {
+        base ja-t;
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-a.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-a.yang
new file mode 100644
index 0000000..d1ba8c2
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-a.yang
@@ -0,0 +1,21 @@
+module file-test1-a {
+    yang-version 1;
+    namespace
+      "http://test1.org/ns/file/a";
+    prefix t1fa;
+
+    revision "2009-11-21" {
+      description
+        "sample module in progress.";
+    }
+
+    identity id1;
+
+    identity id2 {
+       base "id1";
+    }
+
+    identity id3 {
+       base "id1";
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-b.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-b.yang
new file mode 100644
index 0000000..31e085e
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-b.yang
@@ -0,0 +1,31 @@
+module file-test1-b {
+    yang-version 1;
+    namespace
+      "http://test1.org/ns/file/b";
+    prefix t1fb;
+
+    import file-test1-a {
+        prefix t1fa;
+    }
+
+    revision "2009-11-21" {
+      description
+        "sample module in progress.";
+    }
+
+    identity id4 {
+       base t1fa:id2;
+    }
+
+    identity id5 {
+       base t1fa:id2;
+    }
+
+    identity id6 {
+       base t1fa:id1;
+    }
+
+    identity id7 {
+       base t1fa:id1;
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-c.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-c.yang
new file mode 100644
index 0000000..74e31a6
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/test1/file-test1-c.yang
@@ -0,0 +1,35 @@
+module file-test1-c {
+    yang-version 1;
+    namespace
+      "http://test1.org/ns/file/c";
+    prefix t1fc;
+
+    import file-test1-a {
+        prefix t1fa;
+    }
+
+    import file-test1-b {
+        prefix t1fb;
+    }
+
+    revision "2009-11-21" {
+      description
+        "sample module in progress.";
+    }
+
+    identity id8 {
+       base t1fa:id1;
+    }
+
+    identity id9 {
+       base t1fa:id1;
+    }
+
+    identity id10 {
+       base t1fb:id4;
+    }
+
+    identity id11 {
+       base t1fb:id4;
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-a.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-a.yang
new file mode 100644
index 0000000..5ffa0d3
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-a.yang
@@ -0,0 +1,27 @@
+module file-test2-a {
+    yang-version 1;
+    namespace
+      "http://test2.org/ns/file/a";
+    prefix t2fa;
+
+    import file-test2-b {
+        prefix t2fb;
+    }
+
+    revision "2009-11-21" {
+      description
+        "sample module in progress.";
+    }
+
+    identity id2 {
+       base "t2fb:id1";
+    }
+
+    identity id3 {
+       base "id2";
+    }
+
+    identity id4 {
+       base "id2";
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-b.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-b.yang
new file mode 100644
index 0000000..3f17e24
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-b.yang
@@ -0,0 +1,21 @@
+module file-test2-b {
+    yang-version 1;
+    namespace
+      "http://test2.org/ns/file/b";
+    prefix t2fb;
+
+    revision "2009-11-21" {
+      description
+        "sample module in progress.";
+    }
+
+    identity id1;
+
+    identity id5 {
+       base id1;
+    }
+
+    identity id6 {
+       base id1;
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-c.yang b/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-c.yang
new file mode 100644
index 0000000..616d5e3
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/inter/test2/file-test2-c.yang
@@ -0,0 +1,63 @@
+module file-test2-c {
+    yang-version 1;
+    namespace
+      "http://test2.org/ns/file/c";
+    prefix t2fc;
+
+    import file-test2-b {
+        prefix t2fb;
+    }
+
+    revision "2009-11-21" {
+      description
+        "sample module in progress.";
+    }
+
+    identity id7 {
+       base t2fb:id6;
+    }
+
+    identity id8 {
+       base t2fb:id6;
+    }
+
+    identity id9 {
+       base t2fb:id6;
+    }
+
+    identity id10 {
+       base t2fb:id6;
+    }
+
+    identity id11 {
+       base id7;
+    }
+
+    identity id12 {
+       base id8;
+    }
+
+    identity id13 {
+       base id9;
+    }
+
+    identity id14 {
+       base id10;
+    }
+
+    identity id15 {
+       base id11;
+    }
+
+    identity id16 {
+       base id11;
+    }
+
+    identity id17 {
+       base id11;
+    }
+
+    identity id18 {
+       base id11;
+    }
+}
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/self/test1/self-id1.yang b/compiler/plugin/maven/src/test/resources/identityextend/self/test1/self-id1.yang
new file mode 100644
index 0000000..82dd7b7
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/self/test1/self-id1.yang
@@ -0,0 +1,37 @@
+module self-id1 {
+
+    namespace "self-id1";
+
+    prefix self-id1;
+
+    identity id3 {
+       base "id2";
+    }
+
+    identity id8 {
+       base "id2";
+    }
+
+    identity id2 {
+        base "id1";
+    }
+
+    identity id1;
+
+    identity id4 {
+       base "id3";
+    }
+
+    identity id5 {
+       base "id4";
+    }
+
+    identity id6 {
+       base "id4";
+    }
+
+    identity id7 {
+       base "id6";
+    }
+
+}
\ No newline at end of file
diff --git a/compiler/plugin/maven/src/test/resources/identityextend/self/test2/self-id2.yang b/compiler/plugin/maven/src/test/resources/identityextend/self/test2/self-id2.yang
new file mode 100644
index 0000000..50a9d30
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/identityextend/self/test2/self-id2.yang
@@ -0,0 +1,41 @@
+module self-id2 {
+
+    namespace "self-id2";
+
+    prefix self-id2;
+
+    identity id1;
+
+    identity id2 {
+        base "id1";
+    }
+
+    identity id5 {
+       base "id1";
+    }
+
+    identity id3 {
+       base "id2";
+    }
+
+    identity id6 {
+       base "id2";
+    }
+
+    identity id7 {
+       base "id5";
+    }
+
+    identity id8 {
+       base "id5";
+    }
+
+    identity id4 {
+       base "id3";
+    }
+
+    identity id9 {
+       base "id3";
+    }
+
+}
\ No newline at end of file
