[ONOS-5630][ONOS-5615][ONOS-5634][ONOS-5635][ONOS-5568] defect fix for generated code.

Change-Id: I1d07e8c836005cdc9107186df18b468bc3b13cd1
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCompilerAnnotation.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCompilerAnnotation.java
index 3719a98..825d861 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCompilerAnnotation.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCompilerAnnotation.java
@@ -16,15 +16,18 @@
 
 package org.onosproject.yangutils.datamodel;
 
-import java.io.Serializable;
-import java.util.LinkedList;
-import java.util.List;
-
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.datamodel.utils.Parsable;
 import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
 
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
+
+import static java.util.Collections.unmodifiableList;
+import static org.onosproject.yangutils.datamodel.utils.YangConstructType.COMPILER_ANNOTATION_DATA;
+
 /**
  * Represents data model node to maintain information defined in YANG compiler-annotation.
  */
@@ -132,7 +135,7 @@
      * @param yangAppExtendedName the YANG app extended name to set
      */
     public void setYangAppExtendedName(YangAppExtended yangAppExtendedName) {
-        this.yangAppExtended = yangAppExtendedName;
+        yangAppExtended = yangAppExtendedName;
     }
 
     /**
@@ -141,7 +144,7 @@
      * @return the list of atomic path
      */
     public List<YangAtomicPath> getAtomicPathList() {
-        return atomicPathList;
+        return unmodifiableList(atomicPathList);
     }
 
     /**
@@ -155,7 +158,7 @@
 
     @Override
     public YangConstructType getYangConstructType() {
-        return YangConstructType.COMPILER_ANNOTATION_DATA;
+        return COMPILER_ANNOTATION_DATA;
     }
 
     @Override
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
index db3a5e1..e1fa33b 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
@@ -76,6 +76,11 @@
     private boolean isShortConflict;
 
     /**
+     * current holder or count in type list of attribute for from string method.
+     */
+    private String curHolderOrCount;
+
+    /**
      * Creates a java attribute info object.
      */
     private JavaAttributeInfo() {
@@ -318,4 +323,22 @@
 
         return newAttr;
     }
+
+    /**
+     * Returns current holder or count in type list of attribute for from string method.
+     *
+     * @return current holder or count in type list of attribute for from string method
+     */
+    public String getCurHolderOrCount() {
+        return curHolderOrCount;
+    }
+
+    /**
+     * Sets current holder or count in type list of attribute for from string method.
+     *
+     * @param curHolderOrCount current holder or count in type list of attribute for from string method
+     */
+    public void setCurHolderOrCount(String curHolderOrCount) {
+        this.curHolderOrCount = curHolderOrCount;
+    }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
index 2f1fbd2..2477d65 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
@@ -24,14 +24,12 @@
 import static java.util.Collections.unmodifiableSortedSet;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yangutils.utils.UtilConstants.ABSTRACT_EVENT;
+import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
 import static org.onosproject.yangutils.utils.UtilConstants.BITSET;
 import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EVENT_LISTENER;
-import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_CLASS;
-import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_PKG;
-import static org.onosproject.yangutils.utils.UtilConstants.HASH_MAP;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_LANG;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_MATH;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
@@ -195,17 +193,23 @@
     /**
      * Returns import for class.
      *
+     * @param isForInterface if needs to check for interface
      * @return imports for class
      */
-    public List<String> getImports() {
+    public List<String> getImports(boolean isForInterface) {
 
         String importString;
         List<String> imports = new ArrayList<>();
-
+        boolean check;
         for (JavaQualifiedTypeInfoTranslator importInfo : getImportSet()) {
+            check = importInfo.isForInterface();
+            if (!isForInterface) {
+                check = true;
+            }
             if (!importInfo.getPkgInfo().equals(EMPTY_STRING) &&
                     importInfo.getClassInfo() != null &&
-                    !importInfo.getPkgInfo().equals(JAVA_LANG)) {
+                    !importInfo.getPkgInfo().equals(JAVA_LANG) &&
+                    check) {
                 importString = getImportString(importInfo.getPkgInfo(), importInfo
                         .getClassInfo());
                 imports.add(importString);
@@ -213,6 +217,9 @@
         }
         if (isListToImport) {
             imports.add(getImportForList());
+            if (!isForInterface) {
+                imports.add(ARRAY_LIST_IMPORT);
+            }
         }
         if (isQueueToImport) {
             imports.add(getImportForQueue());
@@ -239,16 +246,6 @@
     }
 
     /**
-     * Returns import for to string method.
-     *
-     * @return import for to string method
-     */
-    String getImportForToString() {
-        return getImportString(GOOGLE_MORE_OBJECT_IMPORT_PKG,
-                               GOOGLE_MORE_OBJECT_IMPORT_CLASS);
-    }
-
-    /**
      * Returns import for to bitset method.
      *
      * @return import for to bitset method
@@ -271,7 +268,7 @@
      *
      * @return import for list attribute
      */
-    String getImportForList() {
+    private String getImportForList() {
         return getImportString(COLLECTION_IMPORTS, LIST);
     }
 
@@ -330,24 +327,6 @@
     }
 
     /**
-     * Returns import string for map class.
-     *
-     * @return import string for map class
-     */
-    String getMapImport() {
-        return getImportString(COLLECTION_IMPORTS, MAP);
-    }
-
-    /**
-     * Returns import string for hash map class.
-     *
-     * @return import string for hash map class
-     */
-    String getHashMapImport() {
-        return getImportString(COLLECTION_IMPORTS, HASH_MAP);
-    }
-
-    /**
      * Returns import for big integer.
      *
      * @return import for big integer
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
index de75bbf..d4d2dea 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
@@ -41,6 +41,7 @@
         implements Comparable<JavaQualifiedTypeInfoTranslator>, Serializable {
     private static final long serialVersionUID = 806201634L;
     private boolean isQualified;
+    private boolean isForInterface = true;
 
     /**
      * Creates a java qualified type info object.
@@ -288,4 +289,22 @@
     public void setQualified(boolean qualified) {
         isQualified = qualified;
     }
+
+    /**
+     * Returns true if import should be added to interface.
+     *
+     * @return true if import should be added to interface
+     */
+    boolean isForInterface() {
+        return isForInterface;
+    }
+
+    /**
+     * Sets true if import should be added to interface.
+     *
+     * @param forInterface true if import should be added to interface
+     */
+    void setForInterface(boolean forInterface) {
+        isForInterface = forInterface;
+    }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java
index 97feb1b..783a310 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java
@@ -178,7 +178,7 @@
     public void generateJavaFile(int fileType, YangNode curNode)
             throws IOException {
 
-        List<String> imports = this.getJavaImportData().getImports();
+        List<String> imports = this.getJavaImportData().getImports(true);
         createPackage(curNode);
         enumClassJavaFileHandle = getJavaFileHandle(getJavaClassName(EMPTY_STRING));
         generateEnumClassFile(enumClassJavaFileHandle, curNode, imports);
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index b1c45e6..548dbac 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -17,7 +17,6 @@
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAugment;
-import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangDataStructure;
@@ -76,7 +75,6 @@
 import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.updateJavaFileInfo;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.generateEnumAttributeString;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefinition;
-import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.sortImports;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateBuilderInterfaceFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateDefaultClassFile;
@@ -109,13 +107,13 @@
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.MISSING_PARENT_NODE;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
-import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENT_MAP_TYPE;
 import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLASS_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
+import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
 import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
@@ -123,14 +121,15 @@
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EXTEND;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
+import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_CLASS;
+import static org.onosproject.yangutils.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_PKG;
+import static org.onosproject.yangutils.utils.UtilConstants.HASH_MAP;
 import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
 import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION;
-import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION_IMPORT;
-import static org.onosproject.yangutils.utils.UtilConstants.ITR_IMPORT;
+import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.KEYS;
-import static org.onosproject.yangutils.utils.UtilConstants.METHOD;
-import static org.onosproject.yangutils.utils.UtilConstants.METHOD_IMPORT;
+import static org.onosproject.yangutils.utils.UtilConstants.MAP;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_ATTRIBUTE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_CLASS;
@@ -142,7 +141,6 @@
 import static org.onosproject.yangutils.utils.UtilConstants.REFLECT_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
-import static org.onosproject.yangutils.utils.UtilConstants.SET_IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
 import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
@@ -294,20 +292,11 @@
     private static final String KEY_CLASS_FILE_NAME_SUFFIX = KEYS;
 
     /**
-     * if type is binary.
-     */
-    private boolean isBinary;
-
-    /**
      * Current attributes YANG node
      */
     private YangNode attrNode;
 
     /**
-     * Sub tree filtering requires child class imports for type cast.
-     */
-    private final List<JavaQualifiedTypeInfoTranslator> subTreeImports = new ArrayList<>();
-    /**
      * Information about the java files being generated.
      */
     private JavaFileInfoTranslator javaFileInfo;
@@ -355,29 +344,6 @@
     private File implClassJavaFileHandle;
 
     /**
-     * Returns java file handle for key class.
-     *
-     * @return java file handle for key class
-     */
-    public File getKeyClassJavaFileHandle() {
-        return keyClassJavaFileHandle;
-    }
-
-    /**
-     * Sets java file handle for key class.
-     *
-     * @param keyClassJavaFileHandle java file handle for key class
-     */
-    public void setKeyClassJavaFileHandle(File keyClassJavaFileHandle) {
-        this.keyClassJavaFileHandle = keyClassJavaFileHandle;
-    }
-
-    /**
-     * Java file handle for impl class file.
-     */
-    private File keyClassJavaFileHandle;
-
-    /**
      * Temporary file handle for attribute.
      */
     private File attributesTempFileHandle;
@@ -654,17 +620,17 @@
         TempJavaBeanFragmentFiles tempFiles =
                 getBeanFiles((JavaCodeGeneratorInfo) parent);
         tempFiles.setAttrNode(curNode);
-        if (curNode instanceof YangChoice) {
+        JavaFileInfoTranslator fileInfo = ((JavaCodeGeneratorInfo) parent)
+                .getJavaFileInfo();
+        if (curNode instanceof YangChoice && curNode.isOpTypeReq()) {
             JavaQualifiedTypeInfoTranslator info = new
                     JavaQualifiedTypeInfoTranslator();
             info.setClassInfo(INVOCATION_TARGET_EXCEPTION);
             info.setPkgInfo(REFLECT_IMPORTS);
-            tempFiles.addToSubTreeImports(info);
-            info = new
-                    JavaQualifiedTypeInfoTranslator();
-            info.setClassInfo(METHOD);
-            info.setPkgInfo(REFLECT_IMPORTS);
-            tempFiles.addToSubTreeImports(info);
+            info.setForInterface(false);
+            tempFiles.getJavaImportData().addImportInfo(
+                    info, getCapitalCase(fileInfo.getJavaName()),
+                    fileInfo.getPackage());
         }
         JavaAttributeInfo attr = getCurNodeAsAttributeInTarget(
                 curNode, parent, isList, tempFiles);
@@ -723,10 +689,16 @@
             }
             qualified = parentImportData.addImportInfo(typeInfo, className,
                                                        fileInfo.getPackage());
-            if (!qualified && !(curNode instanceof YangChoice)) {
-                addChildDefaultClassImportForSubTreeFilter(typeInfo.getPkgInfo(),
-                                                           typeInfo.getClassInfo(),
-                                                           tempFiles);
+            if (!qualified && !(curNode instanceof YangChoice) &&
+                    curNode.isOpTypeReq()) {
+                String name = DEFAULT_CAPS + typeInfo.getClassInfo();
+                JavaQualifiedTypeInfoTranslator qInfo =
+                        new JavaQualifiedTypeInfoTranslator();
+                qInfo.setForInterface(false);
+                qInfo.setPkgInfo(typeInfo.getPkgInfo());
+                qInfo.setClassInfo(name);
+                parentImportData.addImportInfo(qInfo, className,
+                                               fileInfo.getPackage());
             }
         }
         boolean collectionSet = false;
@@ -771,16 +743,6 @@
                                           qualified, listNode);
     }
 
-    private static void addChildDefaultClassImportForSubTreeFilter(
-            String pkg, String className, TempJavaFragmentFiles tempFile) {
-        className = DEFAULT_CAPS + getCapitalCase(className);
-        JavaQualifiedTypeInfoTranslator info = new
-                JavaQualifiedTypeInfoTranslator();
-        info.setClassInfo(className);
-        info.setPkgInfo(pkg);
-        tempFile.subTreeImports.add(info);
-    }
-
     /**
      * Returns java attribute for leaf.
      *
@@ -896,9 +858,7 @@
                                                        .getJavaName());
         String containedInPkg = tempFiles.getJavaFileInfo().getPackage();
         JavaQualifiedTypeInfoTranslator info;
-        if (container.getDataType().getDataType() == YangDataTypes.BINARY) {
-            tempFiles.setBinary(true);
-        } else if (container.getDataType().getDataType() == YangDataTypes.BITS) {
+        if (container.getDataType().getDataType() == YangDataTypes.BITS) {
             //Add bitset import for type and leaf value flags.
             info = new JavaQualifiedTypeInfoTranslator();
             info.setClassInfo(BIT_SET);
@@ -1475,9 +1435,16 @@
         String attrType = attr.getImportInfo().getClassInfo();
         if (attr.getAttributeType() != null &&
                 attr.getAttributeType().getDataType() == IDENTITYREF) {
+            String type = attrType;
+            if (pkg != null) {
+                type = pkg + PERIOD + attrType;
+            }
             attrType = CLASS_STRING + DIAMOND_OPEN_BRACKET +
-                    QUESTION_MARK + SPACE + EXTEND + SPACE +
-                    attrType + DIAMOND_CLOSE_BRACKET;
+                    QUESTION_MARK + SPACE + EXTEND + SPACE + type +
+                    DIAMOND_CLOSE_BRACKET;
+            return getJavaAttributeDefinition(
+                    null, attrType, attrName, attr.isListAttr(), attrAccessType,
+                    attr.getCompilerAnnotation());
         }
 
         return getJavaAttributeDefinition(
@@ -1616,13 +1583,14 @@
         typeInfo.setPkgInfo(info.getPackage().toLowerCase() + PERIOD +
                                     getCapitalCase(info.getJavaName()));
         String curNodeName = getCapitalCase(curInfo.getJavaName());
+        boolean isQualified = false;
         if (!(curNode instanceof RpcNotificationContainer)) {
-            javaImportData.addImportInfo(typeInfo, curNodeName, curInfo
-                    .getPackage());
+            isQualified = javaImportData.addImportInfo(typeInfo, curNodeName,
+                                                       curInfo.getPackage());
         }
         JavaAttributeInfo attributeInfo =
                 getAttributeInfoForTheData(typeInfo, YANG + curNodeName +
-                        OPERATION_TYPE_ATTRIBUTE, null, false, false);
+                        OPERATION_TYPE_ATTRIBUTE, null, isQualified, false);
         addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
     }
 
@@ -1692,22 +1660,54 @@
     /**
      * Adds value leaf flag to temp files.
      *
-     * @param config YANG plugin config
+     * @param config  YANG plugin config
+     * @param curNode current yang node
      * @throws IOException IO exception
      */
-    protected void addYangAugmentedMap(YangPluginConfig config)
+    protected void addYangAugmentedMap(YangPluginConfig config, YangNode curNode)
             throws IOException {
+        JavaFileInfoTranslator info = ((JavaCodeGeneratorInfo) curNode)
+                .getJavaFileInfo();
         JavaQualifiedTypeInfoTranslator typeInfo =
                 new JavaQualifiedTypeInfoTranslator();
         typeInfo.setClassInfo(AUGMENT_MAP_TYPE);
         //Fix for add yangAugmentedInfo in equals/hashcode/and to string method.
         typeInfo.setPkgInfo(null);
+        typeInfo.setForInterface(false);
         JavaAttributeInfo attributeInfo =
                 getAttributeInfoForTheData(typeInfo, YANG_AUGMENTED_INFO_MAP,
                                            null, false, false);
+        //MAP
+        addImportInfoOfNode(MAP, COLLECTION_IMPORTS,
+                            getCapitalCase(info.getJavaName()),
+                            info.getPackage(), true);
+        //HASH map
+        addImportInfoOfNode(HASH_MAP, COLLECTION_IMPORTS,
+                            getCapitalCase(info.getJavaName()),
+                            info.getPackage(), false);
+
+        if (curNode.isOpTypeReq()) {
+            //exception
+            addImportInfoOfNode(INVOCATION_TARGET_EXCEPTION, REFLECT_IMPORTS,
+                                getCapitalCase(info.getJavaName()),
+                                info.getPackage(), false);
+        }
         addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
     }
 
+    private JavaQualifiedTypeInfoTranslator addImportInfoOfNode(
+            String cls, String pkg, String nodeName, String nodePkg,
+            boolean isForInterface) {
+        JavaQualifiedTypeInfoTranslator typeInfo =
+                new JavaQualifiedTypeInfoTranslator();
+        typeInfo.setClassInfo(cls);
+        typeInfo.setPkgInfo(pkg);
+        typeInfo.setForInterface(isForInterface);
+
+        getJavaImportData().addImportInfo(typeInfo, nodeName, nodePkg);
+        return typeInfo;
+    }
+
     /**
      * Adds the new attribute info to the target generated temporary files.
      *
@@ -1845,11 +1845,25 @@
      */
     public void generateJavaFile(int fileType, YangNode curNode)
             throws IOException {
-        List<String> imports =
-                getBeanFiles(curNode).getJavaImportData().getImports();
-        if (curNode instanceof YangAugmentableNode) {
-            addImportsForAugmentableClass(imports, true, true, curNode);
+
+        if (curNode.isOpTypeReq()) {
+            addImportInfoOfNode(BIT_SET, JAVA_UTIL_PKG, getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
         }
+        if (isAttributePresent) {
+            //Object utils
+            addImportInfoOfNode(JAVA_UTIL_OBJECTS_IMPORT_CLASS, JAVA_UTIL_PKG,
+                                getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
+            //more objects.
+            addImportInfoOfNode(GOOGLE_MORE_OBJECT_IMPORT_CLASS,
+                                GOOGLE_MORE_OBJECT_IMPORT_PKG,
+                                getGeneratedJavaClassName(),
+                                getJavaFileInfo().getPackage(), false);
+        }
+
+        List<String> imports =
+                getBeanFiles(curNode).getJavaImportData().getImports(true);
         createPackage(curNode);
 
         //Generate java code.
@@ -1882,35 +1896,16 @@
 
             insertDataIntoJavaFile(interfaceJavaFileHandle, CLOSE_CURLY_BRACKET);
             validateLineLength(interfaceJavaFileHandle);
-            if (curNode instanceof YangAugmentableNode) {
-                addImportsForAugmentableClass(imports, false, true, curNode);
-            }
         }
 
-        if (curNode.isOpTypeReq()) {
-            if (curNode instanceof YangAugmentableNode) {
-                addImportsForSubTreeFilterAug(imports);
-            }
-            addSubTreeImportStrings(imports);
-        } else {
+        //add imports for default class.
+        imports = getBeanFiles(curNode).getJavaImportData().getImports(false);
+        if (!curNode.isOpTypeReq()) {
             removeCaseParentImport(curNode, imports);
         }
 
         if ((fileType & BUILDER_CLASS_MASK) != 0 ||
                 (fileType & DEFAULT_CLASS_MASK) != 0) {
-            if (isAttributePresent) {
-                addImportsToStringAndHasCodeMethods(imports, true);
-                addArrayListImport(imports);
-            }
-
-            addBitsAndBase64Imports(curNode, imports);
-            if (curNode instanceof YangAugmentableNode) {
-                addImportsForAugmentableClass(imports, true, false, curNode);
-                if (curNode.isOpTypeReq()) {
-                    addInvocationExceptionImport(imports);
-                }
-            }
-            sortImports(imports);
 
             //Create impl class file.
             implClassJavaFileHandle =
@@ -1939,6 +1934,7 @@
         }
 
         if (curNode instanceof YangList) {
+            File keyClassJavaFileHandle;
             YangList list = (YangList) curNode;
             YangDataStructure data = getYangDataStructure(
                     list.getCompilerAnnotation());
@@ -1946,8 +1942,7 @@
                 keyClassJavaFileHandle =
                         getJavaFileHandle(getJavaClassName(
                                 KEY_CLASS_FILE_NAME_SUFFIX));
-                keyClassJavaFileHandle =
-                        generateKeyClassFile(keyClassJavaFileHandle, curNode);
+                generateKeyClassFile(keyClassJavaFileHandle, curNode);
 
             }
         }
@@ -1964,93 +1959,6 @@
         imports.remove(impt);
     }
 
-    private void addImportsForSubTreeFilterAug(List<String> imports) {
-        if (!imports.contains(SET_IMPORT)) {
-            imports.add(SET_IMPORT);
-        }
-        if (!imports.contains(METHOD_IMPORT)) {
-            imports.add(METHOD_IMPORT);
-        }
-        if (!imports.contains(ITR_IMPORT)) {
-            imports.add(ITR_IMPORT);
-        }
-    }
-
-    //Adds import for array list.
-    private void addArrayListImport(List<String> imports) {
-        if (imports.contains(javaImportData.getImportForList())) {
-            imports.add(ARRAY_LIST_IMPORT);
-        }
-    }
-
-    //Adds import for bitset and base64 list.
-    private void addBitsAndBase64Imports(YangNode curNode, List<String> imports) {
-        if (curNode.isOpTypeReq()) {
-            String impt = getJavaImportData().getImportForToBitSet();
-            if (!imports.contains(impt)) {
-                imports.add(getJavaImportData().getImportForToBitSet());
-            }
-        }
-    }
-
-    /**
-     * Adds imports for ToString and HashCodeMethod.
-     *
-     * @param imports   import list
-     * @param operation add or remove
-     */
-    protected void addImportsToStringAndHasCodeMethods(List<String> imports,
-                                                       boolean operation) {
-        if (operation) {
-            imports.add(javaImportData.getImportForHashAndEquals());
-            imports.add(javaImportData.getImportForToString());
-        } else {
-            imports.remove(javaImportData.getImportForHashAndEquals());
-            imports.remove(javaImportData.getImportForToString());
-        }
-        // TODO change boolean to OPERATION, in all related places.
-    }
-
-    /**
-     * Adds import for map and hash map.
-     *
-     * @param imports         import list
-     * @param operations      true for adding and false for deletion
-     * @param isInterfaceFile if need to add in interface file
-     * @param curNode         current node
-     */
-    private void addImportsForAugmentableClass(List<String> imports,
-                                               boolean operations,
-                                               boolean isInterfaceFile,
-                                               YangNode curNode) {
-        if (operations) {
-            if (!isInterfaceFile) {
-                imports.add(javaImportData.getHashMapImport());
-            }
-            // Add import for hash map only if node is not a YANG choice.
-            if (!(curNode instanceof YangChoice)) {
-                imports.add(javaImportData.getMapImport());
-            }
-        } else {
-            if (!isInterfaceFile) {
-                imports.remove(javaImportData.getHashMapImport());
-            }
-            imports.remove(javaImportData.getMapImport());
-        }
-        sortImports(imports);
-    }
-
-    /**
-     * Adds invocation exception import.
-     *
-     * @param imports list of imports
-     */
-    private void addInvocationExceptionImport(List<String> imports) {
-        if (!imports.contains(INVOCATION_TARGET_EXCEPTION_IMPORT)) {
-            imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
-        }
-    }
-
     /**
      * Removes all temporary file handles.
      *
@@ -2231,24 +2139,6 @@
     }
 
     /**
-     * Sets true if binary type is there for leaf/leaf-list.
-     *
-     * @param binary true if binary type is there for leaf/leaf-list
-     */
-    public void setBinary(boolean binary) {
-        isBinary = binary;
-    }
-
-    /**
-     * Returns true if binary type is there for leaf/leaf-list.
-     *
-     * @return true if binary type is there for leaf/leaf-list
-     */
-    public boolean isBinary() {
-        return isBinary;
-    }
-
-    /**
      * Sets attribute's node.
      *
      * @param attrNode attribute's node
@@ -2257,33 +2147,4 @@
         this.attrNode = attrNode;
     }
 
-    /**
-     * Adds info to sub tree import list.
-     *
-     * @param info import info
-     */
-    public void addToSubTreeImports(JavaQualifiedTypeInfoTranslator
-                                            info) {
-        boolean isAdded = false;
-        for (JavaQualifiedTypeInfoTranslator imports : subTreeImports) {
-            if (imports.getClassInfo().equals(info.getClassInfo())) {
-                isAdded = true;
-            }
-        }
-        if (!isAdded) {
-            subTreeImports.add(info);
-        }
-    }
-
-    private void addSubTreeImportStrings(List<String> imports) {
-        for (JavaQualifiedTypeInfoTranslator impt : subTreeImports) {
-            String imp = getImportString(impt.getPkgInfo(), impt
-                    .getClassInfo());
-            if (!imports.contains(imp)) {
-                imports.add(imp);
-            }
-        }
-        sortImports(imports);
-    }
-
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
index 0cb63e1..50dda06 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
@@ -116,7 +116,7 @@
         addResolvedAugmentedDataNodeImports(curNode);
         List<String> imports = ((JavaCodeGeneratorInfo) curNode)
                 .getTempJavaCodeFragmentFiles().getServiceTempFiles()
-                .getJavaImportData().getImports();
+                .getJavaImportData().getImports(true);
         createPackage(curNode);
         boolean notification = false;
         if (curNode instanceof YangJavaModuleTranslator) {
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
index b0145a8..cb44ca3 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
@@ -18,6 +18,7 @@
 
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.YangTypeHolder;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
@@ -54,7 +55,9 @@
 import static org.onosproject.yangutils.translator.tojava.utils.ValidatorTypeForUnionTypes.SHORT_TYPE_CONFLICT;
 import static org.onosproject.yangutils.utils.UtilConstants.BASE64;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
+import static org.onosproject.yangutils.utils.UtilConstants.HOLDER_TYPE_DEF;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
+import static org.onosproject.yangutils.utils.UtilConstants.LAST;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
@@ -159,6 +162,8 @@
 
     private List<YangType<?>> local = new ArrayList<>();
 
+    private List<JavaAttributeInfo> attrs = new ArrayList<>();
+
     /**
      * Creates an instance of temporary java code fragment.
      *
@@ -264,6 +269,11 @@
                 }
                 JavaAttributeInfo javaAttributeInfo = getAttributeForType(type,
                                                                           config);
+                if (yangTypeHolder instanceof YangTypeDef) {
+                    javaAttributeInfo.setCurHolderOrCount(HOLDER_TYPE_DEF);
+                } else if (types.indexOf(type) == types.size() - 1) {
+                    javaAttributeInfo.setCurHolderOrCount(LAST);
+                }
                 if (type.getDataType() == BITS) {
                     addBitsHandler(javaAttributeInfo, type, this);
                 }
@@ -281,6 +291,9 @@
             }
             addTypeConstructor();
             addMethodsInConflictCase(config);
+            for (JavaAttributeInfo attr : attrs) {
+                super.addJavaSnippetInfoToApplicableTempFiles(attr, config);
+            }
         }
     }
 
@@ -341,7 +354,12 @@
         } else {
             addMethodsWhenNoConflictingTypes(attr, config, types);
         }
-        super.addJavaSnippetInfoToApplicableTempFiles(attr, config);
+        String attrHolder = attr.getCurHolderOrCount();
+        if (attrHolder != null && !attrHolder.equals(HOLDER_TYPE_DEF)) {
+            attrs.add(attr);
+        } else {
+            super.addJavaSnippetInfoToApplicableTempFiles(attr, config);
+        }
 
     }
 
@@ -394,12 +412,17 @@
         if (attr != null) {
             if (attr.isIntConflict()) {
                 if (getIntIndex() < getUIntIndex()) {
+                    getIntAttribute().setCurHolderOrCount(
+                            getUIntAttribute().getCurHolderOrCount());
                     appendToFile(getOfStringImplTempFileHandle(), getOfMethodStringAndJavaDoc(getIntAttribute(),
                                                                                               getGeneratedJavaClassName())
                             + NEW_LINE);
                     addGetterImpl(getIntAttribute());
+
                     addFromStringMethod(getIntAttribute(), pluginConfig);
                 } else {
+                    getUIntAttribute().setCurHolderOrCount(
+                            getIntAttribute().getCurHolderOrCount());
                     appendToFile(getOfStringImplTempFileHandle(), getOfMethodStringAndJavaDoc(getUIntAttribute(),
                                                                                               getGeneratedJavaClassName())
                             + NEW_LINE);
@@ -415,12 +438,16 @@
         if (attr != null) {
             if (attr.isLongConflict()) {
                 if (getLongIndex() < getULongIndex()) {
+                    getLongAttribute().setCurHolderOrCount(
+                            getULongAttribute().getCurHolderOrCount());
                     appendToFile(getOfStringImplTempFileHandle(), getOfMethodStringAndJavaDoc(getLongAttribute(),
                                                                                               getGeneratedJavaClassName())
                             + NEW_LINE);
                     addGetterImpl(getLongAttribute());
                     addFromStringMethod(getLongAttribute(), pluginConfig);
                 } else {
+                    getULongAttribute().setCurHolderOrCount(
+                            getLongAttribute().getCurHolderOrCount());
                     appendToFile(getOfStringImplTempFileHandle(), getOfMethodStringAndJavaDoc(getULongAttribute(),
                                                                                               getGeneratedJavaClassName())
                             + NEW_LINE);
@@ -437,12 +464,16 @@
         if (attr != null) {
             if (attr.isShortConflict()) {
                 if (getShortIndex() < getUInt8Index()) {
+                    getShortAttribute().setCurHolderOrCount(
+                            getUInt8Attribute().getCurHolderOrCount());
                     appendToFile(getOfStringImplTempFileHandle(), getOfMethodStringAndJavaDoc(getShortAttribute(),
                                                                                               getGeneratedJavaClassName())
                             + NEW_LINE);
                     addGetterImpl(getShortAttribute());
                     addFromStringMethod(getShortAttribute(), pluginConfig);
                 } else {
+                    getUInt8Attribute().setCurHolderOrCount(
+                            getShortAttribute().getCurHolderOrCount());
                     appendToFile(getOfStringImplTempFileHandle(), getOfMethodStringAndJavaDoc(getUInt8Attribute(),
                                                                                               getGeneratedJavaClassName())
                             + NEW_LINE);
@@ -611,7 +642,7 @@
             throws IOException {
         List<String> imports = new ArrayList<>();
         if (isAttributePresent()) {
-            imports = getJavaImportData().getImports();
+            imports = getJavaImportData().getImports(true);
         }
 
         createPackage(curNode);
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
index 8514291..affda3e 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
@@ -433,7 +433,7 @@
         generateCodeOfNode(info, config);
         TempJavaBeanFragmentFiles tempFiles = getBeanFiles(info);
         if (!(info instanceof YangChoice)) {
-            tempFiles.addYangAugmentedMap(config);
+            tempFiles.addYangAugmentedMap(config, (YangNode) info);
         }
         if (info instanceof YangCase) {
             YangNode parent = ((YangCase) info).getParent();
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentityTranslator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentityTranslator.java
index 9051d17..793c90b 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentityTranslator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentityTranslator.java
@@ -154,7 +154,7 @@
                 isQualified = importData.addImportInfo(basePkgInfo, className,
                                                        javaFileInfo.getPackage());
                 if (!isQualified) {
-                    imports = importData.getImports();
+                    imports = importData.getImports(true);
                 }
             }
 
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
index 74e1931..ea376ff 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
@@ -163,7 +163,9 @@
             }
 
             if (!isRootNodesCodeGenRequired(this)) {
-                generateInterfaceFileForNonDataNodes(this);
+                if (getChild() != null) {
+                    generateInterfaceFileForNonDataNodes(this);
+                }
             } else {
                 getTempJavaCodeFragmentFiles()
                         .generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
index 6b9f346..b7928ce 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
@@ -21,12 +21,10 @@
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
-import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.YangUnion;
-import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
@@ -104,6 +102,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getConstructorStart;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEnumsConstructor;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEnumsOfValueMethod;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethod;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getEqualsMethodOpen;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getFromStringMethodClose;
@@ -111,6 +110,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetter;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterForClass;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterString;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethod;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodOpen;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getInterfaceLeafIdEnumSignature;
@@ -162,6 +162,8 @@
 import static org.onosproject.yangutils.utils.UtilConstants.IMPL_CLASS;
 import static org.onosproject.yangutils.utils.UtilConstants.INT;
 import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
+import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
+import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.KEYS;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
@@ -489,7 +491,6 @@
         info.setPkgInfo(fileInfo.getPackage());
         importData.addImportInfo(info, parent.getJavaClassNameOrBuiltInType(),
                                  parent.getJavaPackage());
-        List<String> keys = ((YangList) curNode).getKeyList();
         List<JavaAttributeInfo> attrs = getListOfAttributesForKey(curNode);
 
         Iterator<JavaAttributeInfo> attrIt = attrs.iterator();
@@ -506,6 +507,9 @@
             }
         }
 
+        imports.add(getImportString(JAVA_UTIL_PKG,
+                                    JAVA_UTIL_OBJECTS_IMPORT_CLASS));
+
         initiateJavaFileGeneration(file, GENERATE_KEY_CLASS, imports, curNode,
                                    className);
         String pkg = null;
@@ -535,6 +539,22 @@
                     attr, className, GENERATE_EVENT_SUBJECT_CLASS));
             insertDataIntoJavaFile(file, NEW_LINE);
         }
+        //add hashcode and equals method.
+        insertDataIntoJavaFile(file, getHashCodeMethodOpen());
+        StringBuilder builder = new StringBuilder();
+        for (JavaAttributeInfo att : attrs) {
+            builder.append(getHashCodeMethod(att));
+        }
+        insertDataIntoJavaFile(file, getHashCodeMethodClose(builder.toString()));
+
+        insertDataIntoJavaFile(file, getEqualsMethodOpen(className));
+        StringBuilder builder2 = new StringBuilder();
+        for (JavaAttributeInfo att : attrs) {
+            builder2.append(getEqualsMethod(att)).append(NEW_LINE);
+        }
+        insertDataIntoJavaFile(file, getEqualsMethodClose(builder2.toString()));
+
+
         insertDataIntoJavaFile(file, getCompareToForKeyClass(attrs, className));
 
         insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET);
@@ -736,11 +756,6 @@
         String className = getCapitalCase(fileInfo.getJavaName());
         String path = fileInfo.getBaseCodeGenPath() +
                 fileInfo.getPackageFilePath();
-        YangTypeDef typeDef = (YangTypeDef) curNode;
-        List<YangType<?>> types = typeDef.getTypeList();
-        YangType type = types.get(0);
-        YangDataTypes yangDataTypes = type.getDataType();
-
         initiateJavaFileGeneration(file, className, GENERATE_TYPEDEF_CLASS,
                                    imports, path);
 
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index 5886939..0b11fda 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -64,6 +64,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getBitSetAttr;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getCatchSubString;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getCompareToString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getExceptionThrowString;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getForLoopString;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getGreaterThanCondition;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIfConditionBegin;
@@ -98,7 +99,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.AND;
 import static org.onosproject.yangutils.utils.UtilConstants.APPEND;
-import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_INIT;
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED;
 import static org.onosproject.yangutils.utils.UtilConstants.BASE64;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
@@ -129,7 +130,6 @@
 import static org.onosproject.yangutils.utils.UtilConstants.ENUM;
 import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
 import static org.onosproject.yangutils.utils.UtilConstants.EQUALS_STRING;
-import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EXTEND;
 import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
 import static org.onosproject.yangutils.utils.UtilConstants.FOR;
@@ -203,7 +203,6 @@
 import static org.onosproject.yangutils.utils.UtilConstants.SUFFIX_S;
 import static org.onosproject.yangutils.utils.UtilConstants.SWITCH;
 import static org.onosproject.yangutils.utils.UtilConstants.THIS;
-import static org.onosproject.yangutils.utils.UtilConstants.THROW_NEW;
 import static org.onosproject.yangutils.utils.UtilConstants.TMP_VAL;
 import static org.onosproject.yangutils.utils.UtilConstants.TO_CAPS;
 import static org.onosproject.yangutils.utils.UtilConstants.TO_STRING_METHOD;
@@ -634,23 +633,20 @@
      * @return return type
      */
     private static String getReturnType(JavaAttributeInfo attr) {
-        String returnType;
         StringBuilder builder = new StringBuilder();
 
         if (attr.isQualifiedName() &&
                 attr.getImportInfo().getPkgInfo() != null) {
-            returnType = attr.getImportInfo().getPkgInfo() + PERIOD;
-            builder.append(returnType);
+            builder.append(attr.getImportInfo().getPkgInfo()).append(PERIOD);
         }
-        returnType = attr.getImportInfo().getClassInfo();
+        builder.append(attr.getImportInfo().getClassInfo());
 
         if (attr.getAttributeType() != null &&
                 attr.getAttributeType().getDataType() == IDENTITYREF) {
-            returnType = CLASS_STRING + DIAMOND_OPEN_BRACKET +
+            return CLASS_STRING + DIAMOND_OPEN_BRACKET +
                     QUESTION_MARK + SPACE + EXTEND + SPACE +
-                    returnType + DIAMOND_CLOSE_BRACKET;
+                    builder.toString() + DIAMOND_CLOSE_BRACKET;
         }
-        builder.append(returnType);
         return builder.toString();
     }
 
@@ -822,8 +818,7 @@
      * @return from string method's close string
      */
     static String getFromStringMethodClose() {
-        return getReturnString(NULL, EIGHT_SPACE_INDENTATION) +
-                signatureClose() + methodClose(FOUR_SPACE);
+        return methodClose(FOUR_SPACE);
     }
 
     /**
@@ -841,9 +836,7 @@
                 getNewLineAndSpace(TWELVE_SPACE_INDENTATION) +
                 getParsedSubString(attr, fromAttr) +
                 getReturnOfSubString() + EIGHT_SPACE_INDENTATION +
-                getCatchSubString() +
-                getNewLineAndSpace(EIGHT_SPACE_INDENTATION) +
-                CLOSE_CURLY_BRACKET;
+                getCatchSubString(attr.getCurHolderOrCount());
     }
 
     /**
@@ -1333,8 +1326,7 @@
         String method = TWELVE_SPACE_INDENTATION + DEFAULT + SPACE + COLON +
                 NEW_LINE;
         builder.append(method)
-                .append(getReturnString(NULL, SIXTEEN_SPACE_INDENTATION))
-                .append(signatureClose())
+                .append(getExceptionThrowString(SIXTEEN_SPACE_INDENTATION))
                 .append(methodClose(EIGHT_SPACE))
                 .append(methodClose(FOUR_SPACE));
 
@@ -1621,7 +1613,7 @@
                     break;
 
                 case LIST:
-                    type = ARRAY_LIST;
+                    type = ARRAY_LIST_INIT;
                     break;
 
                 case MAP:
@@ -1633,12 +1625,12 @@
                     break;
 
                 default:
-                    type = ARRAY_LIST;
+                    type = ARRAY_LIST_INIT;
                     break;
 
             }
         } else {
-            type = ARRAY_LIST;
+            type = ARRAY_LIST_INIT;
         }
         return getIfConditionBegin(EIGHT_SPACE_INDENTATION, name + SPACE + EQUAL +
                 EQUAL + SPACE + NULL) + TWELVE_SPACE_INDENTATION +
@@ -1802,8 +1794,8 @@
 
         condition = TMP_VAL + PERIOD + IS_EMPTY;
         sBuild.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, condition));
-        sBuild.append(TWELVE_SPACE_INDENTATION).append(THROW_NEW)
-                .append(EXCEPTION_STRING).append(methodClose(EIGHT_SPACE))
+        sBuild.append(getExceptionThrowString(TWELVE_SPACE_INDENTATION))
+                .append(methodClose(EIGHT_SPACE))
                 .append(getReturnString(TMP_VAL, EIGHT_SPACE_INDENTATION))
                 .append(signatureClose()).append(methodClose(FOUR_SPACE));
         return sBuild.toString();
@@ -2066,8 +2058,8 @@
                 .append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond))
                 .append(getReturnString(returnVal, TWELVE_SPACE_INDENTATION))
                 .append(signatureClose()).append(methodClose(EIGHT_SPACE))
-                .append(EIGHT_SPACE_INDENTATION).append(THROW_NEW)
-                .append(EXCEPTION_STRING).append(methodClose(FOUR_SPACE));
+                .append(getExceptionThrowString(EIGHT_SPACE_INDENTATION))
+                .append(methodClose(FOUR_SPACE));
         return builder.toString();
     }
 
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
index 9311e2d..e44d55b 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
@@ -77,6 +77,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
 import static org.onosproject.yangutils.utils.UtilConstants.EQUALS_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION;
+import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION_VAR;
 import static org.onosproject.yangutils.utils.UtilConstants.EXTEND;
 import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
@@ -136,6 +137,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.STRING_BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.STRING_BUILDER_VAR;
 import static org.onosproject.yangutils.utils.UtilConstants.THIS;
+import static org.onosproject.yangutils.utils.UtilConstants.THROW_NEW;
 import static org.onosproject.yangutils.utils.UtilConstants.TMP_VAL;
 import static org.onosproject.yangutils.utils.UtilConstants.TO_STRING_METHOD;
 import static org.onosproject.yangutils.utils.UtilConstants.TRY;
@@ -247,6 +249,16 @@
     }
 
     /**
+     * Returns illegal argument exception string.
+     *
+     * @param space indentation
+     * @return illegal argument exception string
+     */
+    static String getExceptionThrowString(String space) {
+        return space + THROW_NEW + EXCEPTION_STRING;
+    }
+
+    /**
      * Returns new line string with spaces.
      *
      * @param space spaces
@@ -823,12 +835,21 @@
     /**
      * Returns sub string with catch statement for union's from string method.
      *
+     * @param attrHolder attribute holder/count for from string
      * @return sub string with catch statement for union's from string method
      */
-    static String getCatchSubString() {
-        return CLOSE_CURLY_BRACKET + SPACE + CATCH + SPACE +
+    static String getCatchSubString(String attrHolder) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(CLOSE_CURLY_BRACKET).append(SPACE).append(CATCH)
+                .append(SPACE).append(
                 brackets(OPEN_CLOSE_BRACKET_WITH_VALUE_AND_RETURN_TYPE, EXCEPTION_VAR,
-                         EXCEPTION) + SPACE + OPEN_CURLY_BRACKET;
+                         EXCEPTION)).append(SPACE).append(OPEN_CURLY_BRACKET)
+                .append(NEW_LINE);
+        if (attrHolder != null) {
+            builder.append(getExceptionThrowString(TWELVE_SPACE_INDENTATION));
+        }
+        builder.append(EIGHT_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET);
+        return builder.toString();
     }
 
     /**
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
index 651d4ec..3e60817 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
@@ -1052,10 +1052,12 @@
 
     public static String getAugmentableSubTreeFiltering() {
         return "        if (yangAugmentedInfoMap.isEmpty()) {\n" +
-                "            Set<Map.Entry<Class<?>, Object>> augment =" +
+                "            java.util.Set<Map.Entry<Class<?>, Object>> " +
+                "augment =" +
                 " appInstance.yangAugmentedInfoMap().entrySet();\n" +
                 "            if (augment != null && !augment.isEmpty()) {\n" +
-                "                Iterator<Map.Entry<Class<?>, Object>> augItr =" +
+                "                java.util.Iterator<Map.Entry<Class<?>, " +
+                "Object>> augItr =" +
                 " augment.iterator();\n" +
                 "                while (augItr.hasNext()) {\n" +
                 "                    Map.Entry<Class<?>, Object> aug =" +
@@ -1071,7 +1073,8 @@
                 "                        Class<?> builderClass;\n" +
                 "                        builderClass = classLoader.loadClass(classPackage);\n" +
                 "                        Object builderObj = builderClass.newInstance();\n" +
-                "                        Method method = builderClass.getMethod(\"build\");\n" +
+                "                        java.lang.reflect.Method method = " +
+                "builderClass.getMethod(\"build\");\n" +
                 "                        Object defaultObj = method.invoke(builderObj);\n" +
                 "                        Class<?> defaultClass = defaultObj.getClass();\n" +
                 "                        method = defaultClass.getMethod(" +
@@ -1087,9 +1090,9 @@
                 "                }\n" +
                 "            }\n" +
                 "        } else {\n" +
-                "            Set<Map.Entry<Class<?>, Object>> augment = yangAugmentedInfoMap\n" +
+                "            java.util.Set<Map.Entry<Class<?>, Object>> augment = yangAugmentedInfoMap\n" +
                 "                    .entrySet();\n" +
-                "            Iterator<Map.Entry<Class<?>, Object>> augItr = augment.iterator();\n" +
+                "            java.util.Iterator<Map.Entry<Class<?>, Object>> augItr = augment.iterator();\n" +
                 "            while (augItr.hasNext()) {\n" +
                 "                Map.Entry<Class<?>, Object> aug = augItr.next();\n" +
                 "                Class<?> augClass = aug.getKey();\n" +
@@ -1204,7 +1207,8 @@
                 "                    Class<?> caseClass = classArray[0];\n" +
                 "                    try {\n" +
                 "                        Object obj1 = caseClass.newInstance();\n" +
-                "                        Method method = caseClass.getMethod(\"builder\", caseClass);\n" +
+                "                        java.lang.reflect.Method method =" +
+                " caseClass.getMethod(\"builder\", caseClass);\n" +
                 "                        Object obj = method.invoke(obj1," +
                 " (Object) null);\n" +
                 "                        method = caseClass.getMethod(\"build\", caseClass);\n" +
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index c289e77..ecc70b6 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -1224,7 +1224,8 @@
                           "short", "static", "strictfp", "super", "switch",
                           "synchronized", "this", "throw", "throws", "transient",
                           "true", "try", "void", "volatile", "while", "list",
-                          "map", "arrayList", "hashMap", "linkedList",
+                          "map", "arrayList", "hashMap", "linkedList", "notify",
+                          "notifyAll", "Method",
                           "collections");
 
     /**
@@ -1727,17 +1728,10 @@
      */
     public static final String INVOCATION_TARGET_EXCEPTION =
             "InvocationTargetException";
-
-    /**
-     * Static attribute for InvocationTargetException.
-     */
-    public static final String INVOCATION_TARGET_EXCEPTION_IMPORT = "import" +
-            " java.lang.reflect.InvocationTargetException;\n";
-
     /**
      * Static attribute for arrayList.
      */
-    public static final String ARRAY_LIST = "ArrayList<>()";
+    public static final String ARRAY_LIST_INIT = "ArrayList<>()";
 
     /**
      * Static attribute for arrayList import.
@@ -1746,23 +1740,6 @@
             IMPORT + COLLECTION_IMPORTS + ".ArrayList;\n";
 
     /**
-     * Static attribute for set collection import.
-     */
-    public static final String SET_IMPORT = IMPORT + COLLECTION_IMPORTS +
-            PERIOD + SET + SEMI_COLON + NEW_LINE;
-
-    /**
-     * Static attribute for reflect method import.
-     */
-    public static final String METHOD_IMPORT = IMPORT + REFLECT_IMPORTS +
-            PERIOD + METHOD + SEMI_COLON + NEW_LINE;
-
-    /**
-     * Static attribute for collection iterator import.
-     */
-    public static final String ITR_IMPORT = IMPORT + COLLECTION_IMPORTS +
-            PERIOD + "Iterator;\n";
-    /**
      * Static attribute for unused keyword.
      */
     public static final String UNUSED = "UNUSED";
@@ -1918,6 +1895,16 @@
     //File type extension for java classes.
     public static final String JAVA_FILE_EXTENSION = ".java";
 
+    /**
+     * Static param for typedef.
+     */
+    public static final String HOLDER_TYPE_DEF = "typedef";
+
+    /**
+     * Static param for last.
+     */
+    public static final String LAST = "last";
+
     // No instantiation.
     private UtilConstants() {
     }
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterFileIdentityLinkingTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterFileIdentityLinkingTest.java
index fe46f72..19610b1 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterFileIdentityLinkingTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterFileIdentityLinkingTest.java
@@ -159,6 +159,7 @@
         utilManager.translateToJava(yangPluginConfig);
         compileCode(System.getProperty("user.dir") + File
                 .separator + "target/identityTranslator/");
+        deleteDirectory("target/identityTranslator/");
     }
 
     /**
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/TypeDefTranslatorTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/TypeDefTranslatorTest.java
index 1c5c56c..a7320de 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/TypeDefTranslatorTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/TypeDefTranslatorTest.java
@@ -105,6 +105,6 @@
         yangPluginConfig.setCodeGenDir(DIR);
         utilManager.translateToJava(yangPluginConfig);
         compileCode(DIR1);
-        deleteDirectory(DIR);
+        //deleteDirectory(DIR);
     }
 }
diff --git a/plugin/maven/src/test/resources/identityTranslator/test.yang b/plugin/maven/src/test/resources/identityTranslator/test.yang
index e8c1889..f4f61bd 100644
--- a/plugin/maven/src/test/resources/identityTranslator/test.yang
+++ b/plugin/maven/src/test/resources/identityTranslator/test.yang
@@ -31,6 +31,17 @@
             base ipv4-address-family;
         }
     }
+
+    container ip {
+    container ipv4-address-family {
+    leaf tunnel1 {
+            type identityref {
+                base ipv4-address-family;
+            }
+        }
+    }
+    }
+
     typedef type3 {
     type union {
                 type type2;