diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java
index 39e0a04..57eea99 100644
--- a/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/listeners/AugmentListener.java
@@ -18,6 +18,7 @@
 
 import java.util.List;
 
+import org.onosproject.yangutils.datamodel.CollisionDetector;
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
@@ -32,6 +33,9 @@
 
 import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
 import static org.onosproject.yangutils.datamodel.utils.YangDataModelFactory.getYangAugmentNode;
+import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.clearOccurrenceCount;
+import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.createValidNameForAugment;
+import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.updateNameWhenHasMultipleOuccrrence;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
@@ -45,7 +49,6 @@
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateMutuallyExclusiveChilds;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
 import static org.onosproject.yangutils.utils.YangConstructType.AUGMENT_DATA;
 import static org.onosproject.yangutils.utils.YangConstructType.CASE_DATA;
 import static org.onosproject.yangutils.utils.YangConstructType.DATA_DEF_DATA;
@@ -81,8 +84,6 @@
  */
 public final class AugmentListener {
 
-    private static final String AUGMENTED = "Augmented";
-
     /**
      * Creates a new augment listener.
      */
@@ -116,11 +117,11 @@
 
         Parsable curData = listener.getParsedDataStack().peek();
         if (curData instanceof YangModule || curData instanceof YangSubModule || curData instanceof YangUses) {
-
             YangNode curNode = (YangNode) curData;
             YangAugment yangAugment = getYangAugmentNode(JAVA_GENERATION);
             yangAugment.setTargetNode(targetNodes);
-            yangAugment.setName(getValidNameForAugment(targetNodes));
+            yangAugment.setName(detectCollisionForTargetNode(curData, targetNodes, line, charPositionInLine, listener));
+
             try {
                 curNode.addChild(yangAugment);
             } catch (DataModelException e) {
@@ -161,7 +162,6 @@
      * @param ctx context object of the grammar rule
      */
     private static void validateSubStatementsCardinality(GeneratedYangParser.AugmentStatementContext ctx) {
-
         validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA, AUGMENT_DATA, ctx.augment().getText());
         validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA, AUGMENT_DATA, ctx.augment().getText());
         validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, AUGMENT_DATA, ctx.augment().getText());
@@ -171,21 +171,52 @@
     }
 
     /**
-     * Returns a name identifier for augment.
+     * Detects collision for java file generation of augment node when
+     * it is updating the same target node in same parent multiple times.
+     * Returns name for generated java file of augment node
      *
-     * @param targetNode list of target nodes
-     * @return name identifier
+     * @param curData parsable data
+     * @param targetNodes list of target nodes
+     * @param line line in YANG file
+     * @param charPositionInLine char position in YANG file
+     * @param listener tree walk listener
+     * @return name for generated java file for augment node
      */
-    private static String getValidNameForAugment(List<YangNodeIdentifier> targetNodes) {
-        String name = "";
-        YangNodeIdentifier nodeId = targetNodes.get(targetNodes.size() - 1);
+    private static String detectCollisionForTargetNode(Parsable curData, List<YangNodeIdentifier> targetNodes, int line,
+            int charPositionInLine, TreeWalkListener listener) {
 
-        if (nodeId.getPrefix() != null) {
-            name = AUGMENTED + getCaptialCase(nodeId.getPrefix()) + getCaptialCase(nodeId.getName());
-        } else {
-           //TODO: name = name + ((HasAugmentation)getParentNode()).getAugmentPrefix(nodeId);
+        String curPrefix = null;
+        if (curData instanceof YangModule) {
+            curPrefix = ((YangModule) curData).getPrefix();
+        } else if (curData instanceof YangSubModule) {
+            curPrefix = ((YangSubModule) curData).getPrefix();
         }
-        return name;
+        YangNodeIdentifier nodeId = targetNodes.get(targetNodes.size() - 1);
+        boolean isPrefix = isPrefixPresent(nodeId, curPrefix);
+        String xpath = createValidNameForAugment(nodeId, isPrefix);
+
+        if (listener.getParsedDataStack().peek() instanceof CollisionDetector) {
+            try {
+                ((CollisionDetector) listener.getParsedDataStack().peek()).detectCollidingChild(xpath,
+                        AUGMENT_DATA);
+            } catch (DataModelException e) {
+                return updateNameWhenHasMultipleOuccrrence(nodeId, isPrefix);
+            }
+        }
+
+        clearOccurrenceCount();
+        return xpath;
+    }
+
+    /**
+     * Returns true if a prefix is present and it is not equals to parents prefix.
+     *
+     * @param nodeId YANG node identifier
+     * @param parentsPrefix parent's prefix
+     * @return true if a prefix is present and it is not equals to parents prefix
+     */
+    private static boolean isPrefixPresent(YangNodeIdentifier nodeId, String parentsPrefix) {
+        return nodeId.getPrefix() != null && nodeId.getPrefix() != parentsPrefix;
     }
 
     /**
diff --git a/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/AugmentJavaFileNameGenUtil.java b/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/AugmentJavaFileNameGenUtil.java
new file mode 100644
index 0000000..113138f
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/AugmentJavaFileNameGenUtil.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.yangutils.parser.impl.parserutils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
+
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
+
+/**
+ * Represents a utility which provides valid name for generated java file for augment node.
+ */
+public final class AugmentJavaFileNameGenUtil {
+
+    /**
+     * Prefix to be added to generated java file for augment node.
+     */
+    private static final String AUGMENTED = "Augmented";
+
+    /**
+     * The number of time augment has updated the same target node in same module/submodule.
+     */
+    private static int occurrenceCount = 1;
+
+    /**
+     * List of names for generated augment java file.
+     */
+    private static List<String> augmentJavaFileNameList = new ArrayList<>();
+
+    private static final int ONE = 1;
+    private static final int TWO = 2;
+    private static final int ZERO = 0;
+
+    /**
+     * Creates an instance of augment java file name generator utility.
+     */
+    private AugmentJavaFileNameGenUtil() {
+    }
+
+    /**
+     * Sets the augment java file name list.
+     *
+     * @param nameList name list
+     */
+    private static void setAugmentJavaFileNameList(List<String> nameList) {
+        augmentJavaFileNameList = nameList;
+    }
+
+    /**
+     * Returns augment java file name list.
+     *
+     * @return augment java file name list
+     */
+    public static List<String> getAugmentJavaFileNameList() {
+        return augmentJavaFileNameList;
+    }
+
+    /**
+     * Sets occurrence count.
+     *
+     * @param occurrence occurrence count
+     */
+    private static void setOccurrenceCount(int occurrence) {
+        occurrenceCount = occurrence;
+    }
+
+    /**
+     * Returns occurrence count.
+     *
+     * @return occurrence count
+     */
+    private static int getOccurrenceCount() {
+        return occurrenceCount;
+    }
+
+    /**
+     * Creates a name identifier for augment.
+     *
+     * @param nodeId node identifier
+     * @param isPrefix if prefix is present or it is not equals to parent's prefix
+     * @return valid name for augment
+     */
+    public static String createValidNameForAugment(YangNodeIdentifier nodeId, boolean isPrefix) {
+        getAugmentJavaFileNameList().add(createName(nodeId, isPrefix));
+        setAugmentJavaFileNameList(getAugmentJavaFileNameList());
+        return getAugmentJavaFileNameList().get(getAugmentJavaFileNameList().size() - 1);
+    }
+
+    /**
+     * Creates name for the current augment file.
+     *
+     * @param nodeId node identifier
+     * @param isPrefix if prefix is present or it is not equals to parent's prefix
+     */
+    private static String createName(YangNodeIdentifier nodeId, boolean isPrefix) {
+        if (isPrefix) {
+            return AUGMENTED + getCaptialCase(nodeId.getPrefix()) + getCaptialCase(nodeId.getName());
+        } else {
+            return AUGMENTED + getCaptialCase(nodeId.getName());
+        }
+    }
+
+    /**
+     * Updates occurrence count of augment.
+     */
+    public static void updateOccurenceCount() {
+        int count = getOccurrenceCount();
+        count++;
+        setOccurrenceCount(count);
+    }
+
+    /**
+     * Updates the list of name when augment has occurred multiple times to update the same target node
+     * and returns a valid name for augment node's generated java file.
+     *
+     * @param nodeId YANG node identifier
+     * @param isPrefix true if a prefix is present and it is not equals to parents prefix
+     * @return valid name for augment node
+     */
+    public static String updateNameWhenHasMultipleOuccrrence(YangNodeIdentifier nodeId, boolean isPrefix) {
+        String name = "";
+        updateOccurenceCount();
+
+        if (getOccurrenceCount() == TWO) {
+            String previousAugmentsName = getAugmentJavaFileNameList().get(getAugmentJavaFileNameList().size() - ONE);
+            getAugmentJavaFileNameList().remove(ZERO);
+            getAugmentJavaFileNameList().add(previousAugmentsName + ONE);
+            //TODO: update when already contains the name.
+            name = createName(nodeId, isPrefix) + TWO;
+        } else {
+            name = createName(nodeId, isPrefix) + getOccurrenceCount();
+        }
+        getAugmentJavaFileNameList().add(name);
+        return name;
+    }
+
+    /**
+     * Resets occurrence count to one.
+     */
+    public static void clearOccurrenceCount() {
+        setOccurrenceCount(ONE);
+    }
+
+}
diff --git a/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index b88d5df..86203c6 100644
--- a/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -52,7 +52,9 @@
 
 /**
  * Represents ONOS YANG utility maven plugin.
- * Goal of plugin is yang2java Execution phase in generate-sources requiresDependencyResolution at compile time.
+ * Goal of plugin is yang2java.
+ * Execution phase is generate-sources.
+ * requiresDependencyResolution at compile time.
  */
 @Mojo(name = "yang2java", defaultPhase = GENERATE_SOURCES, requiresDependencyResolution = COMPILE,
         requiresProject = true)
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/AugmentJavaFileNameGenUtilTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/AugmentJavaFileNameGenUtilTest.java
new file mode 100644
index 0000000..ac3658c
--- /dev/null
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/AugmentJavaFileNameGenUtilTest.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.yangutils.parser.impl.parseutils;
+
+import org.junit.Test;
+import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.clearOccurrenceCount;
+import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.createValidNameForAugment;
+import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.getAugmentJavaFileNameList;
+import static org.onosproject.yangutils.parser.impl.parserutils.AugmentJavaFileNameGenUtil.updateNameWhenHasMultipleOuccrrence;
+
+/**
+ * Unit test case for augment java file name generator utility.
+ */
+public class AugmentJavaFileNameGenUtilTest {
+
+    private static final String TEST1 = "test1Node";
+    private static final String PARENT_PREFIX = "if";
+    private static final String NODE_PREFIX = "rf";
+
+    private static final String TEST1_AUGMENTED_NAME_WITHOUT_PREFIX = "AugmentedTest1Node";
+    private static final String TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI1 = "AugmentedTest1Node1";
+    private static final String TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI2 = "AugmentedTest1Node2";
+    private static final String TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI3 = "AugmentedTest1Node3";
+
+    private static final String TEST1_AUGMENTED_NAME_WITH_PREFIX = "AugmentedRfTest1Node";
+    private static final String TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI1 = "AugmentedRfTest1Node1";
+    private static final String TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI2 = "AugmentedRfTest1Node2";
+    private static final String TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI3 = "AugmentedRfTest1Node3";
+
+    private static String testString = "";
+
+    /**
+     * Unit test case when parent's prefix is present and one occurrence of augment node to update same target node.
+     */
+    @Test
+    public void testForAugmentNameWhenOneOuccrrenceWithParentPrefix() {
+        clearData();
+        testString = createValidNameForAugment(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX)));
+    }
+
+    /**
+     * Unit test case when no prefix and one occurrence of augment node to update same target node.
+     */
+    @Test
+    public void testForAugmentNameWhenOneOuccrrenceWithNoPrefix() {
+        clearData();
+        testString = createValidNameForAugment(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX)));
+    }
+
+    /**
+     * Unit test case when different prefix then parent is present and
+     * one occurrence of augment node to update same target node.
+     */
+    @Test
+    public void testForAugmentNameWhenOneOuccrrenceWithDiffPrefix() {
+        clearData();
+        testString = createValidNameForAugment(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITH_PREFIX)));
+    }
+
+    /**
+     * Unit test case when parent's prefix is present and two occurrence of augment node to update
+     * same target node is present.
+     */
+    @Test
+    public void testForAugmentNameWhenTwoOuccrrenceWithParentPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+        testString = updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI2)));
+    }
+
+    /**
+     * Unit test case when no prefix and two occurrence of augment node to update
+     * same target node is present.
+     */
+    @Test
+    public void testForAugmentNameWhenTwoOuccrrenceWithNoPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+        testString = updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI2)));
+    }
+
+    /**
+     * Unit test case when different prefix then parent is present and
+     * two occurrence of augment node to update same target node is present.
+     */
+    @Test
+    public void testForAugmentNameWhenTwoOuccrrenceWithDiffPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+        testString = updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI2)));
+    }
+
+    /**
+     * Unit test case when parent prefix and three occurrence of augment node to update
+     * same target node is present.
+     */
+    @Test
+    public void testForAugmentNameWhenThreeOuccrrenceWithParentPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+
+        testString = updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI3)));
+    }
+
+    /**
+     * Unit test case when no prefix and three occurrence of augment node to update
+     * same target node is present.
+     */
+    @Test
+    public void testForAugmentNameWhenThreeOuccrrenceNoPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+
+        testString = updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI3)));
+    }
+
+    /**
+     * Unit test case when different prefix and three occurrence of augment node to update
+     * same target node is present.
+     */
+    @Test
+    public void testForAugmentNameWhenThreeOuccrrenceWithDiffPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+
+        testString = updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI3)));
+    }
+
+    /**
+     * Unit test case for when three occurrence is there and parent prefix is present,
+     * all the names need to be updated in list.
+     */
+    @Test
+    public void testForPreviousNamesGotUpdatedWhenParentPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithParentPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithParentPrefix()));
+
+        testString = getAugmentJavaFileNameList().get(0);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI1)));
+
+        testString = getAugmentJavaFileNameList().get(1);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI2)));
+
+        testString = getAugmentJavaFileNameList().get(2);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI3)));
+    }
+
+    /**
+     * Unit test case for when three occurrence is there and no prefix is present,
+     * all the names need to be updated in list.
+     */
+    @Test
+    public void testForPreviousNamesGotUpdatedWhenNoPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithNoPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithNoPrefix()));
+
+        testString = getAugmentJavaFileNameList().get(0);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI1)));
+
+        testString = getAugmentJavaFileNameList().get(1);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI2)));
+
+        testString = getAugmentJavaFileNameList().get(2);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITHOUT_PREFIX_MULTI3)));
+    }
+
+    /**
+     * Unit test case for when three occurrence is there and different prefix is present,
+     * all the names need to be updated in list.
+     */
+    @Test
+    public void testForPreviousNamesGotUpdatedWhenDifferentPrefix() {
+        clearData();
+
+        createValidNameForAugment(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+        updateNameWhenHasMultipleOuccrrence(getStubNodeIdetifierWithDiffPrefix(),
+                isPrefixPresent(getStubNodeIdetifierWithDiffPrefix()));
+
+        testString = getAugmentJavaFileNameList().get(0);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI1)));
+
+        testString = getAugmentJavaFileNameList().get(1);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI2)));
+
+        testString = getAugmentJavaFileNameList().get(2);
+        assertThat(true, is(testString.equals(TEST1_AUGMENTED_NAME_WITH_PREFIX_MULTI3)));
+    }
+
+    /**
+     * Returns stub node identifier when parent prefix is used.
+     *
+     * @param name name of node
+     * @param prefix prefix of node
+     * @return node identifier for node
+     */
+    private YangNodeIdentifier getStubNodeIdetifierWithParentPrefix() {
+        YangNodeIdentifier nodeId = new YangNodeIdentifier();
+        nodeId.setName(TEST1);
+        nodeId.setPrefix(PARENT_PREFIX);
+        return nodeId;
+    }
+
+    /**
+     * Returns stub node identifier when no prefix is used.
+     *
+     * @param name name of node
+     * @param prefix prefix of node
+     * @return node identifier for node
+     */
+    private YangNodeIdentifier getStubNodeIdetifierWithNoPrefix() {
+        YangNodeIdentifier nodeId = new YangNodeIdentifier();
+        nodeId.setName(TEST1);
+        nodeId.setPrefix(null);
+        return nodeId;
+    }
+
+    /**
+     * Returns stub node identifier when different prefix is used.
+     *
+     * @param name name of node
+     * @param prefix prefix of node
+     * @return node identifier for node
+     */
+    private YangNodeIdentifier getStubNodeIdetifierWithDiffPrefix() {
+        YangNodeIdentifier nodeId = new YangNodeIdentifier();
+        nodeId.setName(TEST1);
+        nodeId.setPrefix(NODE_PREFIX);
+        return nodeId;
+    }
+
+    /**
+     * Returns true if a prefix is present and it is not equals to parents prefix.
+     *
+     * @param nodeId YANG node identifier
+     * @param parentsPrefix parent's prefix
+     * @return true if a prefix is present and it is not equals to parents prefix
+     */
+    private static boolean isPrefixPresent(YangNodeIdentifier nodeId) {
+        return nodeId.getPrefix() != null && nodeId.getPrefix() != PARENT_PREFIX;
+    }
+
+    /**
+     * Clears list of names and occurrence count after each test case.
+     */
+    private void clearData() {
+        getAugmentJavaFileNameList().clear();
+        clearOccurrenceCount();
+    }
+
+}
diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerErrorMessageConstructionTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ListenerErrorMessageConstructionTest.java
similarity index 98%
rename from src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerErrorMessageConstructionTest.java
rename to src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ListenerErrorMessageConstructionTest.java
index d10e009..79c46f4 100644
--- a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerErrorMessageConstructionTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ListenerErrorMessageConstructionTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.yangutils.parser.parseutils;
+package org.onosproject.yangutils.parser.impl.parseutils;
 
 import org.junit.Test;
 
diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ListenerValidationTest.java
similarity index 98%
rename from src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java
rename to src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ListenerValidationTest.java
index f4e284e..9cab4dc 100644
--- a/src/test/java/org/onosproject/yangutils/parser/parseutils/ListenerValidationTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ListenerValidationTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.yangutils.parser.parseutils;
+package org.onosproject.yangutils.parser.impl.parseutils;
 
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ParseTreeErrorListenerTest.java
similarity index 98%
rename from src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java
rename to src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ParseTreeErrorListenerTest.java
index dd09247..4489e77 100644
--- a/src/test/java/org/onosproject/yangutils/parser/parseutils/ParseTreeErrorListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/parseutils/ParseTreeErrorListenerTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.yangutils.parser.parseutils;
+package org.onosproject.yangutils.parser.impl.parseutils;
 
 import org.antlr.v4.runtime.ANTLRFileStream;
 import org.antlr.v4.runtime.ANTLRInputStream;
