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
