diff --git a/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index 3e58009..deef94e 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -39,8 +39,8 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
 import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
 import static org.apache.maven.plugins.annotations.LifecyclePhase.GENERATE_SOURCES;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
index c6b3bb7..0f64e2f 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
@@ -48,7 +48,7 @@
      * The class info will be used to set the attribute type and package info
      * will be use for qualified name.
      */
-    private JavaQualifiedTypeInfo importInfo;
+    private JavaQualifiedTypeInfoTranslator importInfo;
 
     /**
      * If conflict occurs.
@@ -69,9 +69,9 @@
     /**
      * Creates object of java attribute info.
      *
-     * @param attrType YANG type
-     * @param name attribute name
-     * @param isListAttr is list attribute
+     * @param attrType        YANG type
+     * @param name            attribute name
+     * @param isListAttr      is list attribute
      * @param isQualifiedName is qualified name
      */
     public JavaAttributeInfo(YangType<?> attrType, String name, boolean isListAttr, boolean isQualifiedName) {
@@ -139,7 +139,7 @@
      *
      * @param isList if the added attribute is a list of info
      */
-    public void setListAttr(boolean isList) {
+    private void setListAttr(boolean isList) {
         isListAttr = isList;
     }
 
@@ -159,9 +159,9 @@
      * manner.
      *
      * @param isQualified if the added attribute has to be accessed in a fully
-     * qualified manner
+     *                    qualified manner
      */
-    public void setIsQualifiedAccess(boolean isQualified) {
+    private void setIsQualifiedAccess(boolean isQualified) {
         isQualifiedName = isQualified;
     }
 
@@ -171,7 +171,7 @@
      *
      * @return import info
      */
-    public JavaQualifiedTypeInfo getImportInfo() {
+    public JavaQualifiedTypeInfoTranslator getImportInfo() {
         return importInfo;
     }
 
@@ -180,59 +180,60 @@
      *
      * @param importInfo import info for the attribute type
      */
-    public void setImportInfo(JavaQualifiedTypeInfo importInfo) {
+    public void setImportInfo(JavaQualifiedTypeInfoTranslator importInfo) {
         this.importInfo = importInfo;
     }
 
     /**
-     * Returns true if conflict between int and uint.
+     * Returns true if conflict between int and uInt.
      *
-     * @return true if conflict between int and uint
+     * @return true if conflict between int and uInt
      */
     public boolean isIntConflict() {
         return isIntConflict;
     }
 
     /**
-     * Sets true if conflict between int and uint.
+     * Sets true if conflict between int and uInt.
      *
-     * @param intConflict true if conflict between int and uint
+     * @param intConflict true if conflict between int and uInt
      */
-    public void setIntConflict(boolean intConflict) {
+    void setIntConflict(boolean intConflict) {
         isIntConflict = intConflict;
     }
 
     /**
-     * Returns true if conflict between long and ulong.
+     * Returns true if conflict between long and uLong.
      *
-     * @return true if conflict between long and ulong
+     * @return true if conflict between long and uLong
      */
     public boolean isLongConflict() {
         return isLongConflict;
     }
 
     /**
-     * Sets true if conflict between long and ulong.
+     * Sets true if conflict between long and uLong.
      *
-     * @param longConflict true if conflict between long and ulong
+     * @param longConflict true if conflict between long and uLong
      */
-    public void setLongConflict(boolean longConflict) {
+    void setLongConflict(boolean longConflict) {
         isLongConflict = longConflict;
     }
 
     /**
      * Returns java attribute info.
      *
-     * @param importInfo java qualified type info
-     * @param attributeName attribute name
-     * @param attributeType attribute type
+     * @param importInfo        java qualified type info
+     * @param attributeName     attribute name
+     * @param attributeType     attribute type
      * @param isQualifiedAccess is the attribute a qualified access
-     * @param isListAttribute is list attribute
+     * @param isListAttribute   is list attribute
      * @return java attribute info.
      */
-    public static JavaAttributeInfo getAttributeInfoForTheData(JavaQualifiedTypeInfo importInfo, String attributeName,
-            YangType<?> attributeType, boolean isQualifiedAccess,
-            boolean isListAttribute) {
+    public static JavaAttributeInfo getAttributeInfoForTheData(JavaQualifiedTypeInfoTranslator importInfo,
+                                                               String attributeName,
+                                                               YangType<?> attributeType, boolean isQualifiedAccess,
+                                                               boolean isListAttribute) {
 
         JavaAttributeInfo newAttr = new JavaAttributeInfo();
         newAttr.setImportInfo(importInfo);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGenerator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGenerator.java
index 1e0b14f..9993b9f 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGenerator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGenerator.java
@@ -17,7 +17,7 @@
 package org.onosproject.yangutils.translator.tojava;
 
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 /**
  * Abstraction of an entity which provides Code generator functionalities.
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index 79857eb..9c37bb8 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -20,9 +20,10 @@
 
 import org.onosproject.yangutils.datamodel.TraversalType;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.translator.exception.InvalidNodeForTranslatorException;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.datamodel.TraversalType.CHILD;
 import static org.onosproject.yangutils.datamodel.TraversalType.PARENT;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfo.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfo.java
deleted file mode 100644
index 1c37e06..0000000
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfo.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.yangutils.translator.tojava;
-
-import java.io.Serializable;
-
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
-
-/**
- * Represents cached java file handle, which supports the addition of member attributes and
- * methods.
- */
-public class JavaFileInfo implements Serializable {
-
-    private static final long serialVersionUID = 806102633L;
-
-    /**
-     * The type(s) of java source file(s) to be generated when the cached file
-     * handle is closed.
-     */
-    private transient int genFileTypes;
-
-    /**
-     * Name of the module.
-     */
-    private String javaName;
-
-    /**
-     * Java Package of the mapped java class.
-     */
-    private String pkg;
-
-    /**
-     * File generation directory path.
-     */
-    private String relativeFilePath;
-
-    /**
-     * File generation base directory path.
-     */
-    private String codeGenDirFilePath;
-
-    /**
-     * Plugin configuration for naming convention.
-     */
-    private transient YangPluginConfig pluginConfig;
-
-    /**
-     * Returns the types of files being generated corresponding to the YANG
-     * definition.
-     *
-     * @return the types of files being generated corresponding to the YANG
-     * definition
-     */
-    public int getGeneratedFileTypes() {
-        return genFileTypes;
-    }
-
-    /**
-     * Sets the types of files being generated corresponding to the YANG
-     * definition.
-     *
-     * @param fileTypes the types of files being generated corresponding to the
-     * YANG definition
-     */
-    public void setGeneratedFileTypes(int fileTypes) {
-        genFileTypes = fileTypes;
-    }
-
-    /**
-     * Adds the types of files being generated corresponding to the YANG
-     * definition.
-     *
-     * @param fileTypes the types of files being generated corresponding to the
-     * YANG definition
-     */
-    public void addGeneratedFileTypes(int fileTypes) {
-        genFileTypes |= fileTypes;
-    }
-
-    /**
-     * Returns the java name of the node.
-     *
-     * @return the java name of node
-     */
-    public String getJavaName() {
-        return javaName;
-    }
-
-    /**
-     * Sets the java name of the node.
-     *
-     * @param name the java name of node
-     */
-    public void setJavaName(String name) {
-        javaName = name;
-    }
-
-    /**
-     * Returns the mapped java package.
-     *
-     * @return the java package
-     */
-    public String getPackage() {
-        return pkg;
-    }
-
-    /**
-     * Sets the node's package.
-     *
-     * @param nodePackage node's package
-     */
-    public void setPackage(String nodePackage) {
-        pkg = nodePackage;
-    }
-
-    /**
-     * Sets directory package path for code generation.
-     *
-     * @param path directory package path for code generation
-     */
-    public void setPackageFilePath(String path) {
-        relativeFilePath = path;
-    }
-
-    /**
-     * Returns directory package path for code generation.
-     *
-     * @return directory package path for code generation
-     */
-    public String getPackageFilePath() {
-        return relativeFilePath;
-    }
-
-    /**
-     * Returns base directory package path for code generation.
-     *
-     * @return directory package path for code generation
-     */
-    public String getBaseCodeGenPath() {
-        return codeGenDirFilePath;
-    }
-
-    /**
-     * Sets base directory package path for code generation.
-     *
-     * @param path base directory path
-     */
-    public void setBaseCodeGenPath(String path) {
-        codeGenDirFilePath = path;
-    }
-
-    /**
-     * Returns plugin configurations.
-     *
-     * @return the pluginConfig
-     */
-    public YangPluginConfig getPluginConfig() {
-        return pluginConfig;
-    }
-
-    /**
-     * Sets plugin configurations.
-     *
-     * @param pluginConfig the pluginConfig to set
-     */
-    public void setPluginConfig(YangPluginConfig pluginConfig) {
-        this.pluginConfig = pluginConfig;
-    }
-}
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfoContainer.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfoContainer.java
index 485df77..0ab417a 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfoContainer.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaFileInfoContainer.java
@@ -15,6 +15,8 @@
  */
 package org.onosproject.yangutils.translator.tojava;
 
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+
 /**
  * Represents data model nodes which are required to generate java classes, need to support
  * java file info.
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
index abccc4c..c859b21 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
@@ -22,8 +22,7 @@
 
 import static org.onosproject.yangutils.utils.UtilConstants.ABSTRACT_EVENT;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_CLASS_IMPORT_CLASS;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_CLASS_IMPORT_PKG;
+import static org.onosproject.yangutils.utils.UtilConstants.BITSET;
 import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EVENT_LISTENER;
@@ -34,7 +33,6 @@
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_LANG;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_MATH;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
-import static org.onosproject.yangutils.utils.UtilConstants.BITSET;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.LIST;
 import static org.onosproject.yangutils.utils.UtilConstants.LISTENER_REG;
@@ -44,6 +42,8 @@
 import static org.onosproject.yangutils.utils.UtilConstants.ONOS_EVENT_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_CLASS_IMPORT_CLASS;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_CLASS_IMPORT_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_OP_PARAM_INFO_CLASS;
 import static java.util.Collections.sort;
 
@@ -61,13 +61,13 @@
      * Sorted set of import info, to be used to maintain the set of classes to
      * be imported in the generated class.
      */
-    private SortedSet<JavaQualifiedTypeInfo> importSet;
+    private SortedSet<JavaQualifiedTypeInfoTranslator> importSet;
 
     /**
      * Creates java import data object.
      */
     public JavaImportData() {
-        setImportSet(new TreeSet<JavaQualifiedTypeInfo>());
+        setImportSet(new TreeSet<>());
     }
 
     /**
@@ -75,7 +75,7 @@
      *
      * @return true if any of the attribute needs to be maintained as a list
      */
-    public boolean getIfListImported() {
+    private boolean getIfListImported() {
         return isListToImport;
     }
 
@@ -84,7 +84,7 @@
      *
      * @param isList status to mention list is bing imported
      */
-    public void setIfListImported(boolean isList) {
+    void setIfListImported(boolean isList) {
         isListToImport = isList;
     }
 
@@ -93,7 +93,7 @@
      *
      * @return the set containing the imported class/interface info
      */
-    public SortedSet<JavaQualifiedTypeInfo> getImportSet() {
+    public SortedSet<JavaQualifiedTypeInfoTranslator> getImportSet() {
         return importSet;
     }
 
@@ -102,14 +102,14 @@
      *
      * @param importSet the set containing the imported class/interface info
      */
-    private void setImportSet(SortedSet<JavaQualifiedTypeInfo> importSet) {
+    private void setImportSet(SortedSet<JavaQualifiedTypeInfoTranslator> importSet) {
         this.importSet = importSet;
     }
 
     /**
      * Adds an imported class/interface info if it is not already part of the
      * collection.
-     *
+     * <p>
      * If already part of the collection, check if the packages are same, if so
      * then return true, to denote it is already in the import collection, and
      * it can be accessed without qualified access. If the packages do not
@@ -122,8 +122,8 @@
      * @param classPkg      generated class package
      * @return qualified access status of the import node being added
      */
-    public boolean addImportInfo(JavaQualifiedTypeInfo newImportInfo,
-            String className, String classPkg) {
+    public boolean addImportInfo(JavaQualifiedTypeInfoTranslator newImportInfo,
+                                 String className, String classPkg) {
 
         if (newImportInfo.getClassInfo().contentEquals(className)) {
             /*
@@ -144,14 +144,14 @@
          * qualified access.
          */
         if (newImportInfo.getPkgInfo().contentEquals(classPkg)) {
-            /**
+            /*
              * Package of the referred attribute and the generated class is same, so no need import
              * or qualified access.
              */
             return false;
         }
 
-        for (JavaQualifiedTypeInfo curImportInfo : getImportSet()) {
+        for (JavaQualifiedTypeInfoTranslator curImportInfo : getImportSet()) {
             if (curImportInfo.getClassInfo()
                     .contentEquals(newImportInfo.getClassInfo())) {
                 return !curImportInfo.getPkgInfo()
@@ -176,7 +176,7 @@
         String importString;
         List<String> imports = new ArrayList<>();
 
-        for (JavaQualifiedTypeInfo importInfo : getImportSet()) {
+        for (JavaQualifiedTypeInfoTranslator importInfo : getImportSet()) {
             if (!importInfo.getPkgInfo().equals(EMPTY_STRING) && importInfo.getClassInfo() != null
                     && !importInfo.getPkgInfo().equals(JAVA_LANG)) {
                 importString = IMPORT + importInfo.getPkgInfo() + PERIOD + importInfo.getClassInfo() + SEMI_COLAN
@@ -199,7 +199,7 @@
      *
      * @return import for hash and equals method
      */
-    public String getImportForHashAndEquals() {
+    String getImportForHashAndEquals() {
         return IMPORT + JAVA_UTIL_OBJECTS_IMPORT_PKG + PERIOD + JAVA_UTIL_OBJECTS_IMPORT_CLASS;
     }
 
@@ -208,7 +208,7 @@
      *
      * @return import for to string method
      */
-    public String getImportForToString() {
+    String getImportForToString() {
         return IMPORT + GOOGLE_MORE_OBJECT_IMPORT_PKG + PERIOD + GOOGLE_MORE_OBJECT_IMPORT_CLASS;
     }
 
@@ -217,7 +217,7 @@
      *
      * @return import for to bitset method
      */
-    public String getImportForToBitSet() {
+    String getImportForToBitSet() {
         return IMPORT + JAVA_UTIL_OBJECTS_IMPORT_PKG + PERIOD + BITSET + SEMI_COLAN + NEW_LINE;
     }
 
@@ -226,7 +226,7 @@
      *
      * @return import for list attribute
      */
-    public String getImportForList() {
+    private String getImportForList() {
         return IMPORT + COLLECTION_IMPORTS + PERIOD + LIST + SEMI_COLAN + NEW_LINE;
     }
 
@@ -253,7 +253,7 @@
      *
      * @return import string for AbstractEvent class
      */
-    public String getAbstractEventsImport() {
+    String getAbstractEventsImport() {
         return IMPORT + ONOS_EVENT_PKG + PERIOD + ABSTRACT_EVENT + SEMI_COLAN + NEW_LINE;
     }
 
@@ -262,7 +262,7 @@
      *
      * @return import string for EventListener class
      */
-    public String getEventListenerImport() {
+    String getEventListenerImport() {
         return IMPORT + ONOS_EVENT_PKG + PERIOD + EVENT_LISTENER + SEMI_COLAN + NEW_LINE;
     }
 
@@ -271,7 +271,7 @@
      *
      * @return import string for map class
      */
-    public String getMapImport() {
+    String getMapImport() {
         return IMPORT + COLLECTION_IMPORTS + PERIOD + MAP + SEMI_COLAN + NEW_LINE;
     }
 
@@ -280,7 +280,7 @@
      *
      * @return import string for hash map class
      */
-    public String getHashMapImport() {
+    String getHashMapImport() {
         return IMPORT + COLLECTION_IMPORTS + PERIOD + HASH_MAP + SEMI_COLAN + NEW_LINE;
     }
 
@@ -289,7 +289,7 @@
      *
      * @return import string for hash map class
      */
-    public String getYangAugmentedInfoImport() {
+    String getYangAugmentedInfoImport() {
         return IMPORT + YANG_AUGMENTED_INFO_CLASS_IMPORT_PKG + PERIOD + YANG_AUGMENTED_INFO_CLASS_IMPORT_CLASS;
     }
 
@@ -298,7 +298,7 @@
      *
      * @return import string for YangAugmentedOpParamInfo class
      */
-    public String getYangAugmentedOpParamInfoImport() {
+    String getYangAugmentedOpParamInfoImport() {
         return IMPORT + YANG_AUGMENTED_INFO_CLASS_IMPORT_PKG + PERIOD +
                 YANG_AUGMENTED_OP_PARAM_INFO_CLASS;
     }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportDataContainer.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportDataContainer.java
deleted file mode 100644
index e86b468..0000000
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportDataContainer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.yangutils.translator.tojava;
-
-/**
- * Represents the information of the java import data.
- */
-public interface JavaImportDataContainer {
-
-    /**
-     * Returns the data of java imports to be included in generated file.
-     *
-     * @return data of java imports to be included in generated file
-     */
-    JavaImportData getJavaImportData();
-
-    /**
-     * Sets the data of java imports to be included in generated file.
-     *
-     * @param javaImportData data of java imports to be included in generated
-     *            file
-     */
-    void setJavaImportData(JavaImportData javaImportData);
-}
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoContainer.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoContainer.java
index c6570c6..7791773 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoContainer.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoContainer.java
@@ -25,12 +25,12 @@
      *
      * @return java qualified type details
      */
-    JavaQualifiedTypeInfo getJavaQualifiedInfo();
+    JavaQualifiedTypeInfoTranslator getJavaQualifiedInfo();
 
     /**
      * Assign the qualified type info.
      *
      * @param typeInfo qualified type information
      */
-    void setJavaQualifiedInfo(JavaQualifiedTypeInfo typeInfo);
+    void setJavaQualifiedInfo(JavaQualifiedTypeInfoTranslator typeInfo);
 }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
similarity index 82%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
index c7d4583..f2b8198 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfo.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
@@ -20,10 +20,11 @@
 import java.util.Objects;
 
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
 import org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
 
 import com.google.common.base.MoreObjects;
 
@@ -33,25 +34,15 @@
 /**
  * Represents the information about individual imports in the generated file.
  */
-public class JavaQualifiedTypeInfo
-        implements Comparable<JavaQualifiedTypeInfo>, Serializable {
+public class JavaQualifiedTypeInfoTranslator extends JavaQualifiedTypeInfo
+        implements Comparable<JavaQualifiedTypeInfoTranslator>, Serializable {
 
     private static final long serialVersionUID = 806201634L;
 
     /**
-     * Package location where the imported class/interface is defined.
-     */
-    private String pkgInfo;
-
-    /**
-     * Class/interface being referenced.
-     */
-    private String classInfo;
-
-    /**
      * Creates a java qualified type info object.
      */
-    public JavaQualifiedTypeInfo() {
+    public JavaQualifiedTypeInfoTranslator() {
     }
 
     /**
@@ -97,7 +88,7 @@
      */
     public static void updateLeavesJavaQualifiedInfo(JavaLeafInfoContainer leaf) {
 
-        JavaQualifiedTypeInfo importInfo = leaf.getJavaQualifiedInfo();
+        JavaQualifiedTypeInfoTranslator importInfo = leaf.getJavaQualifiedInfo();
 
         if (leaf.getDataType() == null) {
             throw new TranslatorException("missing data type of leaf " + leaf.getName());
@@ -144,10 +135,10 @@
      *                      import info for child class
      * @return return the import info for this attribute
      */
-    public static JavaQualifiedTypeInfo getQualifiedTypeInfoOfCurNode(YangNode curNode,
-            String attributeName) {
+    public static JavaQualifiedTypeInfoTranslator getQualifiedTypeInfoOfCurNode(YangNode curNode,
+                                                                                String attributeName) {
 
-        JavaQualifiedTypeInfo importInfo = new JavaQualifiedTypeInfo();
+        JavaQualifiedTypeInfoTranslator importInfo = new JavaQualifiedTypeInfoTranslator();
 
         if (!(curNode instanceof JavaFileInfoContainer)) {
             throw new TranslatorException("missing java file information to get the package details "
@@ -168,14 +159,14 @@
      * @param conflictResolver      plugin configurations
      * @return return the import info for this attribute
      */
-    public static JavaQualifiedTypeInfo getQualifiedInfoOfFromString(JavaAttributeInfo referredTypesAttrInfo,
-            YangToJavaNamingConflictUtil conflictResolver) {
+    static JavaQualifiedTypeInfoTranslator getQualifiedInfoOfFromString(JavaAttributeInfo referredTypesAttrInfo,
+                                                                        YangToJavaNamingConflictUtil conflictResolver) {
 
         /*
          * Get the java qualified type information for the wrapper classes and
          * set it in new java attribute information.
          */
-        JavaQualifiedTypeInfo qualifiedInfoOfFromString = new JavaQualifiedTypeInfo();
+        JavaQualifiedTypeInfoTranslator qualifiedInfoOfFromString = new JavaQualifiedTypeInfoTranslator();
 
         qualifiedInfoOfFromString.setClassInfo(
                 getJavaImportClass(referredTypesAttrInfo.getAttributeType(), true, conflictResolver));
@@ -195,8 +186,8 @@
         if (this == obj) {
             return true;
         }
-        if (obj instanceof JavaQualifiedTypeInfo) {
-            JavaQualifiedTypeInfo other = (JavaQualifiedTypeInfo) obj;
+        if (obj instanceof JavaQualifiedTypeInfoTranslator) {
+            JavaQualifiedTypeInfoTranslator other = (JavaQualifiedTypeInfoTranslator) obj;
             return Objects.equals(pkgInfo, other.pkgInfo) &&
                     Objects.equals(classInfo, other.classInfo);
         }
@@ -209,7 +200,7 @@
      * @param importInfo matched import
      * @return if equal or not
      */
-    public boolean exactMatch(JavaQualifiedTypeInfo importInfo) {
+    public boolean exactMatch(JavaQualifiedTypeInfoTranslator importInfo) {
         return equals(importInfo)
                 && Objects.equals(pkgInfo, importInfo.getPkgInfo())
                 && Objects.equals(classInfo, importInfo.getClassInfo());
@@ -228,7 +219,7 @@
      * @param other compared import info.
      */
     @Override
-    public int compareTo(JavaQualifiedTypeInfo other) {
+    public int compareTo(JavaQualifiedTypeInfoTranslator other) {
         return getClassInfo().compareTo(other.getClassInfo());
     }
 
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java
index a70f579..347877e 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java
@@ -19,7 +19,8 @@
 import java.io.File;
 import java.io.IOException;
 
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_IMPL_MASK;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getConstructor;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java
index 90b2daf..3a284bd 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaCodeFragmentFiles.java
@@ -20,8 +20,9 @@
 
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangTypeHolder;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
@@ -106,7 +107,7 @@
      *
      * @param beanTempFiles temp file handle for bean file generation
      */
-    public void setBeanTempFiles(TempJavaBeanFragmentFiles beanTempFiles) {
+    private void setBeanTempFiles(TempJavaBeanFragmentFiles beanTempFiles) {
         this.beanTempFiles = beanTempFiles;
     }
 
@@ -124,7 +125,7 @@
      *
      * @param typeTempFiles temp file handle for data type file generation
      */
-    public void setTypeTempFiles(TempJavaTypeFragmentFiles typeTempFiles) {
+    private void setTypeTempFiles(TempJavaTypeFragmentFiles typeTempFiles) {
         this.typeTempFiles = typeTempFiles;
     }
 
@@ -142,7 +143,7 @@
      *
      * @param serviceTempFiles temp file handle for service file generation
      */
-    public void setServiceTempFiles(TempJavaServiceFragmentFiles serviceTempFiles) {
+    private void setServiceTempFiles(TempJavaServiceFragmentFiles serviceTempFiles) {
         this.serviceTempFiles = serviceTempFiles;
     }
 
@@ -160,7 +161,7 @@
      *
      * @param enumerationTempFiles temp file handle for enumeration file generation
      */
-    public void setEnumerationTempFiles(
+    private void setEnumerationTempFiles(
             TempJavaEnumerationFragmentFiles enumerationTempFiles) {
         this.enumerationTempFiles = enumerationTempFiles;
     }
@@ -179,7 +180,7 @@
      *
      * @param tempJavaEventFragmentFiles temp file handle for event file generation
      */
-    public void setEventFragmentFiles(TempJavaEventFragmentFiles tempJavaEventFragmentFiles) {
+    private void setEventFragmentFiles(TempJavaEventFragmentFiles tempJavaEventFragmentFiles) {
         this.tempJavaEventFragmentFiles = tempJavaEventFragmentFiles;
     }
 
@@ -212,7 +213,7 @@
             getServiceTempFiles().generateJavaFile(GENERATE_SERVICE_AND_MANAGER, curNode);
         }
 
-        /**
+        /*
          * Creates event, event listener and event subject files.
          */
         if (fileType == GENERATE_ALL_EVENT_CLASS_MASK) {
@@ -220,7 +221,7 @@
         }
 
         /*
-         * Creats enumeration class file.
+         * Creates enumeration class file.
          */
         if (fileType == GENERATE_ENUM_CLASS) {
             getEnumerationTempFiles().generateJavaFile(GENERATE_ENUM_CLASS, curNode);
@@ -228,40 +229,14 @@
     }
 
     /**
-     * Adds the new attribute info to the target generated temporary files.
-     *
-     * @param newAttrInfo the attribute info that needs to be added to temporary
-     * files
-     * @param pluginConfig plugin configurations
-     * @throws IOException IO operation fail
-     */
-    public void addJavaSnippetInfoToApplicableTempFiles(JavaAttributeInfo newAttrInfo,
-            YangPluginConfig pluginConfig)
-            throws IOException {
-
-        if (getBeanTempFiles() != null) {
-            getBeanTempFiles()
-                    .addJavaSnippetInfoToApplicableTempFiles(newAttrInfo, pluginConfig);
-        }
-
-        /**
-         * Creates user defined data type class file.
-         */
-        if (getTypeTempFiles() != null) {
-            getTypeTempFiles()
-                    .addJavaSnippetInfoToApplicableTempFiles(newAttrInfo, pluginConfig);
-        }
-    }
-
-    /**
      * Add all the type in the current data model node as part of the
      * generated temporary file.
      *
      * @param yangTypeHolder YANG java data model node which has type info, eg union / typedef
-     * @param pluginConfig plugin configurations for naming convention
+     * @param pluginConfig   plugin configurations for naming convention
      * @throws IOException IO operation fail
      */
-    public void addTypeInfoToTempFiles(YangTypeHolder yangTypeHolder, YangPluginConfig pluginConfig)
+    void addTypeInfoToTempFiles(YangTypeHolder yangTypeHolder, YangPluginConfig pluginConfig)
             throws IOException {
         getTypeTempFiles()
                 .addTypeInfoToTempFiles(yangTypeHolder, pluginConfig);
@@ -285,8 +260,8 @@
     /**
      * Adds default constructor for class.
      *
-     * @param modifier modifier for constructor.
-     * @param toAppend string which need to be appended with the class name
+     * @param modifier     modifier for constructor.
+     * @param toAppend     string which need to be appended with the class name
      * @param pluginConfig plugin configurations
      * @return default constructor for class
      * @throws IOException when fails to append to file
@@ -324,10 +299,10 @@
      * Removes all temporary file handles.
      *
      * @param isErrorOccurred when translator fails to generate java files we need to close
-     * all open file handles include temporary files and java files.
+     *                        all open file handles include temporary files and java files.
      * @throws IOException when failed to delete the temporary files
      */
-    public void freeTemporaryResources(boolean isErrorOccurred)
+    void freeTemporaryResources(boolean isErrorOccurred)
             throws IOException {
 
         if (getBeanTempFiles() != null) {
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java
index 087788d..fe1578a 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEnumerationFragmentFiles.java
@@ -22,13 +22,14 @@
 import java.util.List;
 import java.util.Map;
 
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.datamodel.YangEnum;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaType;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeTranslator;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ENUM_IMPL_MASK;
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
@@ -225,7 +226,7 @@
      * @return java attribute
      */
     public JavaAttributeInfo getJavaAttributeForEnum(YangPluginConfig pluginConfig) {
-        YangJavaType<?> javaType = new YangJavaType<>();
+        YangJavaTypeTranslator<?> javaType = new YangJavaTypeTranslator<>();
         javaType.setDataType(YangDataTypes.INT32);
         javaType.setDataTypeName("int");
         javaType.updateJavaQualifiedInfo(pluginConfig.getConflictResolver());
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEventFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEventFragmentFiles.java
index f225f06..01587b7 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEventFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaEventFragmentFiles.java
@@ -22,9 +22,10 @@
 import java.util.List;
 
 import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGrouping;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGroupingTranslator;
 import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_SUBJECT_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_ENUM_MASK;
@@ -33,7 +34,7 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_GETTER_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_SETTER_MASK;
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateEventFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateEventListenerFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateEventSubjectFile;
@@ -319,7 +320,7 @@
 
         //Creates event interface file.
         setEventSubjectJavaFileHandle(getJavaFileHandle(curNode, curNodeInfo +
-                TempJavaEventFragmentFiles.EVENT_SUBJECT_NAME_SUFFIX));
+                EVENT_SUBJECT_NAME_SUFFIX));
         generateEventSubjectFile(getEventSubjectJavaFileHandle(), curNode);
 
     }
@@ -428,7 +429,7 @@
                 pluginConfig.getConflictResolver()));
         String notificationName = curNode.getName();
 
-        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
+        JavaQualifiedTypeInfoTranslator qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
                 getCapitalCase(currentInfo));
 
         JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData(qualifiedTypeInfo, getSmallCase(currentInfo),
@@ -492,7 +493,7 @@
         YangNode childNode = curNode.getChild();
 
         // Skip grouping, as it wont have the package name.
-        while (childNode instanceof YangJavaGrouping) {
+        while (childNode instanceof YangJavaGroupingTranslator) {
             childNode = childNode.getNextSibling();
         }
         JavaFileInfo childInfo = ((JavaFileInfoContainer) childNode).getJavaFileInfo();
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index 982f7c3..480c321 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -28,13 +28,14 @@
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangSubModule;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGrouping;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGroupingTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModuleTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModuleTranslator;
 import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
@@ -56,8 +57,8 @@
 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.JavaAttributeInfo.getAttributeInfoForTheData;
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedInfoOfFromString;
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedInfoOfFromString;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
 import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.updateJavaFileInfo;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefination;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaClassDefClose;
@@ -240,7 +241,7 @@
     /**
      * Java file handle for builder op param class file.
      */
-    private File builderOpParmClassJavaFileHandle;
+    private File builderOpParamClassJavaFileHandle;
 
     /**
      * Java file handle for impl class file.
@@ -300,7 +301,7 @@
     /**
      * Import info for case.
      */
-    private JavaQualifiedTypeInfo caseImportInfo;
+    private JavaQualifiedTypeInfoTranslator caseImportInfo;
 
     /**
      * Is attribute added.
@@ -446,7 +447,7 @@
             throw new TranslatorException("missing parent node to contain current node info in generated file");
         }
 
-        if (parent instanceof YangJavaGrouping) {
+        if (parent instanceof YangJavaGroupingTranslator) {
             /*
              * In case of grouping, there is no need to add the information, it
              * will be taken care in uses
@@ -484,7 +485,7 @@
          * Get the import info corresponding to the attribute for import in
          * generated java files or qualified access
          */
-        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
+        JavaQualifiedTypeInfoTranslator qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
                 getCapitalCase(curNodeName));
         if (!(targetNode instanceof TempJavaCodeFragmentFilesContainer)) {
             throw new TranslatorException("Parent node does not have file info");
@@ -493,7 +494,7 @@
         JavaFileInfo fileInfo = ((JavaFileInfoContainer) targetNode).getJavaFileInfo();
 
         boolean isQualified;
-        if ((targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule)
+        if ((targetNode instanceof YangJavaModuleTranslator || targetNode instanceof YangJavaSubModuleTranslator)
                 && (qualifiedTypeInfo.getClassInfo().contentEquals(SERVICE)
                 || qualifiedTypeInfo.getClassInfo().contentEquals(COMPONENT)
                 || qualifiedTypeInfo.getClassInfo().contentEquals(getCapitalCase(ACTIVATE))
@@ -506,7 +507,7 @@
             isQualified = true;
         } else {
             String className;
-            if (targetNode instanceof YangJavaModule || targetNode instanceof YangJavaSubModule) {
+            if (targetNode instanceof YangJavaModuleTranslator || targetNode instanceof YangJavaSubModuleTranslator) {
                 className = getCapitalCase(fileInfo.getJavaName()) + "Service";
             } else {
                 className = getCapitalCase(fileInfo.getJavaName());
@@ -599,17 +600,17 @@
      *
      * @return op param builder temporary file handle
      */
-    private File getBuilderOpParmClassJavaFileHandle() {
-        return builderOpParmClassJavaFileHandle;
+    private File getBuilderOpParamClassJavaFileHandle() {
+        return builderOpParamClassJavaFileHandle;
     }
 
     /**
      * Sets the java file handle for op param builder class.
      *
-     * @param builderOpParmClassJavaFileHandle java file handle
+     * @param builderOpParamClassJavaFileHandle java file handle
      */
-    private void setBuilderOpParmClassJavaFileHandle(File builderOpParmClassJavaFileHandle) {
-        this.builderOpParmClassJavaFileHandle = builderOpParmClassJavaFileHandle;
+    private void setBuilderOpParamClassJavaFileHandle(File builderOpParamClassJavaFileHandle) {
+        this.builderOpParamClassJavaFileHandle = builderOpParamClassJavaFileHandle;
     }
 
     /**
@@ -1170,11 +1171,17 @@
         String path = getTempDirPath(getAbsoluteDirPath());
         File dir = new File(path);
         if (!dir.exists()) {
-            dir.mkdirs();
+            boolean isCreated = dir.mkdirs();
+            if (!isCreated) {
+                throw new IOException("failed to create temporary directory for " + fileName);
+            }
         }
         File file = new File(path + fileName + TEMP_FILE_EXTENSION);
         if (!file.exists()) {
-            file.createNewFile();
+            boolean isCreated = file.createNewFile();
+            if (!isCreated) {
+                throw new IOException("failed to create temporary files for " + fileName);
+            }
         } else {
             throw new IOException(fileName + " is reused due to YANG naming");
         }
@@ -1273,7 +1280,7 @@
      * @param pluginConfig plugin configurations
      */
     void addParentInfoInCurNodeTempFile(YangNode curNode, YangPluginConfig pluginConfig) {
-        caseImportInfo = new JavaQualifiedTypeInfo();
+        caseImportInfo = new JavaQualifiedTypeInfoTranslator();
         YangNode parent = getParentNodeInGenCode(curNode);
         if (!(parent instanceof JavaCodeGenerator)) {
             throw new TranslatorException("missing parent node to contain current node info in generated file");
@@ -1358,7 +1365,7 @@
      * @throws IOException IO operation fail
      */
     void addCurNodeLeavesInfoToTempFiles(YangNode curNode,
-                                                YangPluginConfig yangPluginConfig)
+                                         YangPluginConfig yangPluginConfig)
             throws IOException {
         if (!(curNode instanceof YangLeavesHolder)) {
             throw new TranslatorException("Data model node does not have any leaves");
@@ -1411,7 +1418,7 @@
             }
 
             if ((getGeneratedTempFiles() & FROM_STRING_IMPL_MASK) != 0) {
-                JavaQualifiedTypeInfo qualifiedInfoOfFromString = getQualifiedInfoOfFromString(newAttrInfo,
+                JavaQualifiedTypeInfoTranslator qualifiedInfoOfFromString = getQualifiedInfoOfFromString(newAttrInfo,
                         pluginConfig.getConflictResolver());
             /*
              * Create a new java attribute info with qualified information of
@@ -1570,7 +1577,7 @@
                 if (curNode instanceof YangAugmentableNode) {
                     addYangAugmentedOpParamInfoImport(imports);
                 }
-                JavaQualifiedTypeInfo qualifiedTypeInfo = new JavaQualifiedTypeInfo();
+                JavaQualifiedTypeInfoTranslator qualifiedTypeInfo = new JavaQualifiedTypeInfoTranslator();
                 qualifiedTypeInfo.setClassInfo(getCapitalCase(DEFAULT) + getCapitalCase(getJavaFileInfo()
                         .getJavaName()));
                 qualifiedTypeInfo.setPkgInfo(getJavaFileInfo().getPackage());
@@ -1592,14 +1599,14 @@
                  * Create builder class file.
                  */
                 if ((fileType & BUILDER_CLASS_MASK) != 0) {
-                    setBuilderOpParmClassJavaFileHandle(getJavaFileHandle(getOpParamBuilderImplClassName()));
-                    setBuilderOpParmClassJavaFileHandle(
-                            generateOpParamBuilderClassFile(getBuilderOpParmClassJavaFileHandle(), curNode,
+                    setBuilderOpParamClassJavaFileHandle(getJavaFileHandle(getOpParamBuilderImplClassName()));
+                    setBuilderOpParamClassJavaFileHandle(
+                            generateOpParamBuilderClassFile(getBuilderOpParamClassJavaFileHandle(), curNode,
                                     isAttributePresent()));
                     /*
                      * Append impl class to builder class and close it.
                      */
-                    mergeJavaFiles(getBuilderOpParmClassJavaFileHandle(), getOpParamClassJavaFileHandle());
+                    mergeJavaFiles(getBuilderOpParamClassJavaFileHandle(), getOpParamClassJavaFileHandle());
                     validateLineLength(getOpParamClassJavaFileHandle());
 
                     addBitSetImport(imports, false);
@@ -1689,7 +1696,7 @@
      */
     private void removeAugmentedInfoImport(List<String> imports) {
         imports.remove(getJavaImportData().getYangAugmentedInfoImport());
-        for (JavaQualifiedTypeInfo type : getJavaImportData().getImportSet()) {
+        for (JavaQualifiedTypeInfoTranslator type : getJavaImportData().getImportSet()) {
             if (type.getClassInfo().equals(YANG_AUGMENTED_INFO)) {
                 getJavaImportData().getImportSet().remove(type);
                 getJavaExtendsListHolder().getExtendsList().remove(type);
@@ -1715,7 +1722,7 @@
             closeFile(getBuilderClassJavaFileHandle(), true);
         }
         if ((getGeneratedJavaFiles() & OPERATION_BUILDER_CLASS_MASK) != 0) {
-            closeFile(getBuilderOpParmClassJavaFileHandle(), true);
+            closeFile(getBuilderOpParamClassJavaFileHandle(), true);
         }
         if ((getGeneratedJavaFiles() & BUILDER_INTERFACE_MASK) != 0) {
             closeFile(getBuilderInterfaceJavaFileHandle(), true);
@@ -1755,7 +1762,7 @@
      * @return status of the qualified access to the attribute
      */
     boolean getIsQualifiedAccessOrAddToImportList(
-            JavaQualifiedTypeInfo importInfo) {
+            JavaQualifiedTypeInfoTranslator importInfo) {
 
         return getJavaImportData().addImportInfo(importInfo, getGeneratedJavaClassName(),
                 getJavaFileInfo().getPackage());
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
index bae2df5..98221f1 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
@@ -21,10 +21,11 @@
 import java.util.List;
 
 import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModuleTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModuleTranslator;
 import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.RPC_IMPL_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.RPC_INTERFACE_MASK;
@@ -213,12 +214,12 @@
                 .getJavaImportData().getImports();
         createPackage(curNode);
         boolean isNotification = false;
-        if (curNode instanceof YangJavaModule) {
-            if (!((YangJavaModule) curNode).getNotificationNodes().isEmpty()) {
+        if (curNode instanceof YangJavaModuleTranslator) {
+            if (!((YangJavaModuleTranslator) curNode).getNotificationNodes().isEmpty()) {
                 isNotification = true;
             }
-        } else if (curNode instanceof YangJavaSubModule) {
-            if (!((YangJavaSubModule) curNode).getNotificationNodes().isEmpty()) {
+        } else if (curNode instanceof YangJavaSubModuleTranslator) {
+            if (!((YangJavaSubModuleTranslator) curNode).getNotificationNodes().isEmpty()) {
                 isNotification = true;
             }
         }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
index 8e05be5..13da55c 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
@@ -24,10 +24,11 @@
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangTypeHolder;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaType;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeTranslator;
 
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32;
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT64;
@@ -39,7 +40,7 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.OF_STRING_IMPL_MASK;
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedInfoOfFromString;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedInfoOfFromString;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateTypeDefClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateUnionClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
@@ -250,7 +251,7 @@
         List<YangType<?>> typeList = yangTypeHolder.getTypeList();
         if (typeList != null) {
             for (YangType<?> yangType : typeList) {
-                if (!(yangType instanceof YangJavaType)) {
+                if (!(yangType instanceof YangJavaTypeTranslator)) {
                     throw new TranslatorException("Type does not have Java info");
                 }
                 JavaAttributeInfo javaAttributeInfo = getAttributeForType(yangType, pluginConfig);
@@ -270,7 +271,7 @@
      * @return java attribute
      */
     private JavaAttributeInfo getAttributeForType(YangType yangType, YangPluginConfig pluginConfig) {
-        YangJavaType<?> javaType = (YangJavaType<?>) yangType;
+        YangJavaTypeTranslator<?> javaType = (YangJavaTypeTranslator<?>) yangType;
         javaType.updateJavaQualifiedInfo(pluginConfig.getConflictResolver());
         String typeName = javaType.getDataTypeName();
         typeName = getCamelCase(typeName, pluginConfig.getConflictResolver());
@@ -317,11 +318,11 @@
     }
 
     /**
-     * Adds of method and constructor when there is no conflictiing types.
+     * Adds of method and constructor when there is no conflicting types.
      *
      * @param javaAttributeInfo java attribute info
      * @param pluginConfig      plugin configurations
-     * @throws IOException when fails to do IO opearions
+     * @throws IOException when fails to do IO operations
      */
     private void addMethodsWhenNoConflictingTypes(JavaAttributeInfo javaAttributeInfo,
                                                   YangPluginConfig pluginConfig) throws IOException {
@@ -394,7 +395,7 @@
      */
     private void addFromStringMethod(JavaAttributeInfo newAttrInfo, YangPluginConfig pluginConfig) throws IOException {
 
-        JavaQualifiedTypeInfo qualifiedInfoOfFromString = getQualifiedInfoOfFromString(newAttrInfo,
+        JavaQualifiedTypeInfoTranslator qualifiedInfoOfFromString = getQualifiedInfoOfFromString(newAttrInfo,
                 pluginConfig.getConflictResolver());
             /*
              * Create a new java attribute info with qualified information of
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TraversalType.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TraversalType.java
index dd7db35..35f529a 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TraversalType.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TraversalType.java
@@ -34,7 +34,7 @@
     /**
      * Sibling node traversal.
      */
-    SIBILING,
+    SIBLING,
 
     /**
      * Parent node traversal.
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangDataModelFactory.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangDataModelFactory.java
index 9ba4068..77fb569 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangDataModelFactory.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangDataModelFactory.java
@@ -36,26 +36,26 @@
 import org.onosproject.yangutils.datamodel.YangUses;
 import org.onosproject.yangutils.datamodel.utils.GeneratedLanguage;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugment;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaCase;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaChoice;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaContainer;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaEnumeration;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGrouping;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaIdentity;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaInput;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaLeaf;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaLeafList;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaList;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaNotification;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaOutput;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaRpc;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaType;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeDef;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUnion;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUses;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugmentTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaCaseTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaChoiceTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaContainerTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaEnumerationTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGroupingTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaIdentityTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaInputTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaLeafTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaLeafListTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaListTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModuleTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaNotificationTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaOutputTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaRpcTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModuleTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaTypeDefTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUnionTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaUsesTranslator;
 
 /**
  * Represents factory to create data model objects based on the target file type.
@@ -78,7 +78,7 @@
     public static YangModule getYangModuleNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaModule();
+                return new YangJavaModuleTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -96,7 +96,7 @@
     public static YangAugment getYangAugmentNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaAugment();
+                return new YangJavaAugmentTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -114,7 +114,7 @@
     public static YangCase getYangCaseNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaCase();
+                return new YangJavaCaseTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -132,7 +132,7 @@
     public static YangChoice getYangChoiceNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaChoice();
+                return new YangJavaChoiceTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -150,7 +150,7 @@
     public static YangContainer getYangContainerNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaContainer();
+                return new YangJavaContainerTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -168,7 +168,7 @@
     public static YangIdentity getYangIdentityNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaIdentity();
+                return new YangJavaIdentityTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -186,7 +186,7 @@
     public static YangGrouping getYangGroupingNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaGrouping();
+                return new YangJavaGroupingTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -204,7 +204,7 @@
     public static YangList getYangListNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaList();
+                return new YangJavaListTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -222,7 +222,7 @@
     public static YangSubModule getYangSubModuleNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaSubModule();
+                return new YangJavaSubModuleTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -240,7 +240,7 @@
     public static YangTypeDef getYangTypeDefNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaTypeDef();
+                return new YangJavaTypeDefTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -258,7 +258,7 @@
     public static YangUnion getYangUnionNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaUnion();
+                return new YangJavaUnionTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -276,7 +276,7 @@
     public static YangUses getYangUsesNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaUses();
+                return new YangJavaUsesTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -294,7 +294,7 @@
     public static YangNotification getYangNotificationNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaNotification();
+                return new YangJavaNotificationTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -312,7 +312,7 @@
     public static YangLeaf getYangLeaf(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaLeaf();
+                return new YangJavaLeafTranslator();
             }
             default: {
                 throw new RuntimeException("Only YANG to Java is supported.");
@@ -330,7 +330,7 @@
     public static YangLeafList getYangLeafList(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaLeafList();
+                return new YangJavaLeafListTranslator();
             }
             default: {
                 throw new RuntimeException("Only YANG to Java is supported.");
@@ -348,7 +348,7 @@
     public static YangRpc getYangRpcNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaRpc();
+                return new YangJavaRpcTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -366,7 +366,7 @@
     public static YangInput getYangInputNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaInput();
+                return new YangJavaInputTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -384,7 +384,7 @@
     public static YangOutput getYangOutputNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaOutput();
+                return new YangJavaOutputTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -399,10 +399,10 @@
      * generated
      * @return the corresponding inherited node based on the target language
      */
-    public static YangJavaEnumeration getYangEnumerationNode(GeneratedLanguage targetLanguage) {
+    public static YangJavaEnumerationTranslator getYangEnumerationNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaEnumeration();
+                return new YangJavaEnumerationTranslator();
             }
             default: {
                 throw new TranslatorException("Only YANG to Java is supported.");
@@ -419,7 +419,7 @@
     public static YangType getYangType(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
-                return new YangJavaType();
+                return new YangJavaTypeTranslator();
             }
             default: {
                 throw new RuntimeException("Only YANG to Java is supported.");
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
index 3489eea..7739e52 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
@@ -26,19 +26,18 @@
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
-import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
-import org.onosproject.yangutils.datamodel.YangSubModule;
 import org.onosproject.yangutils.datamodel.YangTranslatorOperatorNode;
 import org.onosproject.yangutils.datamodel.YangTypeHolder;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.datamodel.utils.DataModelUtils;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugment;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaEnumeration;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugmentTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaEnumerationTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModuleTranslator;
+import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModuleTranslator;
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.isRpcChildNodePresent;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
@@ -74,9 +73,9 @@
     public static void updatePackageInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
                                          YangPluginConfig yangPluginConfig)
             throws IOException {
-        if (javaCodeGeneratorInfo instanceof YangJavaAugment) {
+        if (javaCodeGeneratorInfo instanceof YangJavaAugmentTranslator) {
             javaCodeGeneratorInfo.getJavaFileInfo()
-                    .setJavaName(getAugmentClassName((YangJavaAugment) javaCodeGeneratorInfo,
+                    .setJavaName(getAugmentClassName((YangJavaAugmentTranslator) javaCodeGeneratorInfo,
                             yangPluginConfig));
         } else {
             javaCodeGeneratorInfo.getJavaFileInfo()
@@ -137,13 +136,13 @@
             javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
                     .getServiceTempFiles().addCurNodeLeavesInfoToTempFiles(
                     (YangNode) javaCodeGeneratorInfo, yangPluginConfig);
-            if (javaCodeGeneratorInfo instanceof YangJavaModule) {
-                if (!((YangJavaModule) javaCodeGeneratorInfo).getNotificationNodes().isEmpty()) {
-                    updateNotificaitonNodeInfo(javaCodeGeneratorInfo, yangPluginConfig);
+            if (javaCodeGeneratorInfo instanceof YangJavaModuleTranslator) {
+                if (!((YangJavaModuleTranslator) javaCodeGeneratorInfo).getNotificationNodes().isEmpty()) {
+                    updateNotificationNodeInfo(javaCodeGeneratorInfo, yangPluginConfig);
                 }
-            } else if (javaCodeGeneratorInfo instanceof YangJavaSubModule) {
-                if (!((YangJavaSubModule) javaCodeGeneratorInfo).getNotificationNodes().isEmpty()) {
-                    updateNotificaitonNodeInfo(javaCodeGeneratorInfo, yangPluginConfig);
+            } else if (javaCodeGeneratorInfo instanceof YangJavaSubModuleTranslator) {
+                if (!((YangJavaSubModuleTranslator) javaCodeGeneratorInfo).getNotificationNodes().isEmpty()) {
+                    updateNotificationNodeInfo(javaCodeGeneratorInfo, yangPluginConfig);
                 }
             }
 
@@ -168,7 +167,7 @@
              */
             javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
                     .addTypeInfoToTempFiles((YangTypeHolder) javaCodeGeneratorInfo, yangPluginConfig);
-        } else if (javaCodeGeneratorInfo instanceof YangJavaEnumeration) {
+        } else if (javaCodeGeneratorInfo instanceof YangJavaEnumerationTranslator) {
             /*
              * Enumeration
              */
@@ -207,22 +206,22 @@
      * @param yangPluginConfig      plugin configurations
      * @throws IOException when fails to do IO operations
      */
-    private static void updateNotificaitonNodeInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
+    private static void updateNotificationNodeInfo(JavaCodeGeneratorInfo javaCodeGeneratorInfo,
                                                    YangPluginConfig yangPluginConfig)
             throws IOException {
-        if (javaCodeGeneratorInfo instanceof YangJavaModule) {
-            for (YangNode notificaiton : ((YangJavaModule) javaCodeGeneratorInfo).getNotificationNodes()) {
+        if (javaCodeGeneratorInfo instanceof YangJavaModuleTranslator) {
+            for (YangNode notification : ((YangJavaModuleTranslator) javaCodeGeneratorInfo).getNotificationNodes()) {
                 javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
                         .getEventFragmentFiles()
-                        .addJavaSnippetOfEvent(notificaiton, yangPluginConfig);
+                        .addJavaSnippetOfEvent(notification, yangPluginConfig);
             }
         }
-        if (javaCodeGeneratorInfo instanceof YangJavaSubModule) {
-            for (YangNode notificaiton : ((YangJavaSubModule) javaCodeGeneratorInfo)
+        if (javaCodeGeneratorInfo instanceof YangJavaSubModuleTranslator) {
+            for (YangNode notification : ((YangJavaSubModuleTranslator) javaCodeGeneratorInfo)
                     .getNotificationNodes()) {
                 javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles()
                         .getEventFragmentFiles()
-                        .addJavaSnippetOfEvent(notificaiton, yangPluginConfig);
+                        .addJavaSnippetOfEvent(notification, yangPluginConfig);
             }
         }
     }
@@ -269,9 +268,9 @@
 
         generateCodeOfNode(javaCodeGeneratorInfo, yangPlugin);
         TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles();
-        if (javaCodeGeneratorInfo instanceof YangJavaAugment) {
+        if (javaCodeGeneratorInfo instanceof YangJavaAugmentTranslator) {
 
-            JavaQualifiedTypeInfo yangAugmentedInfo = new JavaQualifiedTypeInfo();
+            JavaQualifiedTypeInfoTranslator yangAugmentedInfo = new JavaQualifiedTypeInfoTranslator();
             yangAugmentedInfo.setClassInfo(YANG_AUGMENTED_INFO);
             yangAugmentedInfo.setPkgInfo(YANG_AUGMENTED_INFO_CLASS_IMPORT_PKG);
             javaCodeGeneratorInfo.getTempJavaCodeFragmentFiles().getBeanTempFiles().getJavaExtendsListHolder()
@@ -280,7 +279,7 @@
         }
         if (javaCodeGeneratorInfo instanceof YangCase) {
             YangNode parent = ((YangCase) javaCodeGeneratorInfo).getParent();
-            JavaQualifiedTypeInfo parentsInfo = new JavaQualifiedTypeInfo();
+            JavaQualifiedTypeInfoTranslator parentsInfo = new JavaQualifiedTypeInfoTranslator();
             String parentName = getCapitalCase(((JavaFileInfoContainer) parent).getJavaFileInfo().getJavaName());
             String parentPkg = ((JavaFileInfoContainer) parent).getJavaFileInfo().getPackage();
             parentsInfo.setClassInfo(parentName);
@@ -399,7 +398,7 @@
         File codeGenDir = new File(info.getBaseCodeGenPath()
                 + info.getPackageFilePath());
         File[] files = codeGenDir.listFiles();
-        if (files.length >= 1) {
+        if (files != null && files.length >= 1) {
             for (File file : files) {
                 if (file.getName().contentEquals(getCapitalCase(info.getJavaName() + MANAGER + ".java"))) {
                     return false;
@@ -420,36 +419,31 @@
 
         List<String> clsInfo = new ArrayList<>();
         while (node.getParent() != null) {
-            if (!(node instanceof YangModule)
-                    || !(node instanceof YangSubModule)) {
-                if (node instanceof YangJavaAugment) {
-                    clsInfo.add(getAugmentClassName((YangAugment) node, yangPluginConfig));
-                } else {
-                    clsInfo.add(getCamelCase(node.getName(), yangPluginConfig.getConflictResolver()));
-                }
+            if (node instanceof YangJavaAugmentTranslator) {
+                clsInfo.add(getAugmentClassName((YangAugment) node, yangPluginConfig));
+            } else {
+                clsInfo.add(getCamelCase(node.getName(), yangPluginConfig.getConflictResolver()));
             }
-            if (node instanceof YangJavaModule
-                    || node instanceof YangJavaSubModule) {
-                break;
-            }
+
             node = node.getParent();
         }
 
         StringBuilder pkg = new StringBuilder();
-        if (node instanceof YangJavaModule) {
-            YangJavaModule module = (YangJavaModule) node;
+        if (node instanceof YangJavaModuleTranslator) {
+            YangJavaModuleTranslator module = (YangJavaModuleTranslator) node;
             pkg.append(getRootPackage(module.getVersion(), module.getNameSpace().getUri(), module
                     .getRevision().getRevDate(), yangPluginConfig.getConflictResolver()));
-        } else if (node instanceof YangJavaSubModule) {
-            YangJavaSubModule submodule = (YangJavaSubModule) node;
+        } else if (node instanceof YangJavaSubModuleTranslator) {
+            YangJavaSubModuleTranslator submodule = (YangJavaSubModuleTranslator) node;
             pkg.append(getRootPackage(submodule.getVersion(),
                     submodule.getNameSpaceFromModule(submodule.getBelongsTo()),
                     submodule.getRevision().getRevDate(), yangPluginConfig.getConflictResolver()));
         }
+        String concat = "";
         for (int i = 1; i <= clsInfo.size(); i++) {
-            pkg.append("." + clsInfo.get(clsInfo.size() - i));
+            concat = concat + "." + clsInfo.get(clsInfo.size() - i);
         }
-
+        pkg.append(concat);
         return pkg.toString().toLowerCase();
 
     }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
index d54fd7d..4c29785 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
@@ -21,23 +21,22 @@
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangIdentity;
-import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangIdentityRef;
+import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
-import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.YangUnion;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
 
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getCurNodePackage;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
-import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL;
+import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
 import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER;
@@ -155,7 +154,7 @@
                     return BOOLEAN_WRAPPER;
                 case ENUMERATION:
                     return getCapitalCase(
-                            getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(),
+                            getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
                                     pluginConfig));
                 case BITS:
                     return BIT_SET;
@@ -163,17 +162,17 @@
                     return BYTE + SQUARE_BRACKETS;
                 case LEAFREF:
                     YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportClass(referredType, isListAttr, pluginConfig);
+                    return getJavaImportClass(referredType, true, pluginConfig);
                 case IDENTITYREF:
                     YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
                     YangIdentity identity = identityRef.getReferredIdentity();
-                    return getCapitalCase(getCamelCase(((YangJavaIdentity) identity).
-                                                        getName(), pluginConfig));
+                    return getCapitalCase(getCamelCase(identity.
+                            getName(), pluginConfig));
                 case EMPTY:
                     return BOOLEAN_WRAPPER;
                 case UNION:
-                    return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(),
-                            pluginConfig));
+                    return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
+                            .getDataTypeExtendedInfo()).getName(), pluginConfig));
                 case INSTANCE_IDENTIFIER:
                     return STRING_DATA_TYPE;
                 case DERIVED:
@@ -190,7 +189,7 @@
                     return STRING_DATA_TYPE;
                 case ENUMERATION:
                     return getCapitalCase(
-                            getCamelCase(((YangJavaEnumeration) yangType.getDataTypeExtendedInfo()).getName(),
+                            getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
                                     pluginConfig));
                 case BITS:
                     return BIT_SET;
@@ -198,16 +197,16 @@
                     return BIG_DECIMAL;
                 case LEAFREF:
                     YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportClass(referredType, isListAttr, pluginConfig);
+                    return getJavaImportClass(referredType, false, pluginConfig);
                 case IDENTITYREF:
                     YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
                     YangIdentity identity = identityRef.getReferredIdentity();
-                    return getCapitalCase(getCamelCase(((YangJavaIdentity) identity).getName(), pluginConfig));
+                    return getCapitalCase(getCamelCase(identity.getName(), pluginConfig));
                 case EMPTY:
                     return BOOLEAN_DATA_TYPE;
                 case UNION:
-                    return getCapitalCase(getCamelCase(((YangJavaUnion) yangType.getDataTypeExtendedInfo()).getName(),
-                            pluginConfig));
+                    return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
+                            .getDataTypeExtendedInfo()).getName(), pluginConfig));
                 case INSTANCE_IDENTIFIER:
                     return STRING_DATA_TYPE;
                 case DERIVED:
@@ -255,7 +254,7 @@
                     return COLLECTION_IMPORTS;
                 case LEAFREF:
                     YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportPackage(referredType, isListAttr, conflictResolver);
+                    return getJavaImportPackage(referredType, true, conflictResolver);
                 case IDENTITYREF:
                     return getIdentityRefPackage(yangType, conflictResolver);
                 case UNION:
@@ -281,7 +280,7 @@
                     return COLLECTION_IMPORTS;
                 case LEAFREF:
                     YangType<?> referredType = getReferredTypeFromLeafref(yangType);
-                    return getJavaImportPackage(referredType, isListAttr, conflictResolver);
+                    return getJavaImportPackage(referredType, false, conflictResolver);
                 case IDENTITYREF:
                     return getIdentityRefPackage(yangType, conflictResolver);
                 case UNION:
@@ -309,11 +308,11 @@
             throw new TranslatorException("type should have been derived.");
         }
 
-        if (!(((YangDerivedInfo<?>) var).getReferredTypeDef() instanceof YangTypeDef)) {
+        if (!(((YangDerivedInfo<?>) var).getReferredTypeDef() != null)) {
             throw new TranslatorException("derived info is not an instance of typedef.");
         }
 
-        YangJavaTypeDef typedef = (YangJavaTypeDef) ((YangDerivedInfo<?>) var).getReferredTypeDef();
+        YangJavaTypeDefTranslator typedef = (YangJavaTypeDefTranslator) ((YangDerivedInfo<?>) var).getReferredTypeDef();
         if (typedef.getJavaFileInfo().getPackage() == null) {
             return getPackageFromParent(typedef.getParent(), conflictResolver);
         }
@@ -333,7 +332,7 @@
             throw new TranslatorException("type should have been union.");
         }
 
-        YangJavaUnion union = (YangJavaUnion) type.getDataTypeExtendedInfo();
+        YangJavaUnionTranslator union = (YangJavaUnionTranslator) type.getDataTypeExtendedInfo();
         if (union.getJavaFileInfo().getPackage() == null) {
             return getPackageFromParent(union.getParent(), conflictResolver);
         }
@@ -352,7 +351,7 @@
         if (!(type.getDataTypeExtendedInfo() instanceof YangEnumeration)) {
             throw new TranslatorException("type should have been enumeration.");
         }
-        YangJavaEnumeration enumeration = (YangJavaEnumeration) type.getDataTypeExtendedInfo();
+        YangJavaEnumerationTranslator enumeration = (YangJavaEnumerationTranslator) type.getDataTypeExtendedInfo();
         if (enumeration.getJavaFileInfo().getPackage() == null) {
             return getPackageFromParent(enumeration.getParent(), conflictResolver);
         }
@@ -372,12 +371,13 @@
             throw new TranslatorException("type should have been identityref.");
         }
         YangIdentityRef identityRef = (YangIdentityRef) type.getDataTypeExtendedInfo();
-        YangJavaIdentity identity = (YangJavaIdentity) (identityRef.getReferredIdentity());
+        YangJavaIdentityTranslator identity = (YangJavaIdentityTranslator) (identityRef.getReferredIdentity());
         if (identity.getJavaFileInfo().getPackage() == null) {
             return getPackageFromParent(identity.getParent(), conflictResolver);
         }
         return identity.getJavaFileInfo().getPackage();
     }
+
     /**
      * Returns package from parent node.
      *
@@ -406,7 +406,7 @@
      */
     public static void updateJavaFileInfo(YangNode yangNode,
                                           YangToJavaNamingConflictUtil conflictResolver) {
-        Stack<YangNode> nodesToUpdatePackage = new Stack<YangNode>();
+        Stack<YangNode> nodesToUpdatePackage = new Stack<>();
 
         /*
          * Add the nodes to be updated for package info in a stack.
@@ -425,12 +425,12 @@
         if (yangNode == null) {
             yangNode = nodesToUpdatePackage.pop();
             String pkg;
-            if (yangNode instanceof YangJavaModule) {
-                YangJavaModule module = (YangJavaModule) yangNode;
+            if (yangNode instanceof YangJavaModuleTranslator) {
+                YangJavaModuleTranslator module = (YangJavaModuleTranslator) yangNode;
                 pkg = getRootPackage(module.getVersion(), module.getNameSpace().getUri(), module
                         .getRevision().getRevDate(), conflictResolver);
-            } else if (yangNode instanceof YangJavaSubModule) {
-                YangJavaSubModule submodule = (YangJavaSubModule) yangNode;
+            } else if (yangNode instanceof YangJavaSubModuleTranslator) {
+                YangJavaSubModuleTranslator submodule = (YangJavaSubModuleTranslator) yangNode;
                 pkg = getRootPackage(submodule.getVersion(),
                         submodule.getNameSpaceFromModule(submodule.getBelongsTo()),
                         submodule.getRevision().getRevDate(), conflictResolver);
@@ -448,7 +448,7 @@
                                     .getPackage()));
         }
 
-        /**
+        /*
          * Parent of the node in stack is updated with java info,
          * all the nodes can be popped and updated
          */
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaLeafInfoContainer.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaLeafInfoContainer.java
index c57e3c4..809323c 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaLeafInfoContainer.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaLeafInfoContainer.java
@@ -17,7 +17,7 @@
 
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoContainer;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 
 /**
  * Represent java based identification of the YANG leaves.
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaQualifiedTypeResolver.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaQualifiedTypeResolver.java
index c85b1a2..f5fd32e 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaQualifiedTypeResolver.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/JavaQualifiedTypeResolver.java
@@ -15,8 +15,8 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoContainer;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
 
 /**
  * Represent java based identification of the YANG leaves.
@@ -27,7 +27,7 @@
     /**
      * updates the qualified access details of the type.
      *
-     * @param confilictResolver plugin configurations
+     * @param conflictResolver plugin configurations
      */
-    void updateJavaQualifiedInfo(YangToJavaNamingConflictUtil confilictResolver);
+    void updateJavaQualifiedInfo(YangToJavaNamingConflictUtil conflictResolver);
 }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugment.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugmentTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugment.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugmentTranslator.java
index 9986351..4ed340d 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugment.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaAugmentTranslator.java
@@ -17,13 +17,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaAugment;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfAugmentableNode;
@@ -31,18 +31,13 @@
 /**
  * Represents augment information extended to support java code generation.
  */
-public class YangJavaAugment
-        extends YangAugment
+public class YangJavaAugmentTranslator
+        extends YangJavaAugment
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201632L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code snippet types.
      */
     private transient TempJavaCodeFragmentFiles tempFileHandle;
@@ -50,7 +45,7 @@
     /**
      * Creates a YANG java augment object.
      */
-    public YangJavaAugment() {
+    public YangJavaAugmentTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCase.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCaseTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCase.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCaseTranslator.java
index 4d4929d..5323ee5 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCase.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaCaseTranslator.java
@@ -17,13 +17,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangCase;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaCase;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfAugmentableNode;
@@ -31,18 +31,13 @@
 /**
  * Represents case information extended to support java code generation.
  */
-public class YangJavaCase
-        extends YangCase
+public class YangJavaCaseTranslator
+        extends YangJavaCase
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201631L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -51,7 +46,7 @@
     /**
      * Creates YANG java case object.
      */
-    public YangJavaCase() {
+    public YangJavaCaseTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoice.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoiceTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoice.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoiceTranslator.java
index 122bb40..fca0eb2 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoice.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaChoiceTranslator.java
@@ -17,13 +17,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangChoice;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaChoice;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeAndUpdateInParent;
@@ -31,18 +31,13 @@
 /**
  * Represents choice information extended to support java code generation.
  */
-public class YangJavaChoice
-        extends YangChoice
+public class YangJavaChoiceTranslator
+        extends YangJavaChoice
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201631L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -51,7 +46,7 @@
     /**
      * Creates YANG java choice object.
      */
-    public YangJavaChoice() {
+    public YangJavaChoiceTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(INTERFACE_MASK);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainer.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainerTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainer.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainerTranslator.java
index 3578adc..2b560a8 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainer.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaContainerTranslator.java
@@ -17,13 +17,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangContainer;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaContainer;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeAndUpdateInParent;
@@ -31,18 +31,13 @@
 /**
  * Represents container information extended to support java code generation.
  */
-public class YangJavaContainer
-        extends YangContainer
+public class YangJavaContainerTranslator
+        extends YangJavaContainer
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201630L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -51,7 +46,7 @@
     /**
      * Creates YANG java container object.
      */
-    public YangJavaContainer() {
+    public YangJavaContainerTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumeration.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumerationTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumeration.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumerationTranslator.java
index fe5e40f..f0589f7 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumeration.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaEnumerationTranslator.java
@@ -18,13 +18,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangEnumeration;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaEnumeration;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfNode;
@@ -32,18 +32,13 @@
 /**
  * Represents YANG java enumeration information extended to support java code generation.
  */
-public class YangJavaEnumeration
-        extends YangEnumeration
+public class YangJavaEnumerationTranslator
+        extends YangJavaEnumeration
         implements JavaCodeGenerator, JavaCodeGeneratorInfo {
 
     private static final long serialVersionUID = 806201629L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -52,7 +47,7 @@
     /**
      * Creates YANG java enumeration object.
      */
-    public YangJavaEnumeration() {
+    public YangJavaEnumerationTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_ENUM_CLASS);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGroupingTranslator.java
similarity index 87%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGroupingTranslator.java
index 6a496ce..a953b63 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGroupingTranslator.java
@@ -15,30 +15,25 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
-import org.onosproject.yangutils.datamodel.YangGrouping;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaGrouping;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.InvalidNodeForTranslatorException;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 /**
  * Represents grouping information extended to support java code generation.
  */
-public class YangJavaGrouping
-        extends YangGrouping
+public class YangJavaGroupingTranslator
+        extends YangJavaGrouping
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201628L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -47,7 +42,7 @@
     /**
      * Creates YANG Java grouping object.
      */
-    public YangJavaGrouping() {
+    public YangJavaGroupingTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
     }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentity.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentityTranslator.java
similarity index 87%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentity.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentityTranslator.java
index 45c9af7..22f95fa 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentity.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaIdentityTranslator.java
@@ -19,15 +19,15 @@
 import java.io.IOException;
 import java.util.List;
 
-import org.onosproject.yangutils.datamodel.YangIdentity;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaIdentity;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaImportData;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_IDENTITY_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
@@ -41,16 +41,12 @@
 /**
  * Represents input information extended to support java code generation.
  */
-public class YangJavaIdentity extends YangIdentity
+public class YangJavaIdentityTranslator extends YangJavaIdentity
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     //File type extension for java classes.
     private static final String JAVA_FILE_EXTENSION = ".java";
 
-
-    //Contains the information of the java file being generated.
-    private JavaFileInfo javaFileInfo;
-
     //Contains the information of the importd.
     private transient JavaImportData importData;
 
@@ -58,12 +54,12 @@
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
-    private TempJavaCodeFragmentFiles tempFileHandle;
+    private transient TempJavaCodeFragmentFiles tempFileHandle;
 
     /**
      * Creates YANG java container object.
      */
-    public YangJavaIdentity() {
+    public YangJavaIdentityTranslator() {
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
         importData = new JavaImportData();
@@ -123,20 +119,21 @@
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
             updatePackageInfo(this, yangPlugin);
-            JavaQualifiedTypeInfo basePkgInfo = new JavaQualifiedTypeInfo();
+            JavaQualifiedTypeInfoTranslator basePkgInfo = new JavaQualifiedTypeInfoTranslator();
             String className = getCapitalCase(getJavaFileInfo().getJavaName());
             String path = getJavaFileInfo().getPackageFilePath();
             createPackage(this);
             List<String> imports = null;
-            boolean isQualified = false;
+            boolean isQualified;
 
             if (getBaseNode() != null && getBaseNode().getReferredIdentity() != null) {
-                if (!(getBaseNode().getReferredIdentity() instanceof YangJavaIdentity)) {
+                if (!(getBaseNode().getReferredIdentity() instanceof YangJavaIdentityTranslator)) {
                     throw new TranslatorException("Failed to prepare generate code entry for base node");
                 }
-                YangJavaIdentity baseIdentity = (YangJavaIdentity) getBaseNode().getReferredIdentity();
+                YangJavaIdentityTranslator baseIdentity = (YangJavaIdentityTranslator) getBaseNode()
+                        .getReferredIdentity();
                 String baseClassName = getCapitalCase(baseIdentity.getJavaFileInfo().getJavaName());
-                String basePkg =  baseIdentity.getJavaFileInfo().getPackage();
+                String basePkg = baseIdentity.getJavaFileInfo().getPackage();
                 basePkgInfo.setClassInfo(baseClassName);
                 basePkgInfo.setPkgInfo(basePkg);
                 isQualified = importData.addImportInfo(basePkgInfo, className, getJavaFileInfo().getPackage());
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInputTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInputTranslator.java
index f6bfbfc..de730bc 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInputTranslator.java
@@ -18,13 +18,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangInput;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaInput;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfAugmentableNode;
@@ -32,18 +32,13 @@
 /**
  * Represents input information extended to support java code generation.
  */
-public class YangJavaInput
-        extends YangInput
+public class YangJavaInputTranslator
+        extends YangJavaInput
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201627L;
 
     /**
-     * Contains information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -52,7 +47,7 @@
     /**
      * Creates an instance of java input.
      */
-    public YangJavaInput() {
+    public YangJavaInputTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafList.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafListTranslator.java
similarity index 76%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafList.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafListTranslator.java
index c22a134..149d260 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafList.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafListTranslator.java
@@ -15,31 +15,30 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
-import org.onosproject.yangutils.datamodel.YangLeafList;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaLeafList;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.updateLeavesJavaQualifiedInfo;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.updateLeavesJavaQualifiedInfo;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 
 /**
  * Represents java information corresponding to the YANG leaf-list.
  */
-public class YangJavaLeafList
-        extends YangLeafList
+public class YangJavaLeafListTranslator
+        extends YangJavaLeafList
         implements JavaLeafInfoContainer {
 
     private static final long serialVersionUID = 806201638L;
 
-    private JavaQualifiedTypeInfo javaQualifiedAccess;
     private transient YangToJavaNamingConflictUtil conflictResolveConfig;
 
     /**
      * Returns a new YANG leaf object with java qualified access details.
      */
-    public YangJavaLeafList() {
+    public YangJavaLeafListTranslator() {
         super();
-        setJavaQualifiedInfo(new JavaQualifiedTypeInfo());
+        setJavaQualifiedInfo(new JavaQualifiedTypeInfoTranslator());
     }
 
     @Override
@@ -58,13 +57,13 @@
     }
 
     @Override
-    public JavaQualifiedTypeInfo getJavaQualifiedInfo() {
-        return javaQualifiedAccess;
+    public JavaQualifiedTypeInfoTranslator getJavaQualifiedInfo() {
+        return (JavaQualifiedTypeInfoTranslator) javaQualifiedTypeInfo;
     }
 
     @Override
-    public void setJavaQualifiedInfo(JavaQualifiedTypeInfo typeInfo) {
-        javaQualifiedAccess = typeInfo;
+    public void setJavaQualifiedInfo(JavaQualifiedTypeInfoTranslator typeInfo) {
+        javaQualifiedTypeInfo = typeInfo;
     }
 
     /**
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafTranslator.java
similarity index 76%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafTranslator.java
index a9fa972..5bd98c9 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeafTranslator.java
@@ -15,41 +15,40 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
-import org.onosproject.yangutils.datamodel.YangLeaf;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaLeaf;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.updateLeavesJavaQualifiedInfo;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.updateLeavesJavaQualifiedInfo;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 
 /**
  * Represents java information corresponding to the YANG leaf.
  */
-public class YangJavaLeaf
-        extends YangLeaf
+public class YangJavaLeafTranslator
+        extends YangJavaLeaf
         implements JavaLeafInfoContainer {
 
     private static final long serialVersionUID = 806201636L;
 
-    private JavaQualifiedTypeInfo javaQualifiedAccess;
     private transient YangToJavaNamingConflictUtil conflictResolveConfig;
 
     /**
      * Returns a new YANG leaf object with java qualified access details.
      */
-    public YangJavaLeaf() {
+    public YangJavaLeafTranslator() {
         super();
-        setJavaQualifiedInfo(new JavaQualifiedTypeInfo());
+        setJavaQualifiedInfo(new JavaQualifiedTypeInfoTranslator());
     }
 
     @Override
-    public JavaQualifiedTypeInfo getJavaQualifiedInfo() {
-        return javaQualifiedAccess;
+    public JavaQualifiedTypeInfoTranslator getJavaQualifiedInfo() {
+        return (JavaQualifiedTypeInfoTranslator) javaQualifiedTypeInfo;
     }
 
     @Override
-    public void setJavaQualifiedInfo(JavaQualifiedTypeInfo typeInfo) {
-        javaQualifiedAccess = typeInfo;
+    public void setJavaQualifiedInfo(JavaQualifiedTypeInfoTranslator typeInfo) {
+        javaQualifiedTypeInfo = typeInfo;
 
     }
 
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaList.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaListTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaList.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaListTranslator.java
index d03c381..c8f3759 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaList.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaListTranslator.java
@@ -17,13 +17,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangList;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaList;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeAndUpdateInParent;
@@ -31,18 +31,13 @@
 /**
  * Represents YANG list information extended to support java code generation.
  */
-public class YangJavaList
-        extends YangList
+public class YangJavaListTranslator
+        extends YangJavaList
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201626L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -51,7 +46,7 @@
     /**
      * Creates YANG java list object.
      */
-    public YangJavaList() {
+    public YangJavaListTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
similarity index 92%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
index db5d060..06715b1 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
@@ -19,15 +19,15 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNotification;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaModule;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
@@ -42,18 +42,13 @@
 /**
  * Represents module information extended to support java code generation.
  */
-public class YangJavaModule
-        extends YangModule
+public class YangJavaModuleTranslator
+        extends YangJavaModule
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201625L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code snippet types.
      */
     private transient TempJavaCodeFragmentFiles tempFileHandle;
@@ -66,7 +61,7 @@
     /**
      * Creates a YANG node of module type.
      */
-    public YangJavaModule() {
+    public YangJavaModuleTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         setNotificationNodes(new ArrayList<>());
@@ -163,9 +158,9 @@
             if (isManagerCodeGenRequired(this)) {
                 if (isGenerationOfCodeReq(getJavaFileInfo())) {
                     if ((getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi() == null)
-                        || (!getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi().equals(SBI))) {
-                         getTempJavaCodeFragmentFiles().getServiceTempFiles().setManagerNeedToBeGenerated(true);
-                     }
+                            || (!getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi().equals(SBI))) {
+                        getTempJavaCodeFragmentFiles().getServiceTempFiles().setManagerNeedToBeGenerated(true);
+                    }
                 }
             }
             getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotification.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotificationTranslator.java
similarity index 91%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotification.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotificationTranslator.java
index a56fefa..a693820 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotification.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaNotificationTranslator.java
@@ -19,40 +19,35 @@
 import java.io.IOException;
 
 import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.datamodel.YangNotification;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaNotification;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
-import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfAugmentableNode;
 import static org.onosproject.yangutils.utils.UtilConstants.EVENT_LISTENER_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EVENT_STRING;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 
 /**
  * Represents notification information extended to support java code generation.
  */
-public class YangJavaNotification
-        extends YangNotification
+public class YangJavaNotificationTranslator
+        extends YangJavaNotification
         implements JavaCodeGenerator, JavaCodeGeneratorInfo {
 
     private static final long serialVersionUID = 806201624L;
 
     /**
-     * Contains information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -61,7 +56,7 @@
     /**
      * Creates an instance of java Notification.
      */
-    public YangJavaNotification() {
+    public YangJavaNotificationTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
@@ -148,7 +143,7 @@
                 .getTempJavaCodeFragmentFiles()
                 .getServiceTempFiles();
         JavaExtendsListHolder holder = tempJavaServiceFragmentFiles.getJavaExtendsListHolder();
-        JavaQualifiedTypeInfo event = new JavaQualifiedTypeInfo();
+        JavaQualifiedTypeInfoTranslator event = new JavaQualifiedTypeInfoTranslator();
 
         String parentInfo = getCapitalCase(((JavaFileInfoContainer) parent)
                 .getJavaFileInfo().getJavaName());
@@ -156,7 +151,7 @@
         event.setPkgInfo(getJavaFileInfo().getPackage());
         holder.addToExtendsList(event, parent, tempJavaServiceFragmentFiles);
 
-        JavaQualifiedTypeInfo eventListener = new JavaQualifiedTypeInfo();
+        JavaQualifiedTypeInfoTranslator eventListener = new JavaQualifiedTypeInfoTranslator();
 
         eventListener.setClassInfo(parentInfo + EVENT_LISTENER_STRING);
         eventListener.setPkgInfo(getJavaFileInfo().getPackage());
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutputTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutputTranslator.java
index 4b18551..b9bc576 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutputTranslator.java
@@ -18,13 +18,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangOutput;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaOutput;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfAugmentableNode;
@@ -32,18 +32,13 @@
 /**
  * Represents output information extended to support java code generation.
  */
-public class YangJavaOutput
-        extends YangOutput
+public class YangJavaOutputTranslator
+        extends YangJavaOutput
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201623L;
 
     /**
-     * Contains information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -52,7 +47,7 @@
     /**
      * Creates an instance of java output.
      */
-    public YangJavaOutput() {
+    public YangJavaOutputTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpcTranslator.java
similarity index 93%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpcTranslator.java
index 315f7e3..7696418 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpcTranslator.java
@@ -22,23 +22,22 @@
 import org.onosproject.yangutils.datamodel.YangInput;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangOutput;
-import org.onosproject.yangutils.datamodel.YangRpc;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaRpc;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
-import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.updatePackageInfo;
 import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE;
 import static org.onosproject.yangutils.utils.UtilConstants.COMPONENT;
@@ -47,22 +46,18 @@
 import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE;
 import static org.onosproject.yangutils.utils.UtilConstants.REFERENCE_CARDINALITY;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 
 /**
  * Represents rpc information extended to support java code generation.
  */
-public class YangJavaRpc
-        extends YangRpc
+public class YangJavaRpcTranslator
+        extends YangJavaRpc
         implements JavaCodeGenerator, JavaCodeGeneratorInfo {
 
     private static final long serialVersionUID = 806201622L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * Temproary file for code generation.
      */
     private transient TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles;
@@ -70,7 +65,7 @@
     /**
      * Creates an instance of YANG java rpc.
      */
-    public YangJavaRpc() {
+    public YangJavaRpcTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
     }
@@ -206,7 +201,7 @@
          * Get the import info corresponding to the attribute for import in
          * generated java files or qualified access
          */
-        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(childNode,
+        JavaQualifiedTypeInfoTranslator qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(childNode,
                 getCapitalCase(childNodeName));
         if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) {
             throw new TranslatorException("Parent node does not have file info");
@@ -230,7 +225,7 @@
      * @param importInfo import info
      * @return true or false
      */
-    private boolean addImportToService(JavaQualifiedTypeInfo importInfo) {
+    private boolean addImportToService(JavaQualifiedTypeInfoTranslator importInfo) {
         JavaFileInfo fileInfo = ((JavaFileInfoContainer) getParent()).getJavaFileInfo();
 
         if (importInfo.getClassInfo().contentEquals(SERVICE)
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
similarity index 92%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
index 73d7583..a089a99 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
@@ -23,13 +23,13 @@
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNotification;
-import org.onosproject.yangutils.datamodel.YangSubModule;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaSubModule;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
@@ -44,18 +44,13 @@
 /**
  * Represents sub module information extended to support java code generation.
  */
-public class YangJavaSubModule
-        extends YangSubModule
+public class YangJavaSubModuleTranslator
+        extends YangJavaSubModule
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201621L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code snippet types.
      */
     private transient TempJavaCodeFragmentFiles tempFileHandle;
@@ -68,7 +63,7 @@
     /**
      * Creates YANG java sub module object.
      */
-    public YangJavaSubModule() {
+    public YangJavaSubModuleTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         int gentype = GENERATE_SERVICE_AND_MANAGER | GENERATE_INTERFACE_WITH_BUILDER;
@@ -178,9 +173,9 @@
             if (isManagerCodeGenRequired(this)) {
                 if (isGenerationOfCodeReq(getJavaFileInfo())) {
                     if ((getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi() == null)
-                        || (!getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi().equals(SBI))) {
-                         getTempJavaCodeFragmentFiles().getServiceTempFiles().setManagerNeedToBeGenerated(true);
-                     }
+                            || (!getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi().equals(SBI))) {
+                        getTempJavaCodeFragmentFiles().getServiceTempFiles().setManagerNeedToBeGenerated(true);
+                    }
                 }
             }
             getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDef.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDefTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDef.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDefTranslator.java
index e08ec19..7cec2df 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDef.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeDefTranslator.java
@@ -17,13 +17,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangTypeDef;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaTypeDef;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPEDEF_CLASS;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfNode;
@@ -31,18 +31,13 @@
 /**
  * Represents type define information extended to support java code generation.
  */
-public class YangJavaTypeDef
-        extends YangTypeDef
+public class YangJavaTypeDefTranslator
+        extends YangJavaTypeDef
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201620L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -51,7 +46,7 @@
     /**
      * Creates a YANG java typedef object.
      */
-    public YangJavaTypeDef() {
+    public YangJavaTypeDefTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_TYPEDEF_CLASS);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeTranslator.java
similarity index 79%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeTranslator.java
index 1a96a3a..d8fe517 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaTypeTranslator.java
@@ -16,16 +16,17 @@
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
 import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 
 /**
  * Represents java information corresponding to the YANG type.
  *
  * @param <T> generic parameter for YANG java type
  */
-public class YangJavaType<T>
+public class YangJavaTypeTranslator<T>
         extends YangType<T>
         implements JavaQualifiedTypeResolver {
 
@@ -34,14 +35,14 @@
     /**
      * Create a YANG leaf object with java qualified access details.
      */
-    public YangJavaType() {
+    public YangJavaTypeTranslator() {
         super();
-        setJavaQualifiedInfo(new JavaQualifiedTypeInfo());
+        setJavaQualifiedInfo(new JavaQualifiedTypeInfoTranslator());
     }
 
     @Override
     public void updateJavaQualifiedInfo(YangToJavaNamingConflictUtil conflictResolver) {
-        JavaQualifiedTypeInfo importInfo = getJavaQualifiedInfo();
+        JavaQualifiedTypeInfoTranslator importInfo = getJavaQualifiedInfo();
 
         /*
          * Type is added as an attribute in the class.
@@ -54,7 +55,7 @@
              */
             importInfo.setClassInfo(className);
             String classPkg = AttributesJavaDataType.getJavaImportPackage(this,
-                    false,  conflictResolver);
+                    false, conflictResolver);
             if (classPkg == null) {
                 throw new TranslatorException("import package cannot be null when the class is used");
             }
@@ -74,12 +75,12 @@
     }
 
     @Override
-    public JavaQualifiedTypeInfo getJavaQualifiedInfo() {
-        return javaQualifiedAccess;
+    public JavaQualifiedTypeInfoTranslator getJavaQualifiedInfo() {
+        return (JavaQualifiedTypeInfoTranslator) javaQualifiedAccess;
     }
 
     @Override
-    public void setJavaQualifiedInfo(JavaQualifiedTypeInfo typeInfo) {
+    public void setJavaQualifiedInfo(JavaQualifiedTypeInfoTranslator typeInfo) {
         javaQualifiedAccess = typeInfo;
     }
 }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnion.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnionTranslator.java
similarity index 90%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnion.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnionTranslator.java
index 0dca9a7..926bcb9 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnion.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUnionTranslator.java
@@ -17,13 +17,13 @@
 
 import java.io.IOException;
 
-import org.onosproject.yangutils.datamodel.YangUnion;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaUnion;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateCodeOfNode;
@@ -31,18 +31,13 @@
 /**
  * Represents union information extended to support java code generation.
  */
-public class YangJavaUnion
-        extends YangUnion
+public class YangJavaUnionTranslator
+        extends YangJavaUnion
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201619L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -51,7 +46,7 @@
     /**
      * Creates an instance of YANG java union.
      */
-    public YangJavaUnion() {
+    public YangJavaUnionTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
         getJavaFileInfo().setGeneratedFileTypes(GENERATE_UNION_CLASS);
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUsesTranslator.java
similarity index 88%
rename from plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
rename to plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUsesTranslator.java
index 409688f..4717a15 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUsesTranslator.java
@@ -15,30 +15,25 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
-import org.onosproject.yangutils.datamodel.YangUses;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangJavaUses;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.InvalidNodeForTranslatorException;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 /**
  * Represents uses information extended to support java code generation.
  */
-public class YangJavaUses
-        extends YangUses
+public class YangJavaUsesTranslator
+        extends YangJavaUses
         implements JavaCodeGeneratorInfo, JavaCodeGenerator {
 
     private static final long serialVersionUID = 806201618L;
 
     /**
-     * Contains the information of the java file being generated.
-     */
-    private JavaFileInfo javaFileInfo;
-
-    /**
      * File handle to maintain temporary java code fragments as per the code
      * snippet types.
      */
@@ -47,7 +42,7 @@
     /**
      * Creates YANG java uses object.
      */
-    public YangJavaUses() {
+    public YangJavaUsesTranslator() {
         super();
         setJavaFileInfo(new JavaFileInfo());
     }
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
index 7631bb6..ce97834 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
@@ -22,9 +22,9 @@
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNotification;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
@@ -445,7 +445,7 @@
      * @return updated class definition
      */
     private static String getDefinitionString(String def, JavaExtendsListHolder holder) {
-        for (JavaQualifiedTypeInfo info : holder.getExtendsList()) {
+        for (JavaQualifiedTypeInfoTranslator info : holder.getExtendsList()) {
             if (!holder.getExtendedClassStore().get(info)) {
                 def = def + info.getClassInfo() + COMMA + SPACE;
             } else {
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
index 1057bde..8ec8141 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
@@ -20,9 +20,9 @@
 
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getEnumJavaAttribute;
 import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE_ANNOTATION_IMPORT;
@@ -105,7 +105,7 @@
      * @param importInfo import info
      * @return the textual java code information corresponding to the import list
      */
-    static String getImportText(JavaQualifiedTypeInfo importInfo) {
+    static String getImportText(JavaQualifiedTypeInfoTranslator importInfo) {
         return IMPORT + importInfo.getPkgInfo() + PERIOD + importInfo.getClassInfo() + SEMI_COLAN + NEW_LINE;
     }
 
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java
index 9bd3bbf..a741312 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaExtendsListHolder.java
@@ -22,10 +22,10 @@
 import java.util.Map;
 
 import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yangutils.translator.tojava.JavaImportData;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
 
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
@@ -36,8 +36,8 @@
  */
 public class JavaExtendsListHolder {
 
-    private Map<JavaQualifiedTypeInfo, Boolean> extendedClassStore;
-    private List<JavaQualifiedTypeInfo> extendsList;
+    private Map<JavaQualifiedTypeInfoTranslator, Boolean> extendedClassStore;
+    private List<JavaQualifiedTypeInfoTranslator> extendsList;
 
     /**
      * Creates an instance of JavaExtendsListHolder.
@@ -52,7 +52,7 @@
      *
      * @return extends list
      */
-    public Map<JavaQualifiedTypeInfo, Boolean> getExtendedClassStore() {
+    public Map<JavaQualifiedTypeInfoTranslator, Boolean> getExtendedClassStore() {
         return extendedClassStore;
     }
 
@@ -61,7 +61,7 @@
      *
      * @param extendedClass map of classes need to be extended
      */
-    private void setExtendedClassStore(Map<JavaQualifiedTypeInfo, Boolean> extendedClass) {
+    private void setExtendedClassStore(Map<JavaQualifiedTypeInfoTranslator, Boolean> extendedClass) {
         extendedClassStore = extendedClass;
     }
 
@@ -72,7 +72,7 @@
      * @param node                  YANG node
      * @param tempJavaFragmentFiles temp java fragment files
      */
-    public void addToExtendsList(JavaQualifiedTypeInfo info, YangNode node,
+    public void addToExtendsList(JavaQualifiedTypeInfoTranslator info, YangNode node,
                                  TempJavaFragmentFiles tempJavaFragmentFiles) {
         JavaFileInfo fileInfo = ((JavaFileInfoContainer) node).getJavaFileInfo();
 
@@ -91,7 +91,7 @@
      *
      * @return the extendsList
      */
-    public List<JavaQualifiedTypeInfo> getExtendsList() {
+    public List<JavaQualifiedTypeInfoTranslator> getExtendsList() {
         return extendsList;
     }
 
@@ -100,7 +100,7 @@
      *
      * @param classInfoList the extends List to set
      */
-    private void setExtendsList(List<JavaQualifiedTypeInfo> classInfoList) {
+    private void setExtendsList(List<JavaQualifiedTypeInfoTranslator> classInfoList) {
         extendsList = classInfoList;
     }
 
@@ -109,7 +109,7 @@
      *
      * @param classInfo class info
      */
-    private void addToExtendsList(JavaQualifiedTypeInfo classInfo) {
+    private void addToExtendsList(JavaQualifiedTypeInfoTranslator classInfo) {
         getExtendsList().add(classInfo);
     }
 
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
index fa0ef19..331878b 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
@@ -23,6 +23,7 @@
 
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
+import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
@@ -34,16 +35,16 @@
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 import org.onosproject.yangutils.translator.tojava.TempJavaEnumerationFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaEventFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaTypeFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.YangJavaModelUtils;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
@@ -79,7 +80,7 @@
 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.JavaAttributeInfo.getAttributeInfoForTheData;
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
 import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.getCurNodeAsAttributeInTarget;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.addAugmentationAttribute;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getEnumsValueAttribute;
@@ -816,6 +817,7 @@
         YangTypeDef typeDef = (YangTypeDef) curNode;
         List<YangType<?>> types = typeDef.getTypeList();
         YangType type = types.get(0);
+        YangDataTypes yangDataTypes = type.getDataType();
         if (type.getDataType().equals(YangDataTypes.BINARY)) {
             imports.add(IMPORT + JAVA_UTIL_OBJECTS_IMPORT_PKG + PERIOD + JAVA_UTIL_IMPORT_BASE64_CLASS);
         }
@@ -878,7 +880,7 @@
 
             //To string method.
             if (type.getDataType().equals(YangDataTypes.BINARY)) {
-                JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
+                JavaQualifiedTypeInfoTranslator qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
                         getCapitalCase("binary"));
 
                 JavaAttributeInfo attr = getAttributeInfoForTheData(qualifiedTypeInfo, "binary", null, false,
@@ -892,7 +894,7 @@
                         + SEMI_COLAN + NEW_LINE + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
                 methods.add(bitsToStringMethod);
             } else if (type.getDataType().equals(YangDataTypes.BITS)) {
-                JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
+                JavaQualifiedTypeInfoTranslator qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
                         getCapitalCase("bits"));
 
                 JavaAttributeInfo attr = getAttributeInfoForTheData(qualifiedTypeInfo, "bits", null, false, false);
@@ -912,11 +914,26 @@
 
             JavaCodeGeneratorInfo javaGenInfo = (JavaCodeGeneratorInfo) curNode;
 
-            //From string method.
-            methods.add(getFromStringMethodSignature(className, pluginConfig)
-                    + getDataFromTempFileHandle(FROM_STRING_IMPL_MASK, javaGenInfo.getTempJavaCodeFragmentFiles()
-                    .getTypeTempFiles(), path)
-                    + getFromStringMethodClose());
+            if ((type.getDataType().equals(YangDataTypes.DERIVED))
+                    && (((YangDerivedInfo) type.getDataTypeExtendedInfo()).getEffectiveBuiltInType()
+                    .equals(YangDataTypes.IDENTITYREF))) {
+                yangDataTypes = YangDataTypes.IDENTITYREF;
+            }
+
+            if (type.getDataType().equals(YangDataTypes.IDENTITYREF)) {
+                yangDataTypes = YangDataTypes.IDENTITYREF;
+            }
+
+            if (!yangDataTypes.equals(YangDataTypes.IDENTITYREF)) {
+
+
+                //From string method.
+                methods.add(getFromStringMethodSignature(className, pluginConfig)
+                                    + getDataFromTempFileHandle(FROM_STRING_IMPL_MASK, javaGenInfo
+                        .getTempJavaCodeFragmentFiles()
+                        .getTypeTempFiles(), path)
+                                    + getFromStringMethodClose());
+            }
 
         } catch (IOException e) {
             throw new IOException("No data found in temporary java code fragment files for " + className
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
index c5558ff..55c64e4 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -25,12 +25,13 @@
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yangutils.translator.tojava.JavaImportData;
-import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaBeanFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaEnumerationFragmentFiles;
@@ -40,7 +41,6 @@
 import org.onosproject.yangutils.translator.tojava.TempJavaTypeFragmentFiles;
 import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.BUILDER_INTERFACE_MASK;
@@ -76,7 +76,7 @@
 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.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getAugmentedNodesPackage;
 import static org.onosproject.yangutils.translator.tojava.utils.ClassDefinitionGenerator.generateClassDefinition;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
@@ -343,7 +343,7 @@
      * @param importsList list of java imports
      * @param curNode     current YANG node
      * @param className   class name
-     * @throws IOException
+     * @throws IOException when fails to do IO operations
      */
     private static void appendContents(File file, int genType, List<String> importsList, YangNode curNode,
                                        String className)
@@ -597,7 +597,7 @@
         TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles = ((JavaCodeGeneratorInfo) parent)
                 .getTempJavaCodeFragmentFiles();
         YangNode augmentedNode;
-        JavaQualifiedTypeInfo javaQualifiedTypeInfo;
+        JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo;
         String curNodeName;
         JavaFileInfo parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
         for (YangAtomicPath nodeId : targets) {
@@ -625,9 +625,10 @@
      * @param pluginConfig  plugin configurations
      * @return qualified type info of augmented node
      */
-    private static JavaQualifiedTypeInfo getQualifiedTypeInfoOfAugmentedNode(YangNode augmentedNode, String curNodeName,
-                                                                             YangPluginConfig pluginConfig) {
-        JavaQualifiedTypeInfo javaQualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(augmentedNode,
+    private static JavaQualifiedTypeInfoTranslator getQualifiedTypeInfoOfAugmentedNode(YangNode augmentedNode,
+                                                                                       String curNodeName,
+                                                                                       YangPluginConfig pluginConfig) {
+        JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(augmentedNode,
                 getCapitalCase(curNodeName));
         if (javaQualifiedTypeInfo.getPkgInfo() == null) {
             javaQualifiedTypeInfo.setPkgInfo(getAugmentedNodesPackage(augmentedNode,
@@ -643,9 +644,9 @@
      * @param importData            import data
      * @return true if present in imports
      */
-    private static boolean validateQualifiedInfoOfAugmentedNode(JavaQualifiedTypeInfo javaQualifiedTypeInfo,
+    private static boolean validateQualifiedInfoOfAugmentedNode(JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo,
                                                                 JavaImportData importData) {
-        for (JavaQualifiedTypeInfo curImportInfo : importData.getImportSet()) {
+        for (JavaQualifiedTypeInfoTranslator curImportInfo : importData.getImportSet()) {
             if (curImportInfo.getClassInfo()
                     .contentEquals(javaQualifiedTypeInfo.getClassInfo())) {
                 return curImportInfo.getPkgInfo()
@@ -664,7 +665,7 @@
      */
     static String getAugmentedClassNameForDataMethods(YangNode augmentedNode, YangNode parent) {
         String curNodeName;
-        JavaQualifiedTypeInfo javaQualifiedTypeInfo;
+        JavaQualifiedTypeInfoTranslator javaQualifiedTypeInfo;
         JavaFileInfo parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
         YangPluginConfig pluginConfig = parentInfo.getPluginConfig();
         TempJavaServiceFragmentFiles tempJavaServiceFragmentFiles = ((JavaCodeGeneratorInfo) parent)
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
index 9743c92..d394568 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
@@ -24,10 +24,10 @@
 import java.util.List;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yangutils.utils.io.impl.YangIoUtils;
-import org.onosproject.yangutils.utils.io.impl.YangToJavaNamingConflictUtil;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
 import static org.onosproject.yangutils.utils.UtilConstants.COLAN;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index 06a3f4b..d8ba37a 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -34,7 +34,7 @@
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yangutils.translator.tojava.TempJavaBeanFragmentFiles;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
-import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
 
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY;
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BITS;
@@ -1630,6 +1630,8 @@
                 return NEW + SPACE + BIG_DECIMAL;
             case STRING:
                 return EMPTY_STRING;
+            case IDENTITYREF:
+                return EMPTY_STRING;
             case EMPTY:
             case BOOLEAN:
                 return BOOLEAN_WRAPPER + PERIOD + PARSE_BOOLEAN;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
index af0b4e3..a674f17 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.yangutils.utils.io.impl;
 
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
+
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_FOR_VALIDATOR;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_DOC_FOR_VALIDATOR_RETURN;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
index 566e9ce..0c6b51e 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -30,6 +30,8 @@
 import java.util.regex.Pattern;
 
 import org.apache.commons.io.FileUtils;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangPluginConfig;
+import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 
 import static org.onosproject.yangutils.utils.UtilConstants.COLAN;
diff --git a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangPluginConfig.java b/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangPluginConfig.java
deleted file mode 100644
index 963bb8d..0000000
--- a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangPluginConfig.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.yangutils.utils.io.impl;
-
-/**
- * Representation of plugin configurations required for YANG utils.
- */
-public final class YangPluginConfig {
-
-    /**
-     * Contains the code generation directory.
-     */
-    private String codeGenDir;
-
-    /**
-     * Contains the code generation directory.
-     */
-    private String managerCodeGenDir;
-
-    /**
-     * Contains information of naming conflicts that can be resolved.
-     */
-    private YangToJavaNamingConflictUtil conflictResolver;
-
-    /**
-     * Creates an object for YANG plugin config.
-     */
-    public YangPluginConfig() {
-    }
-
-    /**
-     * Java code generation is for sbi.
-     */
-    private String codeGenerateForsbi;
-
-    /**
-     * Returns the string for code generation.
-     *
-     * @return returns the string for code generation.
-     */
-    public String getCodeGenerateForsbi() {
-        return codeGenerateForsbi;
-    }
-
-    /**
-     * Sets the string sbi or nbi for code generation.
-     *
-     * @param codeGenerateForsbi generation is for sbi
-     */
-    public void setCodeGenerateForsbi(String codeGenerateForsbi) {
-        this.codeGenerateForsbi = codeGenerateForsbi;
-    }
-
-    /**
-     * Sets the path of the java code where it has to be generated.
-     *
-     * @param codeGenDir path of the directory
-     */
-    public void setCodeGenDir(String codeGenDir) {
-        this.codeGenDir = codeGenDir;
-    }
-
-    /**
-     * Returns the code generation directory path.
-     *
-     * @return code generation directory
-     */
-    public String getCodeGenDir() {
-        return codeGenDir;
-    }
-
-    /**
-     * Sets the object.
-     *
-     * @param conflictResolver object of the class
-     */
-    public void setConflictResolver(YangToJavaNamingConflictUtil conflictResolver) {
-        this.conflictResolver = conflictResolver;
-    }
-
-    /**
-     * Returns the object.
-     *
-     * @return object of the class
-     */
-    public YangToJavaNamingConflictUtil getConflictResolver() {
-        return conflictResolver;
-    }
-
-    /**
-     * Returns manager's code generation directory.
-     *
-     * @return manager's code generation directory
-     */
-    public String getManagerCodeGenDir() {
-        return managerCodeGenDir;
-    }
-
-    /**
-     * Sets manager's code generation directory.
-     *
-     * @param moduleCodeGenDir manager's code generation directory
-     */
-    public void setManagerCodeGenDir(String moduleCodeGenDir) {
-        this.managerCodeGenDir = moduleCodeGenDir;
-    }
-}
diff --git a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangToJavaNamingConflictUtil.java b/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangToJavaNamingConflictUtil.java
deleted file mode 100644
index d7b32e9..0000000
--- a/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangToJavaNamingConflictUtil.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.yangutils.utils.io.impl;
-
-/**
- * Representation of YANG to java naming conflict resolver util.
- */
-public final class YangToJavaNamingConflictUtil {
-
-    /**
-     * Contains the replacement value for a period.
-     */
-    private static String replacementForPeriodInIdentifier;
-
-    /**
-     * Contains the replacement value for an underscore.
-     */
-    private static String replacementForUnderscoreInIdentifier;
-
-    /**
-     * Contains the replacement value for a hyphen.
-     */
-    private static String replacementForHyphenInIdentifier;
-
-    /**
-     * Contains the prefix value for adding with the identifier.
-     */
-    private static String prefixForIdentifier;
-
-    /**
-     * Creates an object for YANG to java naming conflict util.
-     */
-    public YangToJavaNamingConflictUtil() {
-    }
-
-    /**
-     * Sets the replacement value for a period.
-     *
-     * @param periodReplacement replacement value for period
-     */
-    public void setReplacementForPeriod(String periodReplacement) {
-        replacementForPeriodInIdentifier = periodReplacement;
-    }
-
-    /**
-     * Returns the replaced period value.
-     *
-     * @return replaced period
-     */
-    public String getReplacementForPeriod() {
-        return replacementForPeriodInIdentifier;
-    }
-
-    /**
-     * Sets the replacement value for a hyphen.
-     *
-     * @param hyphenReplacement replacement value for hyphen
-     */
-    public void setReplacementForHyphen(String hyphenReplacement) {
-        replacementForHyphenInIdentifier = hyphenReplacement;
-    }
-
-    /**
-     * Returns the replaced hyphen value.
-     *
-     * @return replaced hyphen
-     */
-    public String getReplacementForHyphen() {
-        return replacementForHyphenInIdentifier;
-    }
-
-    /**
-     * Sets the replacement value for an underscore.
-     *
-     * @param underscoreReplacement replacement value for underscore
-     */
-    public void setReplacementForUnderscore(String underscoreReplacement) {
-        replacementForUnderscoreInIdentifier = underscoreReplacement;
-    }
-
-    /**
-     * Returns the replaced underscore value.
-     *
-     * @return replaced underscore
-     */
-    public String getReplacementForUnderscore() {
-        return replacementForUnderscoreInIdentifier;
-    }
-
-    /**
-     * Sets the prefix value for adding with the identifier.
-     *
-     * @param prefix prefix for identifier
-     */
-    public void setPrefixForIdentifier(String prefix) {
-        prefixForIdentifier = prefix;
-    }
-
-    /**
-     * Returns the prefix for identifier.
-     *
-     * @return prefix for identifier
-     */
-    public String getPrefixForIdentifier() {
-        return prefixForIdentifier;
-    }
-}
