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 221f757..ab537c8 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,36 +16,55 @@
 
 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.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 org.onosproject.yangutils.utils.io.impl.YangIoUtils;
-import org.slf4j.Logger;
+
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.HASH_CODE_IMPL_MASK;
+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.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.io.impl.YangIoUtils.partString;
 
 /**
  * Generates java file.
  */
 public final class JavaFileGenerator {
 
-    private static final Logger log = getLogger(JavaFileGenerator.class);
-
     /**
      * Default constructor.
      */
@@ -61,42 +80,37 @@
      * @param handle cached file handle
      * @return file object
      */
-    public static File getFileObject(String filePath, String fileName, String extension, CachedFileHandle handle) {
-        return new File(handle.getCodeGenFilePath() + filePath + File.separator + fileName + extension);
+    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
-     * @param className class name
      * @param imports imports for the file
-     * @param attrList attribute info
-     * @param pkg generated file package
-     * @param handle cached file handle
+     * @param curNode current YANG node
      * @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, CachedFileHandle handle) throws IOException {
-        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
-        initiateFile(file, className, INTERFACE_MASK, imports, pkg);
+    public static File generateInterfaceFile(File file, List<String> imports, YangNode curNode) throws IOException {
 
-        if (!attrList.isEmpty()) {
-            List<String> methods = new ArrayList<>();
-            try {
-                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.");
-            }
+        JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
 
-            /**
-             * Add getter methods to interface file.
-             */
-            for (String method : methods) {
-                appendMethod(file, method);
-            }
+        String className = getCaptialCase(javaFileInfo.getJavaName());
+        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
+
+        initiateFile(file, className, INTERFACE_MASK, imports, path);
+
+        /**
+         * Add getter methods to interface file.
+         */
+        try {
+            appendMethod(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");
         }
         return file;
     }
@@ -105,39 +119,41 @@
      * Return generated builder interface file for current node.
      *
      * @param file file
-     * @param className class name
-     * @param pkg generated file package
-     * @param attrList attribute info
-     * @param handle cached file handle
+     * @param curNode current YANG node
      * @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, CachedFileHandle handle) throws IOException {
-        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
-        initiateFile(file, className, BUILDER_INTERFACE_MASK, null, pkg);
+    public static File generateBuilderInterfaceFile(File file, YangNode curNode) throws IOException {
+
+        JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
+
+        String className = getCaptialCase(javaFileInfo.getJavaName());
+        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
+
+        initiateFile(file, className, BUILDER_INTERFACE_MASK, null, path);
         List<String> methods = new ArrayList<>();
 
-        if (!attrList.isEmpty()) {
-
-            try {
-                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.");
-            }
+        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));
+        } catch (IOException e) {
+            throw new IOException("No data found in temporary java code fragment files for " + className
+                    + " while builder interface file generation");
         }
+
         /**
          * Add build method to builder interface file.
          */
-        methods.add(MethodsGenerator.parseBuilderInterfaceBuildMethodString(className));
+        methods.add(parseBuilderInterfaceBuildMethodString(className));
 
         /**
          * Add getters and setters in builder interface.
          */
         for (String method : methods) {
-            appendMethod(file, UtilConstants.FOUR_SPACE_INDENTATION + method);
+            appendMethod(file, method);
         }
 
         insert(file, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
@@ -148,61 +164,53 @@
      * Returns generated builder class file for current node.
      *
      * @param file file
-     * @param className class name
      * @param imports imports for the file
-     * @param pkg generated file package
-     * @param attrList attribute info
-     * @param handle cached file handle
+     * @param curNode current YANG node
      * @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, CachedFileHandle handle) throws IOException {
-        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
-        initiateFile(file, className, BUILDER_CLASS_MASK, imports, pkg);
+    public static File generateBuilderClassFile(File file, List<String> imports, YangNode curNode) throws IOException {
+
+        JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
+
+        String className = getCaptialCase(javaFileInfo.getJavaName());
+        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
+
+        initiateFile(file, className, BUILDER_CLASS_MASK, imports, path);
 
         List<String> methods = new ArrayList<>();
-        if (!attrList.isEmpty()) {
-            /**
-             * Add attribute strings.
-             */
-            List<String> attributes = new ArrayList<>();
-            try {
-                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.");
-            }
-            /**
-             * Add attributes to the file.
-             */
-            for (String attribute : attributes) {
-                insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
-            }
 
-            try {
-                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.");
-            }
-
+        /**
+         * Add attribute strings.
+         */
+        try {
+            insert(file, UtilConstants.NEW_LINE + UtilConstants.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 {
+            methods.add(getDataFromTempFileHandle(GETTER_FOR_CLASS_MASK, curNode));
+            methods.add(getDataFromTempFileHandle(SETTER_FOR_CLASS_MASK, curNode) + UtilConstants.NEW_LINE);
+        } catch (IOException e) {
+            throw new IOException("No data found in temporary java code fragment files for " + className
+                    + " while builder class file generation");
+        }
+
         /**
          * Add default constructor and build method impl.
          */
-        methods.add(
-                UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
-                        + MethodsGenerator.getDefaultConstructorString(className + UtilConstants.BUILDER,
-                                UtilConstants.PUBLIC));
-        methods.add(MethodsGenerator.getBuildString(className));
+        methods.add(getBuildString(className) + UtilConstants.NEW_LINE);
+        methods.add(UtilConstants.NEW_LINE
+                + getDefaultConstructorString(className + UtilConstants.BUILDER, UtilConstants.PUBLIC));
 
         /**
          * Add methods in builder class.
          */
         for (String method : methods) {
-            appendMethod(file, method + UtilConstants.NEW_LINE);
+            appendMethod(file, method);
         }
         return file;
     }
@@ -211,67 +219,59 @@
      * Returns generated impl class file for current node.
      *
      * @param file file
-     * @param className class name
-     * @param pkg generated file package
-     * @param attrList attribute's info
-     * @param handle cached file handle
+     * @param curNode current YANG node
      * @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,
-            CachedFileHandle handle)
-                    throws IOException {
-        String path = handle.getCodeGenFilePath() + pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH);
+    public static File generateImplClassFile(File file, YangNode curNode)
+            throws IOException {
+
+        JavaFileInfo javaFileInfo = ((HasJavaFileInfo) curNode).getJavaFileInfo();
+
+        String className = getCaptialCase(javaFileInfo.getJavaName());
+        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
+
         initiateFile(file, className, IMPL_CLASS_MASK, null, path);
 
         List<String> methods = new ArrayList<>();
-        if (!attrList.isEmpty()) {
-            List<String> attributes = new ArrayList<>();
-            try {
-                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.");
-            }
 
-            /**
-             * Add attributes to the file.
-             */
-            for (String attribute : attributes) {
-                insert(file, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
-            }
+        /**
+         * Add attribute strings.
+         */
+        try {
+            insert(file, UtilConstants.NEW_LINE + UtilConstants.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");
+        }
 
-            try {
+        insert(file, UtilConstants.NEW_LINE);
+        try {
 
-                methods.add(handle.getTempData(TempDataStoreTypes.GETTER_METHODS_IMPL, className, path));
+            methods.add(getDataFromTempFileHandle(GETTER_FOR_CLASS_MASK, curNode));
 
-                methods.add(MethodsGenerator.getHashCodeMethodClose(MethodsGenerator.getHashCodeMethodOpen()
-                        + YangIoUtils
-                                .partString(handle.getTempData(TempDataStoreTypes.HASH_CODE, className, path).replace(
-                                        UtilConstants.NEW_LINE, ""))));
+            methods.add(getHashCodeMethodClose(getHashCodeMethodOpen() + partString(
+                    getDataFromTempFileHandle(HASH_CODE_IMPL_MASK, curNode).replace(UtilConstants.NEW_LINE,
+                            UtilConstants.EMPTY_STRING))));
 
-                methods.add(MethodsGenerator
-                        .getEqualsMethodClose(MethodsGenerator.getEqualsMethodOpen(className + UtilConstants.IMPL)
-                                + handle.getTempData(TempDataStoreTypes.EQUALS, className, path)));
+            methods.add(getEqualsMethodClose(getEqualsMethodOpen(className + UtilConstants.IMPL)
+                    + getDataFromTempFileHandle(EQUALS_IMPL_MASK, curNode)));
 
-                methods.add(MethodsGenerator.getToStringMethodOpen()
-                        + handle.getTempData(TempDataStoreTypes.TO_STRING, className, path)
-                        + MethodsGenerator.getToStringMethodClose());
+            methods.add(getToStringMethodOpen() + getDataFromTempFileHandle(TO_STRING_IMPL_MASK, curNode)
+                    + 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.");
-            }
-
+        } catch (IOException e) {
+            throw new IOException("No data found in temporary java code fragment files for " + className
+                    + " while impl class file generation");
         }
 
         try {
-            methods.add(getConstructorString(className)
-                    + handle.getTempData(TempDataStoreTypes.CONSTRUCTOR, className, path)
+            methods.add(getConstructorStart(className) + getDataFromTempFileHandle(CONSTRUCTOR_IMPL_MASK, curNode)
                     + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET);
-        } 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.");
+        } catch (IOException e) {
+            throw new IOException("No data found in temporary java code fragment files for " + className
+                    + " while impl class file generation");
         }
         /**
          * Add methods in impl class.
@@ -285,56 +285,48 @@
     }
 
     /**
-     * Generate class file for type def.
+     * Return data stored in temporary files.
      *
-     * @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
+     * @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
      */
-    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);
+    private static String getDataFromTempFileHandle(int generatedTempFiles, YangNode curNode) throws IOException {
 
-        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.");
+        TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((HasTempJavaCodeFragmentFiles) curNode)
+                .getTempJavaCodeFragmentFiles();
+
+        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());
         }
-
-        /**
-         * 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.BUILDER + UtilConstants.OBJECT
-                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
-                + UtilConstants.NEW_LINE;
-        return javadoc + constructor;
+        return null;
     }
 
     /**
@@ -349,6 +341,7 @@
      */
     private static void initiateFile(File file, String className, int type, List<String> imports,
             String pkg) throws IOException {
+
         try {
             file.createNewFile();
             appendContents(file, className, type, imports, pkg);
@@ -365,6 +358,7 @@
      * @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) {
@@ -377,184 +371,14 @@
      *
      * @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);
     }
 
     /**
-     * Closes the current generated file.
-     *
-     * @param fileType generate file type
-     * @param yangName file name
-     * @return end of class definition string
-     */
-    public static String closeFile(int fileType, String yangName) {
-        return JavaCodeSnippetGen.getJavaClassDefClose(fileType, yangName);
-    }
-
-    /**
-     * Parses attribute info and fetch specific data and creates serialized
-     * files of it.
-     *
-     * @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, String path,
-            CachedFileHandle handle) {
-
-        String attrString = "";
-
-        String getterString = "";
-        String getterImplString = "";
-
-        String setterString = "";
-        String setterImplString = "";
-
-        String constructorString = "";
-        String typeDefString = "";
-
-        String toString = "";
-        String hashCodeString = "";
-        String equalsString = "";
-
-        className = JavaIdentifierSyntax.getCaptialCase(className);
-
-        try {
-            /*
-             * Get the attribute definition and save attributes to temporary
-             * file.
-             */
-
-            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);
-                handle.setTempData(getterString + UtilConstants.NEW_LINE,
-                        TempDataStoreTypes.GETTER_METHODS,
-                        className,
-                        path);
-
-            }
-
-            if ((genFileType & BUILDER_INTERFACE_MASK) != 0) {
-                setterString = MethodsGenerator.getSetterString(attr, className);
-                handle.setTempData(setterString + UtilConstants.NEW_LINE,
-                        TempDataStoreTypes.SETTER_METHODS,
-                        className,
-                        path);
-            }
-
-            if ((genFileType & BUILDER_CLASS_MASK) != 0) {
-                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) {
-                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 = MethodsGenerator.getHashCodeMethodOpen()
-                        + YangIoUtils.partString(
-                                MethodsGenerator.getHashCodeMethod(attr).replace(UtilConstants.NEW_LINE, ""));
-                hashCodeString = MethodsGenerator.getHashCodeMethodClose(hashCodeString) + UtilConstants.NEW_LINE;
-
-                equalsString = MethodsGenerator.getEqualsMethodOpen(className) + UtilConstants.NEW_LINE
-                        + MethodsGenerator.getEqualsMethod(attr);
-                equalsString = MethodsGenerator.getEqualsMethodClose(equalsString) + UtilConstants.NEW_LINE;
-
-                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.");
-        }
-
-    }
-
-    /**
      * Appends all the contents into a generated java file.
      *
      * @param file generated file
@@ -567,10 +391,7 @@
     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);
-        }
+        String pkgString = parsePackageString(pkg, importsList);
 
         if ((type & IMPL_CLASS_MASK) != 0) {
 
@@ -579,38 +400,68 @@
 
             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);
-                }
-            }
+            appendHeaderContents(file, pkgString, importsList);
             write(file, fileName, type, JavaDocType.IMPL_CLASS);
-        } else {
+        } else if ((type & INTERFACE_MASK) != 0) {
 
-            if ((type & INTERFACE_MASK) != 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);
-                    }
-                }
-                write(file, fileName, type, JavaDocType.INTERFACE);
-            } else if ((type & BUILDER_CLASS_MASK) != 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.BUILDER_CLASS);
+            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
+         */
+
+        if (importsList != null) {
+            insert(file, UtilConstants.NEW_LINE);
+            for (String imports : importsList) {
+                insert(file, imports);
             }
         }
     }
@@ -639,6 +490,7 @@
      * @throws IOException when fails to insert into file
      */
     public static void insert(File file, String data) throws IOException {
+
         try {
             FileSystemUtil.updateFileHandle(file, data, false);
         } catch (IOException e) {
@@ -653,6 +505,7 @@
      * @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) {
@@ -666,6 +519,7 @@
      * @param file file to be removed
      */
     public static void clean(File file) {
+
         if (file.exists()) {
             file.delete();
         }
@@ -678,6 +532,7 @@
      * @throws IOException when fails to delete the directory
      */
     public static void cleanTempFiles(File tempDir) throws IOException {
+
         FileUtils.deleteDirectory(tempDir);
     }
 }
