diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
index ff275ae..0ae81f7 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
@@ -16,26 +16,28 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
+import static org.onosproject.yangutils.translator.GeneratedFileType.BUILDER_CLASS_MASK;
+import static org.onosproject.yangutils.translator.GeneratedFileType.BUILDER_INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.GeneratedFileType.GENERATE_TYPEDEF_CLASS;
+import static org.onosproject.yangutils.translator.GeneratedFileType.IMPL_CLASS_MASK;
+import static org.onosproject.yangutils.translator.GeneratedFileType.INTERFACE_MASK;
+import static org.slf4j.LoggerFactory.getLogger;
+
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.io.FileUtils;
+import org.onosproject.yangutils.translator.CachedFileHandle;
 import org.onosproject.yangutils.translator.tojava.AttributeInfo;
 import org.onosproject.yangutils.utils.UtilConstants;
 import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
 import org.onosproject.yangutils.utils.io.impl.FileSystemUtil;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
-import org.onosproject.yangutils.utils.io.impl.TempDataStore;
-import org.onosproject.yangutils.utils.io.impl.TempDataStore.TempDataStoreType;
 import org.slf4j.Logger;
 
-import static org.onosproject.yangutils.translator.GeneratedFileType.BUILDER_CLASS_MASK;
-import static org.onosproject.yangutils.translator.GeneratedFileType.BUILDER_INTERFACE_MASK;
-import static org.onosproject.yangutils.translator.GeneratedFileType.IMPL_CLASS_MASK;
-import static org.onosproject.yangutils.translator.GeneratedFileType.INTERFACE_MASK;
-import static org.slf4j.LoggerFactory.getLogger;
-
 /**
  * Generates java file.
  */
@@ -55,10 +57,11 @@
      * @param fileName file name
      * @param filePath file package path
      * @param extension file extension
+     * @param handle cached file handle
      * @return file object
      */
-    public static File getFileObject(String filePath, String fileName, String extension) {
-        return new File(UtilConstants.YANG_GEN_DIR + filePath + File.separator + fileName + extension);
+    public static File getFileObject(String filePath, String fileName, String extension, CachedFileHandle handle) {
+        return new File(handle.getCodeGenFilePath() + filePath + File.separator + fileName + extension);
     }
 
     /**
@@ -69,17 +72,18 @@
      * @param imports imports for the file
      * @param attrList attribute info
      * @param pkg generated file package
+     * @param handle cached file handle
      * @return interface file
      * @throws IOException when fails to write in file
      */
     public static File generateInterfaceFile(File file, String className, List<String> imports,
-            List<AttributeInfo> attrList, String pkg) throws IOException {
-
+            List<AttributeInfo> attrList, String pkg, CachedFileHandle handle) throws IOException {
+        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
         initiateFile(file, className, INTERFACE_MASK, imports, pkg);
 
-        List<String> methods;
+        List<String> methods = new ArrayList<>();
         try {
-            methods = TempDataStore.getTempData(TempDataStoreType.GETTER_METHODS, className);
+            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS, className, path));
         } catch (ClassNotFoundException | IOException e) {
             log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
             throw new IOException("Fail to read data from temp file.");
@@ -101,17 +105,19 @@
      * @param className class name
      * @param pkg generated file package
      * @param attrList attribute info
+     * @param handle cached file handle
      * @return builder interface file
      * @throws IOException when fails to write in file
      */
     public static File generateBuilderInterfaceFile(File file, String className, String pkg,
-            List<AttributeInfo> attrList) throws IOException {
-
+            List<AttributeInfo> attrList, CachedFileHandle handle) throws IOException {
+        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
         initiateFile(file, className, BUILDER_INTERFACE_MASK, null, pkg);
-        List<String> methods;
+        List<String> methods = new ArrayList<>();
+
         try {
-            methods = TempDataStore.getTempData(TempDataStoreType.BUILDER_INTERFACE_METHODS,
-                    className + UtilConstants.BUILDER + UtilConstants.INTERFACE);
+            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS, className, path));
+            methods.add(handle.getTempData(TempDataStoreTypes.SETTER_METHODS, className, path));
         } catch (ClassNotFoundException | IOException e) {
             log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
             throw new IOException("Fail to read data from temp file.");
@@ -126,7 +132,7 @@
          * Add getters and setters in builder interface.
          */
         for (String method : methods) {
-            appendMethod(file, UtilConstants.FOUR_SPACE_INDENTATION + method + UtilConstants.NEW_LINE);
+            appendMethod(file, UtilConstants.FOUR_SPACE_INDENTATION + method);
         }
 
         insert(file, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
@@ -141,20 +147,21 @@
      * @param imports imports for the file
      * @param pkg generated file package
      * @param attrList attribute info
+     * @param handle cached file handle
      * @return builder class file
      * @throws IOException when fails to write in file
      */
     public static File generateBuilderClassFile(File file, String className, List<String> imports, String pkg,
-            List<AttributeInfo> attrList) throws IOException {
-
+            List<AttributeInfo> attrList, CachedFileHandle handle) throws IOException {
+        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
         initiateFile(file, className, BUILDER_CLASS_MASK, imports, pkg);
 
         /**
          * Add attribute strings.
          */
-        List<String> attributes;
+        List<String> attributes = new ArrayList<>();
         try {
-            attributes = TempDataStore.getTempData(TempDataStoreType.ATTRIBUTE, className);
+            attributes.add(handle.getTempData(TempDataStoreTypes.ATTRIBUTE, className, path));
         } catch (ClassNotFoundException | IOException e) {
             log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
             throw new IOException("Fail to read data from temp file.");
@@ -165,11 +172,11 @@
         for (String attribute : attributes) {
             insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
         }
-        insert(file, UtilConstants.NEW_LINE);
 
-        List<String> methods;
+        List<String> methods = new ArrayList<>();
         try {
-            methods = TempDataStore.getTempData(TempDataStoreType.BUILDER_METHODS, className + UtilConstants.BUILDER);
+            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS_IMPL, className, path));
+            methods.add(handle.getTempData(TempDataStoreTypes.SETTER_METHODS_IMPL, className, path));
         } catch (ClassNotFoundException | IOException e) {
             log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
             throw new IOException("Fail to read data from temp file.");
@@ -179,7 +186,8 @@
          * Add default constructor and build method impl.
          */
         methods.add(UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
-                + MethodsGenerator.getDefaultConstructorString(BUILDER_CLASS_MASK, className));
+                + MethodsGenerator.getDefaultConstructorString(className + UtilConstants.BUILDER,
+                        UtilConstants.PUBLIC));
         methods.add(MethodsGenerator.getBuildString(className));
 
         /**
@@ -198,17 +206,19 @@
      * @param className class name
      * @param pkg generated file package
      * @param attrList attribute's info
+     * @param handle cached file handle
      * @return impl class file
      * @throws IOException when fails to write in file
      */
-    public static File generateImplClassFile(File file, String className, String pkg, List<AttributeInfo> attrList)
-            throws IOException {
+    public static File generateImplClassFile(File file, String className, String pkg, List<AttributeInfo> attrList,
+            CachedFileHandle handle)
+                    throws IOException {
+        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
+        initiateFile(file, className, IMPL_CLASS_MASK, null, path);
 
-        initiateFile(file, className, IMPL_CLASS_MASK, null, pkg);
-
-        List<String> attributes;
+        List<String> attributes = new ArrayList<>();
         try {
-            attributes = TempDataStore.getTempData(TempDataStoreType.ATTRIBUTE, className);
+            attributes.add(handle.getTempData(TempDataStoreTypes.ATTRIBUTE, className, path));
         } catch (ClassNotFoundException | IOException e) {
             log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
             throw new IOException("Fail to read data from temp file.");
@@ -220,24 +230,34 @@
         for (String attribute : attributes) {
             insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
         }
-        insert(file, UtilConstants.NEW_LINE);
 
-        List<String> methods;
+        List<String> methods = new ArrayList<>();
         try {
-            methods = TempDataStore.getTempData(TempDataStoreType.IMPL_METHODS, className + UtilConstants.IMPL);
+
+            methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS_IMPL, className, path));
+
+            methods.add(getConstructorString(className)
+                    + handle.getTempData(TempDataStoreTypes.CONSTRUCTOR, className, path)
+                    + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET);
+
+            methods.add(MethodsGenerator.getHashCodeMethodClose(MethodsGenerator.getHashCodeMethodOpen()
+                    + handle.getTempData(TempDataStoreTypes.HASH_CODE, className, path).replace(UtilConstants.NEW_LINE,
+                            "")));
+
+            methods.add(MethodsGenerator
+                    .getEqualsMethodClose(MethodsGenerator.getEqualsMethodOpen(className + UtilConstants.IMPL)
+                            + handle.getTempData(TempDataStoreTypes.EQUALS, className, path)));
+
+            methods.add(MethodsGenerator.getToStringMethodOpen()
+                    + handle.getTempData(TempDataStoreTypes.TO_STRING, className, path)
+                    + MethodsGenerator.getToStringMethodClose());
+
         } catch (ClassNotFoundException | IOException e) {
             log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
             throw new IOException("Fail to read data from temp file.");
         }
 
         /**
-         * Add default constructor and constructor methods.
-         */
-        methods.add(UtilConstants.JAVA_DOC_FIRST_LINE
-                + MethodsGenerator.getDefaultConstructorString(IMPL_CLASS_MASK, className));
-        methods.add(MethodsGenerator.getConstructorString(className));
-
-        /**
          * Add methods in impl class.
          */
         for (String method : methods) {
@@ -249,6 +269,58 @@
     }
 
     /**
+     * Generate class file for type def.
+     *
+     * @param file generated file
+     * @param className file name
+     * @param imports imports for file
+     * @param pkg package path
+     * @param cachedAttributeList attribute list
+     * @param handle  cached file handle
+     * @return type def class file
+     * @throws IOException when fails to generate class file
+     */
+    public static File generateTypeDefClassFile(File file, String className, List<String> imports,
+            String pkg, List<AttributeInfo> cachedAttributeList, CachedFileHandle handle) throws IOException {
+        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
+        initiateFile(file, className, GENERATE_TYPEDEF_CLASS, imports, pkg);
+
+        List<String> typeDef = new ArrayList<>();
+        try {
+            typeDef.add(handle.getTempData(TempDataStoreTypes.TYPE_DEF, className, path));
+        } catch (ClassNotFoundException | IOException e) {
+            log.info("There is no attribute info of " + className + " YANG file in the temporary files.");
+            throw new IOException("Fail to read data from temp file.");
+        }
+
+        /**
+         * Add attributes to the file.
+         */
+        for (String attribute : typeDef) {
+            insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
+        }
+
+        return file;
+    }
+
+    /**
+     * Returns constructor string for impl class.
+     *
+     * @param yangName class name
+     * @return constructor string
+     */
+    private static String getConstructorString(String yangName) {
+
+        String builderAttribute = yangName.substring(0, 1).toLowerCase() + yangName.substring(1);
+        String javadoc = MethodsGenerator.getConstructorString(yangName);
+        String constructor = UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + yangName + UtilConstants.IMPL + UtilConstants.OPEN_PARENTHESIS + yangName + UtilConstants.BUILDER
+                + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+        return javadoc + constructor;
+    }
+
+    /**
      * Initiate generation of file based on generated file type.
      *
      * @param file generated file
@@ -288,7 +360,6 @@
      *
      * @param file file in which method needs to be appended
      * @param method method which needs to be appended
-     * @exception IOException file operation exceptions
      */
     private static void appendMethod(File file, String method) throws IOException {
         insert(file, method);
@@ -309,17 +380,30 @@
      * Parses attribute info and fetch specific data and creates serialized
      * files of it.
      *
-     * @param attr attribute info
+     * @param attr attribute info.
      * @param genFileType generated file type
      * @param className class name
+     * @param path file path
+     * @param handle cached file handle
      */
-    public static void parseAttributeInfo(AttributeInfo attr, int genFileType, String className) {
+    public static void parseAttributeInfo(AttributeInfo attr, int genFileType, String className, String path,
+            CachedFileHandle handle) {
 
         String attrString = "";
-        String builderInterfaceMethodString = "";
-        String builderClassMethodString = "";
-        String implClassMethodString = "";
+
         String getterString = "";
+        String getterImplString = "";
+
+        String setterString = "";
+        String setterImplString = "";
+
+        String constructorString = "";
+        String typeDefString = "";
+
+        String toString = "";
+        String hashCodeString = "";
+        String equalsString = "";
+
         className = JavaIdentifierSyntax.getCaptialCase(className);
 
         try {
@@ -327,33 +411,124 @@
              * Get the attribute definition and save attributes to temporary
              * file.
              */
-            attrString = JavaCodeSnippetGen.getJavaAttributeDefination(attr.getImportInfo().getPkgInfo(),
-                    attr.getImportInfo().getClassInfo(),
-                    attr.getAttributeName());
-            TempDataStore.setTempData(attrString, TempDataStore.TempDataStoreType.ATTRIBUTE, className);
+
+            boolean isList = attr.isListAttr();
+            String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+            if (attr.isQualifiedName()) {
+                attrString = JavaCodeSnippetGen.getJavaAttributeDefination(attr.getImportInfo().getPkgInfo(),
+                        attr.getImportInfo().getClassInfo(),
+                        attributeName, attr.isListAttr());
+            } else {
+                attrString = JavaCodeSnippetGen.getJavaAttributeDefination(null, attr.getImportInfo().getClassInfo(),
+                        attributeName, attr.isListAttr());
+            }
+            handle.setTempData(attrString + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION,
+                    TempDataStoreTypes.ATTRIBUTE, className,
+                    path);
 
             if ((genFileType & INTERFACE_MASK) != 0) {
                 getterString = MethodsGenerator.getGetterString(attr);
-                TempDataStore.setTempData(getterString, TempDataStore.TempDataStoreType.GETTER_METHODS, className);
+                handle.setTempData(getterString + UtilConstants.NEW_LINE,
+                        TempDataStoreTypes.GETTER_METHODS,
+                        className,
+                        path);
+
             }
 
             if ((genFileType & BUILDER_INTERFACE_MASK) != 0) {
-                builderInterfaceMethodString = MethodsGenerator.parseBuilderInterfaceMethodString(attr, className);
-                TempDataStore.setTempData(builderInterfaceMethodString,
-                        TempDataStore.TempDataStoreType.BUILDER_INTERFACE_METHODS,
-                        className + UtilConstants.BUILDER + UtilConstants.INTERFACE);
+                setterString = MethodsGenerator.getSetterString(attr, className);
+                handle.setTempData(setterString + UtilConstants.NEW_LINE,
+                        TempDataStoreTypes.SETTER_METHODS,
+                        className,
+                        path);
             }
 
             if ((genFileType & BUILDER_CLASS_MASK) != 0) {
-                builderClassMethodString = MethodsGenerator.parseBuilderMethodString(attr, className);
-                TempDataStore.setTempData(builderClassMethodString, TempDataStore.TempDataStoreType.BUILDER_METHODS,
-                        className + UtilConstants.BUILDER);
+                getterImplString = MethodsGenerator.getGetterForClass(attr);
+                handle.setTempData(
+                        MethodsGenerator.getOverRideString() + getterImplString + UtilConstants.NEW_LINE,
+                        TempDataStoreTypes.GETTER_METHODS_IMPL, className,
+                        path);
+                setterImplString = MethodsGenerator.getSetterForClass(attr, className);
+                handle.setTempData(
+                        MethodsGenerator.getOverRideString() + setterImplString + UtilConstants.NEW_LINE,
+                        TempDataStoreTypes.SETTER_METHODS_IMPL, className,
+                        path);
             }
 
             if ((genFileType & IMPL_CLASS_MASK) != 0) {
-                implClassMethodString = MethodsGenerator.parseImplMethodString(attr);
-                TempDataStore.setTempData(implClassMethodString, TempDataStore.TempDataStoreType.IMPL_METHODS,
-                        className + UtilConstants.IMPL);
+                constructorString = MethodsGenerator.getConstructor(className, attr);
+                handle.setTempData(constructorString, TempDataStoreTypes.CONSTRUCTOR, className,
+                        path);
+
+                hashCodeString = MethodsGenerator.getHashCodeMethod(attr);
+                handle.setTempData(hashCodeString + UtilConstants.NEW_LINE,
+                        TempDataStoreTypes.HASH_CODE,
+                        className,
+                        path);
+                equalsString = MethodsGenerator.getEqualsMethod(attr);
+                handle.setTempData(equalsString + UtilConstants.NEW_LINE,
+                        TempDataStoreTypes.EQUALS,
+                        className,
+                        path);
+
+                toString = MethodsGenerator.getToStringMethod(attr);
+                handle.setTempData(toString + UtilConstants.NEW_LINE,
+                        TempDataStoreTypes.TO_STRING,
+                        className,
+                        path);
+
+            }
+
+            if ((genFileType & GENERATE_TYPEDEF_CLASS) != 0) {
+
+                if (attr.isQualifiedName()) {
+                    typeDefString = JavaCodeSnippetGen.getJavaAttributeDefination(attr.getImportInfo().getPkgInfo(),
+                            attr.getImportInfo().getClassInfo(),
+                            attributeName, attr.isListAttr()) + UtilConstants.NEW_LINE;
+                } else {
+                    typeDefString = JavaCodeSnippetGen.getJavaAttributeDefination(null,
+                            attr.getImportInfo().getClassInfo(),
+                            attributeName, attr.isListAttr()) + UtilConstants.NEW_LINE;
+                }
+
+                typeDefString = typeDefString + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                        + UtilConstants.JAVA_DOC_FIRST_LINE;
+
+                typeDefString = typeDefString
+                        + MethodsGenerator.getDefaultConstructorString(className, UtilConstants.PRIVATE)
+                        + UtilConstants.NEW_LINE;
+
+                typeDefString = typeDefString
+                        + JavaDocGen.getJavaDoc(JavaDocType.TYPE_DEF_CONSTRUCTOR, className, isList)
+                        + MethodsGenerator.getTypeDefConstructor(attr, className)
+                        + UtilConstants.NEW_LINE;
+
+                typeDefString = typeDefString + JavaDocGen.getJavaDoc(JavaDocType.OF, className, isList)
+                        + MethodsGenerator.getOfMethod(className, attr) + UtilConstants.NEW_LINE;
+
+                typeDefString = typeDefString + JavaDocGen.getJavaDoc(JavaDocType.GETTER, className, isList)
+                        + MethodsGenerator.getGetterForClass(attr) + UtilConstants.NEW_LINE;
+
+                typeDefString = typeDefString + JavaDocGen.getJavaDoc(JavaDocType.TYPE_DEF_SETTER, className, isList)
+                        + MethodsGenerator.getSetterForTypeDefClass(attr)
+                        + UtilConstants.NEW_LINE;
+
+                hashCodeString = hashCodeString + MethodsGenerator.getHashCodeMethodOpen()
+                        + MethodsGenerator.getHashCodeMethod(attr).replace(UtilConstants.NEW_LINE, "");
+                hashCodeString = MethodsGenerator.getHashCodeMethodClose(hashCodeString) + UtilConstants.NEW_LINE;
+
+                equalsString = equalsString + MethodsGenerator.getEqualsMethodOpen(className) + UtilConstants.NEW_LINE
+                        + MethodsGenerator.getEqualsMethod(attr);
+                equalsString = MethodsGenerator.getEqualsMethodClose(equalsString) + UtilConstants.NEW_LINE;
+
+                toString = toString + MethodsGenerator.getToStringMethodOpen()
+                        + MethodsGenerator.getToStringMethod(attr) + UtilConstants.NEW_LINE
+                        + MethodsGenerator.getToStringMethodClose()
+                        + UtilConstants.NEW_LINE;
+                typeDefString = typeDefString + hashCodeString + equalsString + toString;
+                handle.setTempData(typeDefString, TempDataStoreTypes.TYPE_DEF, className,
+                        path);
             }
         } catch (IOException e) {
             log.info("Failed to set data for " + attr.getAttributeName() + " in temp data files.");
@@ -368,18 +543,34 @@
      * @param fileName generated file name
      * @param type generated file type
      * @param pkg generated file package
-     * @param importsList list of java imports
+     * @param importsList list of java imports.
      * @throws IOException when fails to append contents
      */
     private static void appendContents(File file, String fileName, int type, List<String> importsList,
             String pkg) throws IOException {
 
+        if (pkg.contains(UtilConstants.YANG_GEN_DIR)) {
+            String[] strArray = pkg.split(UtilConstants.YANG_GEN_DIR);
+            pkg = strArray[1].replace(UtilConstants.SLASH, UtilConstants.PERIOD);
+        }
+
         if ((type & IMPL_CLASS_MASK) != 0) {
 
             write(file, fileName, type, JavaDocType.IMPL_CLASS);
         } else if ((type & BUILDER_INTERFACE_MASK) != 0) {
 
             write(file, fileName, type, JavaDocType.BUILDER_INTERFACE);
+        } else if ((type & GENERATE_TYPEDEF_CLASS) != 0) {
+            insert(file, CopyrightHeader.getCopyrightHeader());
+            insert(file, "package" + UtilConstants.SPACE + pkg + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE);
+            if (importsList != null) {
+                insert(file, UtilConstants.NEW_LINE);
+                for (String imports : importsList) {
+                    insert(file, imports);
+                }
+                insert(file, UtilConstants.NEW_LINE);
+            }
+            write(file, fileName, type, JavaDocType.IMPL_CLASS);
         } else {
 
             if ((type & INTERFACE_MASK) != 0) {
@@ -420,7 +611,7 @@
     private static void write(File file, String fileName, int genType, JavaDocGen.JavaDocType javaDocType)
             throws IOException {
 
-        insert(file, JavaDocGen.getJavaDoc(javaDocType, fileName));
+        insert(file, JavaDocGen.getJavaDoc(javaDocType, fileName, false));
         insert(file, JavaCodeSnippetGen.getJavaClassDefStart(genType, fileName));
     }
 
@@ -433,13 +624,27 @@
      */
     public static void insert(File file, String data) throws IOException {
         try {
-            FileSystemUtil.insertStringInFile(file, data);
+            FileSystemUtil.updateFileHandle(file, data, false);
         } catch (IOException e) {
             throw new IOException("Failed to insert in " + file + "file");
         }
     }
 
     /**
+     * Closes the files handle for generate files.
+     *
+     * @param file generate files
+     * @throws IOException when failed to close the file handle
+     */
+    public static void closeFileHandles(File file) throws IOException {
+        try {
+            FileSystemUtil.updateFileHandle(file, null, true);
+        } catch (IOException e) {
+            throw new IOException("Failed to close file handle for " + file + "file");
+        }
+    }
+
+    /**
      * Removes temp files.
      *
      * @param file file to be removed
@@ -449,4 +654,14 @@
             file.delete();
         }
     }
+
+    /**
+     * Removes temp files.
+     *
+     * @param tempDir temp directory
+     * @throws IOException when fails to delete the directory
+     */
+    public static void cleanTempFiles(File tempDir) throws IOException {
+        FileUtils.deleteDirectory(tempDir);
+    }
 }
