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 ab537c8..299f5ac 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
@@ -21,17 +21,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.io.FileUtils;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.HasTempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
-import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-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 static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
@@ -47,17 +40,25 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.initiateJavaFileGeneration;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCaptialCase;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getBuildString;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getConstructorStart;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getDefaultConstructorString;
 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.getHashCodeMethodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodOpen;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.parseBuilderInterfaceBuildMethodString;
+import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
+import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
+import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
+import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
+import static org.onosproject.yangutils.utils.UtilConstants.IMPL;
+import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
+import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
+import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.partString;
 
 /**
@@ -72,20 +73,6 @@
     }
 
     /**
-     * Returns a file object for generated file.
-     *
-     * @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, JavaFileInfo handle) {
-
-        return new File(handle.getBaseCodeGenPath() + filePath + File.separator + fileName + extension);
-    }
-
-    /**
      * Returns generated interface file for current node.
      *
      * @param file file
@@ -101,13 +88,16 @@
         String className = getCaptialCase(javaFileInfo.getJavaName());
         String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
 
-        initiateFile(file, className, INTERFACE_MASK, imports, path);
+        initiateJavaFileGeneration(file, className, INTERFACE_MASK, imports, path);
 
         /**
          * Add getter methods to interface file.
          */
         try {
-            appendMethod(file, getDataFromTempFileHandle(GETTER_FOR_INTERFACE_MASK, curNode));
+            /**
+             * Getter methods.
+             */
+            insertDataIntoJavaFile(file, getDataFromTempFileHandle(GETTER_FOR_INTERFACE_MASK, curNode));
         } catch (IOException e) {
             throw new IOException("No data found in temporary java code fragment files for " + className
                     + " while interface file generation");
@@ -130,15 +120,19 @@
         String className = getCaptialCase(javaFileInfo.getJavaName());
         String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
 
-        initiateFile(file, className, BUILDER_INTERFACE_MASK, null, path);
+        initiateJavaFileGeneration(file, className, BUILDER_INTERFACE_MASK, null, path);
         List<String> methods = new ArrayList<>();
 
         try {
-            methods.add(UtilConstants.FOUR_SPACE_INDENTATION
-                    + getDataFromTempFileHandle(GETTER_FOR_INTERFACE_MASK, curNode));
-            methods.add(UtilConstants.NEW_LINE);
-            methods.add(UtilConstants.FOUR_SPACE_INDENTATION
-                    + getDataFromTempFileHandle(SETTER_FOR_INTERFACE_MASK, curNode));
+            /**
+             * Getter methods.
+             */
+            methods.add(FOUR_SPACE_INDENTATION + getDataFromTempFileHandle(GETTER_FOR_INTERFACE_MASK, curNode));
+            /**
+             * Setter methods.
+             */
+            methods.add(NEW_LINE);
+            methods.add(FOUR_SPACE_INDENTATION + getDataFromTempFileHandle(SETTER_FOR_INTERFACE_MASK, curNode));
         } catch (IOException e) {
             throw new IOException("No data found in temporary java code fragment files for " + className
                     + " while builder interface file generation");
@@ -147,16 +141,17 @@
         /**
          * Add build method to builder interface file.
          */
-        methods.add(parseBuilderInterfaceBuildMethodString(className));
+        methods.add(
+                ((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles().addBuildMethodForInterface());
 
         /**
          * Add getters and setters in builder interface.
          */
         for (String method : methods) {
-            appendMethod(file, method);
+            insertDataIntoJavaFile(file, method);
         }
 
-        insert(file, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
+        insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
         return file;
     }
 
@@ -176,7 +171,7 @@
         String className = getCaptialCase(javaFileInfo.getJavaName());
         String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
 
-        initiateFile(file, className, BUILDER_CLASS_MASK, imports, path);
+        initiateJavaFileGeneration(file, className, BUILDER_CLASS_MASK, imports, path);
 
         List<String> methods = new ArrayList<>();
 
@@ -184,16 +179,22 @@
          * Add attribute strings.
          */
         try {
-            insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
-                    + getDataFromTempFileHandle(ATTRIBUTES_MASK, curNode));
+            insertDataIntoJavaFile(file,
+                    NEW_LINE + FOUR_SPACE_INDENTATION + getDataFromTempFileHandle(ATTRIBUTES_MASK, curNode));
         } catch (IOException e) {
             throw new IOException("No data found in temporary java code fragment files for " + className
                     + " while builder class file generation");
         }
 
         try {
+            /**
+             * Getter methods.
+             */
             methods.add(getDataFromTempFileHandle(GETTER_FOR_CLASS_MASK, curNode));
-            methods.add(getDataFromTempFileHandle(SETTER_FOR_CLASS_MASK, curNode) + UtilConstants.NEW_LINE);
+            /**
+             * Setter methods.
+             */
+            methods.add(getDataFromTempFileHandle(SETTER_FOR_CLASS_MASK, curNode) + NEW_LINE);
         } catch (IOException e) {
             throw new IOException("No data found in temporary java code fragment files for " + className
                     + " while builder class file generation");
@@ -202,15 +203,15 @@
         /**
          * Add default constructor and build method impl.
          */
-        methods.add(getBuildString(className) + UtilConstants.NEW_LINE);
-        methods.add(UtilConstants.NEW_LINE
-                + getDefaultConstructorString(className + UtilConstants.BUILDER, UtilConstants.PUBLIC));
+        methods.add(((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles().addBuildMethodImpl());
+        methods.add(((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles()
+                .addDefaultConstructor(PUBLIC, BUILDER));
 
         /**
          * Add methods in builder class.
          */
         for (String method : methods) {
-            appendMethod(file, method);
+            insertDataIntoJavaFile(file, method);
         }
         return file;
     }
@@ -231,7 +232,7 @@
         String className = getCaptialCase(javaFileInfo.getJavaName());
         String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
 
-        initiateFile(file, className, IMPL_CLASS_MASK, null, path);
+        initiateJavaFileGeneration(file, className, IMPL_CLASS_MASK, null, path);
 
         List<String> methods = new ArrayList<>();
 
@@ -239,25 +240,32 @@
          * Add attribute strings.
          */
         try {
-            insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
-                    + getDataFromTempFileHandle(ATTRIBUTES_MASK, curNode));
+            insertDataIntoJavaFile(file,
+                    NEW_LINE + FOUR_SPACE_INDENTATION + getDataFromTempFileHandle(ATTRIBUTES_MASK, curNode));
         } catch (IOException e) {
             throw new IOException("No data found in temporary java code fragment files for " + className
                     + " while impl class file generation");
         }
 
-        insert(file, UtilConstants.NEW_LINE);
+        insertDataIntoJavaFile(file, NEW_LINE);
         try {
-
+            /**
+             * Getter methods.
+             */
             methods.add(getDataFromTempFileHandle(GETTER_FOR_CLASS_MASK, curNode));
-
+            /**
+             * Hash code method.
+             */
             methods.add(getHashCodeMethodClose(getHashCodeMethodOpen() + partString(
-                    getDataFromTempFileHandle(HASH_CODE_IMPL_MASK, curNode).replace(UtilConstants.NEW_LINE,
-                            UtilConstants.EMPTY_STRING))));
-
-            methods.add(getEqualsMethodClose(getEqualsMethodOpen(className + UtilConstants.IMPL)
-                    + getDataFromTempFileHandle(EQUALS_IMPL_MASK, curNode)));
-
+                    getDataFromTempFileHandle(HASH_CODE_IMPL_MASK, curNode).replace(NEW_LINE, EMPTY_STRING))));
+            /**
+             * Equals method.
+             */
+            methods.add(getEqualsMethodClose(
+                    getEqualsMethodOpen(className + IMPL) + getDataFromTempFileHandle(EQUALS_IMPL_MASK, curNode)));
+            /**
+             * To string method.
+             */
             methods.add(getToStringMethodOpen() + getDataFromTempFileHandle(TO_STRING_IMPL_MASK, curNode)
                     + getToStringMethodClose());
 
@@ -267,8 +275,11 @@
         }
 
         try {
+            /**
+             * Constructor.
+             */
             methods.add(getConstructorStart(className) + getDataFromTempFileHandle(CONSTRUCTOR_IMPL_MASK, curNode)
-                    + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET);
+                    + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET);
         } catch (IOException e) {
             throw new IOException("No data found in temporary java code fragment files for " + className
                     + " while impl class file generation");
@@ -277,262 +288,100 @@
          * Add methods in impl class.
          */
         for (String method : methods) {
-            appendMethod(file, UtilConstants.FOUR_SPACE_INDENTATION + method + UtilConstants.NEW_LINE);
+            insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + method + NEW_LINE);
         }
-        insert(file, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
+        insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
 
         return file;
     }
 
     /**
-     * Return data stored in temporary files.
+     * Generate class file for type def.
      *
+     * @param file generated file
      * @param curNode current YANG node
-     * @param generatedTempFiles mask for the types of files being generated
-     * @return data stored in temporary files
-     * @throws IOException when failed to get the data from temporary file
-     *             handle
-     */
-    private static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
+     * @param imports imports for file
+     * @return type def class file
+     * @throws IOException when fails to generate class file
+    */
+    public static File generateTypeDefClassFile(File file, YangNode curNode, List<String> imports) throws IOException {
 
-        TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
-                .getTempJavaCodeFragmentFiles();
+        JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
 
-        if ((generatedTempFiles & ATTRIBUTES_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getAttributesTempFileHandle());
-        } else if ((generatedTempFiles & GETTER_FOR_INTERFACE_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterInterfaceTempFileHandle());
-        } else if ((generatedTempFiles & SETTER_FOR_INTERFACE_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterInterfaceTempFileHandle());
-        } else if ((generatedTempFiles & GETTER_FOR_CLASS_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getGetterImplTempFileHandle());
-        } else if ((generatedTempFiles & SETTER_FOR_CLASS_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getSetterImplTempFileHandle());
-        } else if ((generatedTempFiles & CONSTRUCTOR_IMPL_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getConstructorImplTempFileHandle());
-        } else if ((generatedTempFiles & HASH_CODE_IMPL_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getHashCodeImplTempFileHandle());
-        } else if ((generatedTempFiles & EQUALS_IMPL_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getEqualsImplTempFileHandle());
-        } else if ((generatedTempFiles & TO_STRING_IMPL_MASK) != 0) {
-            return tempJavaCodeFragmentFiles
-                    .getTemporaryDataFromFileHandle(tempJavaCodeFragmentFiles.getToStringImplTempFileHandle());
-        }
-        return null;
-    }
+        String className = getCaptialCase(javaFileInfo.getJavaName());
+        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
 
-    /**
-     * Initiate generation of file based on generated file type.
-     *
-     * @param file generated file
-     * @param className generated file class name
-     * @param type generated file type
-     * @param imports imports for the file
-     * @param pkg generated file package
-     * @throws IOException when fails to generate a file
-     */
-    private static void initiateFile(File file, String className, int type, List<String> imports,
-            String pkg) throws IOException {
+        initiateJavaFileGeneration(file, className, GENERATE_TYPEDEF_CLASS, imports, path);
 
-        try {
-            file.createNewFile();
-            appendContents(file, className, type, imports, pkg);
-        } catch (IOException e) {
-            throw new IOException("Failed to create " + file.getName() + " class file.");
-        }
-    }
+        List<String> methods = new ArrayList<>();
 
-    /**
-     * Appends the temp files to main files.
-     *
-     * @param appendFile temp file
-     * @param srcFile main file
-     * @throws IOException when fails to append contents
-     */
-    public static void appendFileContents(File appendFile, File srcFile) throws IOException {
-
-        try {
-            FileSystemUtil.appendFileContents(appendFile, srcFile);
-        } catch (IOException e) {
-            throw new IOException("Failed to append " + appendFile + " in " + srcFile);
-        }
-    }
-
-    /**
-     * Append methods to the generated files.
-     *
-     * @param file file in which method needs to be appended
-     * @param method method which needs to be appended
-     * @throws IOException IO operation failure
-     */
-    private static void appendMethod(File file, String method) throws IOException {
-
-        insert(file, method);
-    }
-
-    /**
-     * Appends all the contents into a generated java file.
-     *
-     * @param file generated file
-     * @param fileName generated file name
-     * @param type generated file type
-     * @param pkg generated file package
-     * @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 {
-
-        String pkgString = parsePackageString(pkg, importsList);
-
-        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) {
-            appendHeaderContents(file, pkgString, importsList);
-            write(file, fileName, type, JavaDocType.IMPL_CLASS);
-        } else if ((type & INTERFACE_MASK) != 0) {
-
-            appendHeaderContents(file, pkgString, importsList);
-            write(file, fileName, type, JavaDocType.INTERFACE);
-        } else if ((type & BUILDER_CLASS_MASK) != 0) {
-
-            appendHeaderContents(file, pkgString, importsList);
-            write(file, fileName, type, JavaDocType.BUILDER_CLASS);
-        }
-    }
-
-    /**
-     * Removes base directory path from package and generates package string for
-     * file.
-     *
-     * @param pkg generated package
-     * @param importsList list of imports
-     * @return package string
-     */
-    private static String parsePackageString(String pkg, List<String> importsList) {
-
-        if (pkg.contains(UtilConstants.ORG)) {
-            String[] strArray = pkg.split(UtilConstants.ORG);
-            pkg = UtilConstants.ORG + strArray[1].replace(UtilConstants.SLASH, UtilConstants.PERIOD);
-        }
-        if (importsList != null) {
-            if (!importsList.isEmpty()) {
-                return UtilConstants.PACKAGE + UtilConstants.SPACE + pkg + UtilConstants.SEMI_COLAN
-                        + UtilConstants.NEW_LINE;
-            } else {
-                return UtilConstants.PACKAGE + UtilConstants.SPACE + pkg + UtilConstants.SEMI_COLAN;
-            }
-        } else {
-            return UtilConstants.PACKAGE + UtilConstants.SPACE + pkg + UtilConstants.SEMI_COLAN;
-        }
-    }
-
-    /**
-     * Appends other contents to interface, builder and typedef classes. for
-     * example : ONOS copyright, imports and package.
-     *
-     * @param file generated file
-     * @param pkg generated package
-     * @param importsList list of imports
-     * @throws IOException when fails to append contents.
-     */
-    private static void appendHeaderContents(File file, String pkg, List<String> importsList) throws IOException {
-
-        insert(file, CopyrightHeader.getCopyrightHeader());
-        insert(file, pkg);
-
-        /*
-         * TODO: add the file header using
-         * JavaCodeSnippetGen.getFileHeaderComment
+        /**
+         * Add attribute strings.
          */
-
-        if (importsList != null) {
-            insert(file, UtilConstants.NEW_LINE);
-            for (String imports : importsList) {
-                insert(file, imports);
-            }
-        }
-    }
-
-    /**
-     * Write data to the specific generated file.
-     *
-     * @param file generated file
-     * @param fileName file name
-     * @param genType generated file type
-     * @param javaDocType java doc type
-     * @throws IOException when fails to write into a file
-     */
-    private static void write(File file, String fileName, int genType, JavaDocGen.JavaDocType javaDocType)
-            throws IOException {
-
-        insert(file, JavaDocGen.getJavaDoc(javaDocType, fileName, false));
-        insert(file, JavaCodeSnippetGen.getJavaClassDefStart(genType, fileName));
-    }
-
-    /**
-     * Insert in the generated file.
-     *
-     * @param file file in which need to be inserted
-     * @param data data which need to be inserted
-     * @throws IOException when fails to insert into file
-     */
-    public static void insert(File file, String data) throws IOException {
-
         try {
-            FileSystemUtil.updateFileHandle(file, data, false);
+            insertDataIntoJavaFile(file,
+                    NEW_LINE + FOUR_SPACE_INDENTATION + getDataFromTempFileHandle(ATTRIBUTES_MASK, curNode));
         } catch (IOException e) {
-            throw new IOException("Failed to insert in " + file + "file");
+            throw new IOException("No data found in temporary java code fragment files for " + className
+                    + " while type def class file generation");
         }
-    }
 
-    /**
-     * 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 {
+        /**
+         * Default constructor.
+         */
+        methods.add(((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles()
+                .addDefaultConstructor(PRIVATE, EMPTY_STRING));
 
+        /**
+         * Constructor.
+         */
+        methods.add(((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles()
+                .addTypeDefConstructor());
+
+        /**
+         * Of method.
+         */
+        methods.add(((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles().addOfMethod());
         try {
-            FileSystemUtil.updateFileHandle(file, null, true);
+
+            /**
+             * Getter method.
+             */
+            methods.add(getDataFromTempFileHandle(GETTER_FOR_CLASS_MASK, curNode));
+
+            /**
+             * Setter method.
+             */
+            methods.add(((HasTempJavaCodeFragmentFiles) curNode).getTempJavaCodeFragmentFiles().addTypeDefsSetter());
+
+            /**
+             * Hash code method.
+             */
+            methods.add(getHashCodeMethodClose(getHashCodeMethodOpen() + partString(
+                    getDataFromTempFileHandle(HASH_CODE_IMPL_MASK, curNode).replace(NEW_LINE, EMPTY_STRING))));
+
+            /**
+             * Equals method.
+             */
+            methods.add(getEqualsMethodClose(getEqualsMethodOpen(className + EMPTY_STRING)
+                    + getDataFromTempFileHandle(EQUALS_IMPL_MASK, curNode)));
+
+            /**
+             * To string method.
+             */
+            methods.add(getToStringMethodOpen() + getDataFromTempFileHandle(TO_STRING_IMPL_MASK, curNode)
+                    + getToStringMethodClose());
+
         } catch (IOException e) {
-            throw new IOException("Failed to close file handle for " + file + "file");
+            throw new IOException("No data found in temporary java code fragment files for " + className
+                    + " while tyoe def class file generation");
         }
-    }
 
-    /**
-     * Removes temp files.
-     *
-     * @param file file to be removed
-     */
-    public static void clean(File file) {
-
-        if (file.exists()) {
-            file.delete();
+        for (String method : methods) {
+            insertDataIntoJavaFile(file, method);
         }
-    }
+        insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET + NEW_LINE);
 
-    /**
-     * 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);
+        return file;
     }
 }
