diff --git a/pom.xml b/pom.xml
index 16490c2..437e23c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -44,23 +44,17 @@
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-artifact</artifactId>
-            <version>2.0.8</version>
+            <version>3.2.5</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-project</artifactId>
-            <version>2.0.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
-            <version>1.7.0</version>
-            <scope>test</scope>
+            <version>2.2.1</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven.plugin-testing</groupId>
             <artifactId>maven-plugin-testing-harness</artifactId>
-            <version>2.1</version>
+            <version>3.3.0</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -74,12 +68,13 @@
             <version>3.2.5</version>
             <scope>test</scope>
         </dependency>
+
         <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>1.9.5</version>
-            <scope>test</scope>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <version>2.19.1</version>
         </dependency>
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -95,13 +90,15 @@
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
-            <version>1.3.2</version>
+            <version>2.2</version>
         </dependency>
+
         <dependency>
-            <groupId>commons-configuration</groupId>
-            <artifactId>commons-configuration</artifactId>
-            <version>1.10</version>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-all</artifactId>
+            <version>1.3</version>
         </dependency>
+
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onlab-junit</artifactId>
@@ -114,21 +111,6 @@
             <version>4.5</version>
         </dependency>
         <dependency>
-            <groupId>org.apache.maven.plugins</groupId>
-            <artifactId>maven-surefire-plugin</artifactId>
-            <version>2.19.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.sonatype.aether</groupId>
-            <artifactId>aether-api</artifactId>
-            <version>1.8</version>
-        </dependency>
-        <dependency>
-            <groupId>org.sonatype.aether</groupId>
-            <artifactId>aether-util</artifactId>
-            <version>1.8</version>
-        </dependency>
-        <dependency>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>build-helper-maven-plugin</artifactId>
             <version>1.10</version>
@@ -237,4 +219,5 @@
             </plugin>
         </plugins>
     </build>
+
 </project>
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java b/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
index 16735c2..073db3b 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
@@ -76,8 +76,7 @@
 /**
  * Data model node to maintain information defined in YANG augment.
  */
-public class YangAugment extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable {
+public class YangAugment extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable {
 
     /**
      * Augment target node.
@@ -92,14 +91,12 @@
     /**
      * List of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeaf> listOfLeaf;
+    private List<YangLeaf<?>> listOfLeaf;
 
     /**
      * List of leaf-lists.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeafList> listOfLeafList;
+    private List<YangLeafList<?>> listOfLeafList;
 
     /**
      * reference.
@@ -141,6 +138,7 @@
      *
      * @return the description.
      */
+    @Override
     public String getDescription() {
         return description;
     }
@@ -150,6 +148,7 @@
      *
      * @param description set the description.
      */
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
@@ -159,8 +158,8 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf() {
+    @Override
+    public List<YangLeaf<?>> getListOfLeaf() {
         return listOfLeaf;
     }
 
@@ -169,8 +168,7 @@
      *
      * @param leafsList the list of leaf to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeaf(List<YangLeaf> leafsList) {
+    private void setListOfLeaf(List<YangLeaf<?>> leafsList) {
         listOfLeaf = leafsList;
     }
 
@@ -179,10 +177,10 @@
      *
      * @param leaf the leaf to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeaf(YangLeaf<?> leaf) {
         if (getListOfLeaf() == null) {
-            setListOfLeaf(new LinkedList<YangLeaf>());
+            setListOfLeaf(new LinkedList<YangLeaf<?>>());
         }
 
         getListOfLeaf().add(leaf);
@@ -193,8 +191,8 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeafList> getListOfLeafList() {
+    @Override
+    public List<YangLeafList<?>> getListOfLeafList() {
         return listOfLeafList;
     }
 
@@ -203,8 +201,7 @@
      *
      * @param listOfLeafList the list of leaf-list to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+    private void setListOfLeafList(List<YangLeafList<?>> listOfLeafList) {
         this.listOfLeafList = listOfLeafList;
     }
 
@@ -213,10 +210,10 @@
      *
      * @param leafList the leaf-list to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeafList(YangLeafList<?> leafList) {
         if (getListOfLeafList() == null) {
-            setListOfLeafList(new LinkedList<YangLeafList>());
+            setListOfLeafList(new LinkedList<YangLeafList<?>>());
         }
 
         getListOfLeafList().add(leafList);
@@ -227,6 +224,7 @@
      *
      * @return the reference.
      */
+    @Override
     public String getReference() {
         return reference;
     }
@@ -236,6 +234,7 @@
      *
      * @param reference the reference to set.
      */
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
@@ -245,6 +244,7 @@
      *
      * @return the status.
      */
+    @Override
     public YangStatusType getStatus() {
         return status;
     }
@@ -254,6 +254,7 @@
      *
      * @param status the status to set.
      */
+    @Override
     public void setStatus(YangStatusType status) {
         this.status = status;
     }
@@ -263,6 +264,7 @@
      *
      * @return returns AUGMENT_DATA.
      */
+    @Override
     public ParsableDataType getParsableDataType() {
         return ParsableDataType.AUGMENT_DATA;
     }
@@ -272,6 +274,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnEntry() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -281,6 +284,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -324,6 +328,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
      */
+    @Override
     public void generateJavaCodeEntry() {
         // TODO Auto-generated method stub
 
@@ -332,6 +337,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeExit()
      */
+    @Override
     public void generateJavaCodeExit() {
         // TODO Auto-generated method stub
 
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java b/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
index b3a17bd..76b8ca2 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
@@ -88,8 +88,7 @@
 /**
  * Data model node to maintain information defined in YANG case.
  */
-public class YangCase extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable {
+public class YangCase extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable {
 
     /**
      * Case name.
@@ -106,14 +105,12 @@
     /**
      * List of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeaf> listOfLeaf;
+    private List<YangLeaf<?>> listOfLeaf;
 
     /**
      * List of leaf lists.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeafList> listOfLeafList;
+    private List<YangLeafList<?>> listOfLeafList;
 
     /**
      * Reference of the module.
@@ -153,6 +150,7 @@
      *
      * @return the description.
      */
+    @Override
     public String getDescription() {
         return description;
     }
@@ -162,6 +160,7 @@
      *
      * @param description set the description.
      */
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
@@ -171,8 +170,8 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf() {
+    @Override
+    public List<YangLeaf<?>> getListOfLeaf() {
         return listOfLeaf;
     }
 
@@ -181,8 +180,7 @@
      *
      * @param leafsList the list of leaf to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeaf(List<YangLeaf> leafsList) {
+    private void setListOfLeaf(List<YangLeaf<?>> leafsList) {
         listOfLeaf = leafsList;
     }
 
@@ -191,10 +189,10 @@
      *
      * @param leaf the leaf to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeaf(YangLeaf<?> leaf) {
         if (getListOfLeaf() == null) {
-            setListOfLeaf(new LinkedList<YangLeaf>());
+            setListOfLeaf(new LinkedList<YangLeaf<?>>());
         }
 
         getListOfLeaf().add(leaf);
@@ -205,8 +203,8 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeafList> getListOfLeafList() {
+    @Override
+    public List<YangLeafList<?>> getListOfLeafList() {
         return listOfLeafList;
     }
 
@@ -215,8 +213,7 @@
      *
      * @param listOfLeafList the list of leaf-list to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+    private void setListOfLeafList(List<YangLeafList<?>> listOfLeafList) {
         this.listOfLeafList = listOfLeafList;
     }
 
@@ -225,10 +222,10 @@
      *
      * @param leafList the leaf-list to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeafList(YangLeafList<?> leafList) {
         if (getListOfLeafList() == null) {
-            setListOfLeafList(new LinkedList<YangLeafList>());
+            setListOfLeafList(new LinkedList<YangLeafList<?>>());
         }
 
         getListOfLeafList().add(leafList);
@@ -239,6 +236,7 @@
      *
      * @return the reference.
      */
+    @Override
     public String getReference() {
         return reference;
     }
@@ -248,6 +246,7 @@
      *
      * @param reference the reference to set.
      */
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
@@ -257,6 +256,7 @@
      *
      * @return the status.
      */
+    @Override
     public YangStatusType getStatus() {
         return status;
     }
@@ -266,6 +266,7 @@
      *
      * @param status the status to set.
      */
+    @Override
     public void setStatus(YangStatusType status) {
         this.status = status;
     }
@@ -275,6 +276,7 @@
      *
      * @return returns CASE_DATA
      */
+    @Override
     public ParsableDataType getParsableDataType() {
         return ParsableDataType.CASE_DATA;
     }
@@ -284,6 +286,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnEntry() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -293,6 +296,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -318,6 +322,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
      */
+    @Override
     public void generateJavaCodeEntry() {
         // TODO Auto-generated method stub
 
@@ -326,6 +331,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeExit()
      */
+    @Override
     public void generateJavaCodeExit() {
         // TODO Auto-generated method stub
 
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java b/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
index 388360a..cb54cca 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
@@ -16,13 +16,17 @@
 
 package org.onosproject.yangutils.datamodel;
 
+import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
 
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
 import org.onosproject.yangutils.parser.ParsableDataType;
-import org.onosproject.yangutils.utils.io.CachedFileHandle;
+import org.onosproject.yangutils.translator.CachedFileHandle;
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax;
+import org.onosproject.yangutils.utils.io.impl.FileSystemUtil;
 /*-
  * Reference RFC 6020.
  *
@@ -105,14 +109,12 @@
     /**
      * List of leaves contained.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeaf> listOfLeaf;
+    private List<YangLeaf<?>> listOfLeaf;
 
     /**
      * List of leaf-lists contained.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeafList> listOfLeafList;
+    private List<YangLeafList<?>> listOfLeafList;
 
     /**
      * If it is a presence container, then the textual documentation of presence
@@ -186,6 +188,7 @@
      *
      * @return the description.
      */
+    @Override
     public String getDescription() {
         return description;
     }
@@ -195,6 +198,7 @@
      *
      * @param description set the description.
      */
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
@@ -204,8 +208,8 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf() {
+    @Override
+    public List<YangLeaf<?>> getListOfLeaf() {
         return listOfLeaf;
     }
 
@@ -214,8 +218,7 @@
      *
      * @param leafsList the list of leaf to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeaf(List<YangLeaf> leafsList) {
+    private void setListOfLeaf(List<YangLeaf<?>> leafsList) {
         listOfLeaf = leafsList;
     }
 
@@ -224,10 +227,10 @@
      *
      * @param leaf the leaf to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeaf(YangLeaf<?> leaf) {
         if (getListOfLeaf() == null) {
-            setListOfLeaf(new LinkedList<YangLeaf>());
+            setListOfLeaf(new LinkedList<YangLeaf<?>>());
         }
 
         getListOfLeaf().add(leaf);
@@ -238,8 +241,8 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeafList> getListOfLeafList() {
+    @Override
+    public List<YangLeafList<?>> getListOfLeafList() {
         return listOfLeafList;
     }
 
@@ -248,8 +251,7 @@
      *
      * @param listOfLeafList the list of leaf-list to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+    private void setListOfLeafList(List<YangLeafList<?>> listOfLeafList) {
         this.listOfLeafList = listOfLeafList;
     }
 
@@ -258,10 +260,10 @@
      *
      * @param leafList the leaf-list to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeafList(YangLeafList<?> leafList) {
         if (getListOfLeafList() == null) {
-            setListOfLeafList(new LinkedList<YangLeafList>());
+            setListOfLeafList(new LinkedList<YangLeafList<?>>());
         }
 
         getListOfLeafList().add(leafList);
@@ -290,6 +292,7 @@
      *
      * @return the reference.
      */
+    @Override
     public String getReference() {
         return reference;
     }
@@ -299,6 +302,7 @@
      *
      * @param reference the reference to set.
      */
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
@@ -308,6 +312,7 @@
      *
      * @return the status.
      */
+    @Override
     public YangStatusType getStatus() {
         return status;
     }
@@ -317,6 +322,7 @@
      *
      * @param status the status to set.
      */
+    @Override
     public void setStatus(YangStatusType status) {
         this.status = status;
     }
@@ -344,6 +350,7 @@
      *
      * @return returns CONTAINER_DATA.
      */
+    @Override
     public ParsableDataType getParsableDataType() {
         return ParsableDataType.CONTAINER_DATA;
     }
@@ -353,6 +360,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnEntry() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -362,6 +370,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -388,17 +397,62 @@
 
     /**
      * Generate the java code corresponding to YANG container.
+     *
+     * @throws IOException when fails to generate the source files.
      */
-    public void generateJavaCodeEntry() {
-        //TODO: autogenerated method stub, to be implemented
-    return;
+    @Override
+    public void generateJavaCodeEntry() throws IOException {
+        YangNode parent = getParent();
+        String modPkg = JavaIdentifierSyntax.getPackageFromParent(parent.getPackage(), getName());
+        setPackage(modPkg);
+
+        CachedFileHandle handle = null;
+        try {
+            FileSystemUtil.createPackage(getPackage(), getName());
+            handle = FileSystemUtil.createSourceFiles(getPackage(), getName(), GeneratedFileType.ALL);
+        } catch (IOException e) {
+            throw new IOException("Failed to create the source files.");
+        }
+        setFileHandle(handle);
+        addLavesAttributes();
+        addLeafListAttributes();
+    }
+
+    /**
+     * Adds leaf attributes in generated files.
+     */
+    private void addLavesAttributes() {
+
+        List<YangLeaf<?>> leaves = getListOfLeaf();
+        if (leaves != null) {
+            for (YangLeaf<?> leaf : leaves) {
+                getFileHandle().addAttributeInfo(leaf.getDataType(), leaf.getLeafName(), false);
+            }
+        }
+    }
+
+    /**
+     * Adds leaf list's attributes in generated files.
+     */
+    private void addLeafListAttributes() {
+        List<YangLeafList<?>> leavesList = getListOfLeafList();
+        if (leavesList != null) {
+            for (YangLeafList<?> leafList : leavesList) {
+                getFileHandle().addAttributeInfo(leafList.getDataType(), leafList.getLeafName(), true);
+            }
+        }
+        return;
+
     }
 
     /**
      * Free resources used to generate code.
+     *
+     * @throws IOException when fails to generate source files.
      */
-    public void generateJavaCodeExit() {
-          //TODO: autogenerated method stub, to be implemented
+    @Override
+    public void generateJavaCodeExit() throws IOException {
+        getFileHandle().close();
         return;
     }
 }
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java b/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java
index 9d9ffd3..27d7dc0 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangGrouping.java
@@ -75,8 +75,7 @@
 /**
  * Data model node to maintain information defined in YANG grouping.
  */
-public class YangGrouping extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable {
+public class YangGrouping extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable {
 
     /**
      * Name of the grouping.
@@ -91,14 +90,12 @@
     /**
      * List of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeaf> listOfLeaf;
+    private List<YangLeaf<?>> listOfLeaf;
 
     /**
      * List of leaf lists.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeafList> listOfLeafList;
+    private List<YangLeafList<?>> listOfLeafList;
 
     /**
      * Reference of the module.
@@ -138,6 +135,7 @@
      *
      * @return the description.
      */
+    @Override
     public String getDescription() {
         return description;
     }
@@ -147,6 +145,7 @@
      *
      * @param description set the description.
      */
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
@@ -156,8 +155,8 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf() {
+    @Override
+    public List<YangLeaf<?>> getListOfLeaf() {
         return listOfLeaf;
     }
 
@@ -166,8 +165,7 @@
      *
      * @param leafsList the list of leaf to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeaf(List<YangLeaf> leafsList) {
+    private void setListOfLeaf(List<YangLeaf<?>> leafsList) {
         listOfLeaf = leafsList;
     }
 
@@ -176,10 +174,10 @@
      *
      * @param leaf the leaf to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeaf(YangLeaf<?> leaf) {
         if (getListOfLeaf() == null) {
-            setListOfLeaf(new LinkedList<YangLeaf>());
+            setListOfLeaf(new LinkedList<YangLeaf<?>>());
         }
 
         getListOfLeaf().add(leaf);
@@ -190,8 +188,8 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeafList> getListOfLeafList() {
+    @Override
+    public List<YangLeafList<?>> getListOfLeafList() {
         return listOfLeafList;
     }
 
@@ -200,8 +198,7 @@
      *
      * @param listOfLeafList the list of leaf-list to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+    private void setListOfLeafList(List<YangLeafList<?>> listOfLeafList) {
         this.listOfLeafList = listOfLeafList;
     }
 
@@ -210,10 +207,10 @@
      *
      * @param leafList the leaf-list to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeafList(YangLeafList<?> leafList) {
         if (getListOfLeafList() == null) {
-            setListOfLeafList(new LinkedList<YangLeafList>());
+            setListOfLeafList(new LinkedList<YangLeafList<?>>());
         }
 
         getListOfLeafList().add(leafList);
@@ -224,6 +221,7 @@
      *
      * @return the reference.
      */
+    @Override
     public String getReference() {
         return reference;
     }
@@ -233,6 +231,7 @@
      *
      * @param reference the reference to set.
      */
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
@@ -242,6 +241,7 @@
      *
      * @return the status.
      */
+    @Override
     public YangStatusType getStatus() {
         return status;
     }
@@ -251,6 +251,7 @@
      *
      * @param status the status to set.
      */
+    @Override
     public void setStatus(YangStatusType status) {
         this.status = status;
     }
@@ -260,6 +261,7 @@
      *
      * @return returns GROUPING_DATA.
      */
+    @Override
     public ParsableDataType getParsableDataType() {
         return ParsableDataType.GROUPING_DATA;
     }
@@ -269,6 +271,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnEntry() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -278,6 +281,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -285,6 +289,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
      */
+    @Override
     public void generateJavaCodeEntry() {
         // TODO Auto-generated method stub
 
@@ -293,6 +298,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeExit()
      */
+    @Override
     public void generateJavaCodeExit() {
         // TODO Auto-generated method stub
 
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java b/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java
index 917d591..ba42bfc 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangLeavesHolder.java
@@ -27,8 +27,7 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf();
+    public List<YangLeaf<?>> getListOfLeaf();
 
     /**
      * Add a leaf in data holder like container / list.
@@ -42,8 +41,7 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    List<YangLeafList> getListOfLeafList();
+    List<YangLeafList<?>> getListOfLeafList();
 
     /**
      * Add a leaf-list in data holder like container / list.
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangList.java b/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
index d75c09d..e09b94c 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
@@ -65,8 +65,7 @@
 /**
  * List data represented in YANG.
  */
-public class YangList extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable {
+public class YangList extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable {
 
     /**
      * name of the YANG list.
@@ -113,14 +112,12 @@
     /**
      * List of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeaf> listOfLeaf;
+    private List<YangLeaf<?>> listOfLeaf;
 
     /**
      * List of leaf-lists.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeafList> listOfLeafList;
+    private List<YangLeafList<?>> listOfLeafList;
 
     /**
      * The "max-elements" statement, which is optional, takes as an argument a
@@ -209,6 +206,7 @@
      *
      * @return the description.
      */
+    @Override
     public String getDescription() {
         return description;
     }
@@ -218,6 +216,7 @@
      *
      * @param description set the description.
      */
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
@@ -258,8 +257,8 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf() {
+    @Override
+    public List<YangLeaf<?>> getListOfLeaf() {
         return listOfLeaf;
     }
 
@@ -268,8 +267,7 @@
      *
      * @param leafsList the list of leaf to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeaf(List<YangLeaf> leafsList) {
+    private void setListOfLeaf(List<YangLeaf<?>> leafsList) {
         listOfLeaf = leafsList;
     }
 
@@ -278,10 +276,10 @@
      *
      * @param leaf the leaf to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeaf(YangLeaf<?> leaf) {
         if (getListOfLeaf() == null) {
-            setListOfLeaf(new LinkedList<YangLeaf>());
+            setListOfLeaf(new LinkedList<YangLeaf<?>>());
         }
 
         getListOfLeaf().add(leaf);
@@ -292,8 +290,8 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeafList> getListOfLeafList() {
+    @Override
+    public List<YangLeafList<?>> getListOfLeafList() {
         return listOfLeafList;
     }
 
@@ -302,8 +300,7 @@
      *
      * @param listOfLeafList the list of leaf-list to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+    private void setListOfLeafList(List<YangLeafList<?>> listOfLeafList) {
         this.listOfLeafList = listOfLeafList;
     }
 
@@ -312,10 +309,10 @@
      *
      * @param leafList the leaf-list to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeafList(YangLeafList<?> leafList) {
         if (getListOfLeafList() == null) {
-            setListOfLeafList(new LinkedList<YangLeafList>());
+            setListOfLeafList(new LinkedList<YangLeafList<?>>());
         }
 
         getListOfLeafList().add(leafList);
@@ -362,6 +359,7 @@
      *
      * @return the reference.
      */
+    @Override
     public String getReference() {
         return reference;
     }
@@ -371,6 +369,7 @@
      *
      * @param reference the reference to set.
      */
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
@@ -380,6 +379,7 @@
      *
      * @return the status.
      */
+    @Override
     public YangStatusType getStatus() {
         return status;
     }
@@ -389,6 +389,7 @@
      *
      * @param status the status to set.
      */
+    @Override
     public void setStatus(YangStatusType status) {
         this.status = status;
     }
@@ -398,6 +399,7 @@
      *
      * @return returns LIST_DATA.
      */
+    @Override
     public ParsableDataType getParsableDataType() {
         return ParsableDataType.LIST_DATA;
     }
@@ -407,6 +409,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnEntry() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -416,6 +419,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -423,6 +427,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
      */
+    @Override
     public void generateJavaCodeEntry() {
         // TODO Auto-generated method stub
 
@@ -431,6 +436,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeExit()
      */
+    @Override
     public void generateJavaCodeExit() {
         // TODO Auto-generated method stub
 
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java b/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
index 1434363..c35fafa 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
@@ -15,14 +15,18 @@
  */
 package org.onosproject.yangutils.datamodel;
 
+import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
 
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
 import org.onosproject.yangutils.parser.ParsableDataType;
+import org.onosproject.yangutils.translator.CachedFileHandle;
 import org.onosproject.yangutils.translator.CodeGenerator;
-import org.onosproject.yangutils.utils.io.CachedFileHandle;
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax;
+import org.onosproject.yangutils.utils.io.impl.FileSystemUtil;
 
 /*-
  * Reference:RFC 6020.
@@ -67,8 +71,7 @@
 /**
  * Data model node to maintain information defined in YANG module.
  */
-public class YangModule extends YangNode
-        implements YangLeavesHolder, YangDesc, YangReference, Parsable, CodeGenerator {
+public class YangModule extends YangNode implements YangLeavesHolder, YangDesc, YangReference, Parsable, CodeGenerator {
 
     /**
      * Name of the module.
@@ -109,14 +112,12 @@
     /**
      * List of leaves at root level in the module.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeaf> listOfLeaf;
+    private List<YangLeaf<?>> listOfLeaf;
 
     /**
      * List of leaf-lists at root level in the module.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeafList> listOfLeafList;
+    private List<YangLeafList<?>> listOfLeafList;
 
     /**
      * Name space of the module.
@@ -209,6 +210,7 @@
      *
      * @return the description of YANG module.
      */
+    @Override
     public String getDescription() {
         return description;
     }
@@ -218,6 +220,7 @@
      *
      * @param description set the description of YANG module.
      */
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
@@ -294,8 +297,8 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf() {
+    @Override
+    public List<YangLeaf<?>> getListOfLeaf() {
         return listOfLeaf;
     }
 
@@ -304,8 +307,7 @@
      *
      * @param leafsList the list of leaf to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeaf(List<YangLeaf> leafsList) {
+    private void setListOfLeaf(List<YangLeaf<?>> leafsList) {
         listOfLeaf = leafsList;
     }
 
@@ -314,10 +316,10 @@
      *
      * @param leaf the leaf to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeaf(YangLeaf<?> leaf) {
         if (getListOfLeaf() == null) {
-            setListOfLeaf(new LinkedList<YangLeaf>());
+            setListOfLeaf(new LinkedList<YangLeaf<?>>());
         }
 
         getListOfLeaf().add(leaf);
@@ -328,8 +330,8 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeafList> getListOfLeafList() {
+    @Override
+    public List<YangLeafList<?>> getListOfLeafList() {
         return listOfLeafList;
     }
 
@@ -338,8 +340,7 @@
      *
      * @param listOfLeafList the list of leaf-list to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+    private void setListOfLeafList(List<YangLeafList<?>> listOfLeafList) {
         this.listOfLeafList = listOfLeafList;
     }
 
@@ -348,10 +349,10 @@
      *
      * @param leafList the leaf-list to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeafList(YangLeafList<?> leafList) {
         if (getListOfLeafList() == null) {
-            setListOfLeafList(new LinkedList<YangLeafList>());
+            setListOfLeafList(new LinkedList<YangLeafList<?>>());
         }
 
         getListOfLeafList().add(leafList);
@@ -416,6 +417,7 @@
      *
      * @return the reference.
      */
+    @Override
     public String getReference() {
         return reference;
     }
@@ -425,6 +427,7 @@
      *
      * @param reference the reference to set.
      */
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
@@ -508,6 +511,7 @@
      *
      * @return returns MODULE_DATA.
      */
+    @Override
     public ParsableDataType getParsableDataType() {
         return ParsableDataType.MODULE_DATA;
     }
@@ -517,6 +521,7 @@
      *
      * @throws DataModelException a violation of data model rules
      */
+    @Override
     public void validateDataOnEntry() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -526,24 +531,67 @@
      *
      * @throws DataModelException a violation of data model rules
      */
+    @Override
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
 
     /**
      * Generates java code for module.
+     *
+     * @throws IOException when fails to generate the source files.
      */
-    public void generateJavaCodeEntry() {
-        //TODO: autogenerated method stub, to be implemented
+    @Override
+    public void generateJavaCodeEntry() throws IOException {
+        String modPkg = JavaIdentifierSyntax.getRootPackage(getVersion(), getNameSpace().getUri(),
+                getRevision().getRevDate());
+        setPackage(modPkg);
 
-        return;
+        CachedFileHandle handle = null;
+        try {
+            FileSystemUtil.createPackage(getPackage(), getName());
+            handle = FileSystemUtil.createSourceFiles(getPackage(), getName(), GeneratedFileType.ALL);
+        } catch (IOException e) {
+            throw new IOException("Failed to create the source files.");
+        }
+        setFileHandle(handle);
+        addLavesAttributes();
+        addLeafListAttributes();
+    }
+
+    /**
+     * Adds leaf attributes in generated files.
+     */
+    private void addLavesAttributes() {
+
+        List<YangLeaf<?>> leaves = getListOfLeaf();
+        if (leaves != null) {
+            for (YangLeaf<?> leaf : leaves) {
+                getFileHandle().addAttributeInfo(leaf.getDataType(), leaf.getLeafName(), false);
+            }
+        }
+    }
+
+    /**
+     * Adds leaf list's attributes in generated files.
+     */
+    private void addLeafListAttributes() {
+        List<YangLeafList<?>> leavesList = getListOfLeafList();
+        if (leavesList != null) {
+            for (YangLeafList<?> leafList : leavesList) {
+                getFileHandle().addAttributeInfo(leafList.getDataType(), leafList.getLeafName(), true);
+            }
+        }
     }
 
     /**
      * Free resources used to generate code.
+     *
+     * @throws IOException when fails to generate source files.
      */
-    public void generateJavaCodeExit() {
-                //TODO: autogenerated method stub, to be implemented
+    @Override
+    public void generateJavaCodeExit() throws IOException {
+        getFileHandle().close();
         return;
     }
 
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java b/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
index 163599a..36dbb23 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
@@ -72,8 +72,7 @@
 /**
  * Data model node to maintain information defined in YANG sub-module.
  */
-public class YangSubModule extends YangNode
-        implements YangLeavesHolder, YangDesc, YangReference, Parsable {
+public class YangSubModule extends YangNode implements YangLeavesHolder, YangDesc, YangReference, Parsable {
 
     /**
      * Name of sub module.
@@ -114,14 +113,12 @@
     /**
      * List of leaves at root level in the sub-module.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeaf> listOfLeaf;
+    private List<YangLeaf<?>> listOfLeaf;
 
     /**
      * List of leaf-lists at root level in the sub-module.
      */
-    @SuppressWarnings("rawtypes")
-    private List<YangLeafList> listOfLeafList;
+    private List<YangLeafList<?>> listOfLeafList;
 
     /**
      * organization owner of the sub-module.
@@ -207,6 +204,7 @@
      *
      * @return the description.
      */
+    @Override
     public String getDescription() {
         return description;
     }
@@ -216,6 +214,7 @@
      *
      * @param description set the description.
      */
+    @Override
     public void setDescription(String description) {
         this.description = description;
     }
@@ -292,8 +291,8 @@
      *
      * @return the list of leaves.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeaf> getListOfLeaf() {
+    @Override
+    public List<YangLeaf<?>> getListOfLeaf() {
         return listOfLeaf;
     }
 
@@ -302,8 +301,7 @@
      *
      * @param leafsList the list of leaf to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeaf(List<YangLeaf> leafsList) {
+    private void setListOfLeaf(List<YangLeaf<?>> leafsList) {
         listOfLeaf = leafsList;
     }
 
@@ -312,10 +310,10 @@
      *
      * @param leaf the leaf to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeaf(YangLeaf<?> leaf) {
         if (getListOfLeaf() == null) {
-            setListOfLeaf(new LinkedList<YangLeaf>());
+            setListOfLeaf(new LinkedList<YangLeaf<?>>());
         }
 
         getListOfLeaf().add(leaf);
@@ -326,8 +324,8 @@
      *
      * @return the list of leaf-list.
      */
-    @SuppressWarnings("rawtypes")
-    public List<YangLeafList> getListOfLeafList() {
+    @Override
+    public List<YangLeafList<?>> getListOfLeafList() {
         return listOfLeafList;
     }
 
@@ -336,8 +334,7 @@
      *
      * @param listOfLeafList the list of leaf-list to set.
      */
-    @SuppressWarnings("rawtypes")
-    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+    private void setListOfLeafList(List<YangLeafList<?>> listOfLeafList) {
         this.listOfLeafList = listOfLeafList;
     }
 
@@ -346,10 +343,10 @@
      *
      * @param leafList the leaf-list to be added.
      */
-    @SuppressWarnings("rawtypes")
+    @Override
     public void addLeafList(YangLeafList<?> leafList) {
         if (getListOfLeafList() == null) {
-            setListOfLeafList(new LinkedList<YangLeafList>());
+            setListOfLeafList(new LinkedList<YangLeafList<?>>());
         }
 
         getListOfLeafList().add(leafList);
@@ -378,6 +375,7 @@
      *
      * @return the reference.
      */
+    @Override
     public String getReference() {
         return reference;
     }
@@ -387,6 +385,7 @@
      *
      * @param reference the reference to set.
      */
+    @Override
     public void setReference(String reference) {
         this.reference = reference;
     }
@@ -432,6 +431,7 @@
      *
      * @return returns SUB_MODULE_DATA.
      */
+    @Override
     public ParsableDataType getParsableDataType() {
         return ParsableDataType.SUB_MODULE_DATA;
     }
@@ -441,6 +441,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnEntry() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -450,6 +451,7 @@
      *
      * @throws DataModelException a violation of data model rules.
      */
+    @Override
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
@@ -457,6 +459,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
      */
+    @Override
     public void generateJavaCodeEntry() {
         // TODO Auto-generated method stub
 
@@ -465,6 +468,7 @@
     /* (non-Javadoc)
      * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeExit()
      */
+    @Override
     public void generateJavaCodeExit() {
         // TODO Auto-generated method stub
 
diff --git a/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index b8c9f35..8db668c 100644
--- a/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -24,24 +24,26 @@
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.plugins.annotations.Component;
-import org.sonatype.plexus.build.incremental.BuildContext;
-
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.parser.YangUtilsParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
+import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
+import org.onosproject.yangutils.utils.UtilConstants;
+import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
 import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
+import org.onosproject.yangutils.utils.io.impl.YangIoUtils;
+import org.sonatype.plexus.build.incremental.BuildContext;
 
 /**
- * ONOS YANG utility maven plugin.
- * Goal of plugin is yang2java
- * Execution phase in generate-sources
- * requiresDependencyResolution at compile time
+ * ONOS YANG utility maven plugin. Goal of plugin is yang2java Execution phase
+ * in generate-sources requiresDependencyResolution at compile time
  */
 @Mojo(name = "yang2java", defaultPhase = LifecyclePhase.GENERATE_SOURCES,
 requiresDependencyResolution = ResolutionScope.COMPILE, requiresProject = true)
@@ -71,24 +73,32 @@
     @Component
     private BuildContext context;
 
-    private YangUtilsParser yangUtilsParser;
+    private YangUtilsParser yangUtilsParser = new YangUtilsParserManager();
     private String baseDir;
     private String searchDir;
 
     /**
      * Set current project.
      *
-     * @param project maven project.
+     * @param curProject maven project.
      */
-    public void setCurrentProject(final MavenProject project) {
-        this.project = project;
+    public void setCurrentProject(final MavenProject curProject) {
+        project = curProject;
     }
 
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
 
         try {
+
+            CopyrightHeader.parseCopyrightHeader();
             baseDir = project.getBasedir().toString();
+
+            /**
+             * For deleting the generated code in previous build.
+             */
+            YangIoUtils.clean(baseDir);
+
             searchDir = baseDir + File.separator + yangFilesDir;
 
             List<String> yangFiles = YangFileScanner.getYangFiles(searchDir);
@@ -97,13 +107,25 @@
                 String yangFile = yangFileIterator.next();
                 try {
                     YangNode yangNode = yangUtilsParser.getDataModel(yangFile);
-                    //TODO: send this data model to translator and create the corresponding java files.
+                    JavaCodeGenerator.generateJavaCode(yangNode);
                 } catch (ParserException e) {
-                    getLog().info("Invalid yang file.");
+                    String logInfo = "Error in file: " + e.getFileName();
+                    if (e.getLineNumber() != 0) {
+                        logInfo = logInfo + " at line: " + e.getLineNumber() + " at position: "
+                                + e.getCharPositionInLine();
+
+                    }
+                    if (e.getMessage() != null) {
+                        logInfo = logInfo + "\n" + e.getMessage();
+                    }
+                    getLog().info(logInfo);
                 }
             }
+
+            YangIoUtils.addToSource(baseDir + File.separator + UtilConstants.YANG_GEN_DIR, project, context);
         } catch (final IOException e) {
-            getLog().info("Exception occured");
+            getLog().info("IOException occured");
         }
     }
+
 }
\ No newline at end of file
diff --git a/src/main/java/org/onosproject/yangutils/translator/CachedFileHandle.java b/src/main/java/org/onosproject/yangutils/translator/CachedFileHandle.java
new file mode 100644
index 0000000..cd5fa81
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/CachedFileHandle.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016 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;
+
+import java.io.IOException;
+
+import org.onosproject.yangutils.datamodel.YangType;
+
+/**
+ * Cached java file handle, which supports the addition of member attributes and
+ * methods.
+ */
+public interface CachedFileHandle {
+
+    /**
+     * Add a new attribute to the file(s).
+     *
+     * @param attrType data type of the added attribute.
+     * @param name name of the attribute.
+     * @param isListAttr if the current added attribute needs to be maintained
+     *            in a list.
+     */
+    void addAttributeInfo(YangType<?> attrType, String name, boolean isListAttr);
+
+    /**
+     * Flushes the cached contents to the target file, frees used resources.
+     *
+     * @throws IOException when failes to generated java files.
+     */
+    void close() throws IOException;
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/CodeGenerator.java b/src/main/java/org/onosproject/yangutils/translator/CodeGenerator.java
index b0ed97c..ec5a0e5 100644
--- a/src/main/java/org/onosproject/yangutils/translator/CodeGenerator.java
+++ b/src/main/java/org/onosproject/yangutils/translator/CodeGenerator.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.yangutils.translator;
 
+import java.io.IOException;
+
 /**
  * Abstraction of an entity which provides Code generator functionalities.
  */
@@ -23,12 +25,16 @@
 
     /**
      * Traverse the schema of application and generate corresponding code.
+     *
+     * @throws IOException when fails to translate the data model tree.
      */
-    void generateJavaCodeEntry();
+    void generateJavaCodeEntry() throws IOException;
 
     /**
      * Traverse the schema of application and generate corresponding code.
+     *
+     * @throws IOException when fails to generate java code.
      */
-    void generateJavaCodeExit();
+    void generateJavaCodeExit() throws IOException;
 
 }
diff --git a/src/main/java/org/onosproject/yangutils/translator/GeneratedFileType.java b/src/main/java/org/onosproject/yangutils/translator/GeneratedFileType.java
index 6a285c7..b623fb1 100644
--- a/src/main/java/org/onosproject/yangutils/translator/GeneratedFileType.java
+++ b/src/main/java/org/onosproject/yangutils/translator/GeneratedFileType.java
@@ -1,16 +1,19 @@
-/*Copyright 2016.year Open Networking Laboratory
+/*
+ * Copyright 2016 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.
+ */
 
-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;
 
 /**
@@ -18,17 +21,27 @@
  */
 public enum GeneratedFileType {
     /**
-     * interface file.
+     * Interface file.
      */
     INTERFACE,
 
     /**
-     * class file.
+     * Builder class file.
      */
     BUILDER_CLASS,
 
     /**
+     * Builder interface file.
+     */
+    BUILDER_INTERFACE,
+
+    /**
+     * Impl class file.
+     */
+    IMPL,
+
+    /**
      * interface and class file.
      */
-    BOTH
+    ALL
 }
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/AttributeInfo.java b/src/main/java/org/onosproject/yangutils/translator/tojava/AttributeInfo.java
new file mode 100644
index 0000000..c61c96c
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/AttributeInfo.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2016 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.datamodel.YangType;
+
+/**
+ * Maintains the attribute info corresponding to class/interface generated.
+ */
+public class AttributeInfo implements Serializable {
+
+    /**
+     * version of serialized info.
+     */
+    private static final long serialVersionUID = 201602151004L;
+
+    /**
+     * The data type info of attribute.
+     */
+    private YangType<?> attrType;
+
+    /**
+     * Name of the attribute.
+     */
+    private String name;
+
+    /**
+     * If the added attribute is a list of info.
+     */
+    private boolean isListAttr;
+
+    /**
+     * If the added attribute has to be accessed in a fully qualified manner.
+     */
+    private boolean isQualifiedName;
+
+    /**
+     * Default constructor.
+     */
+    public AttributeInfo() {
+    }
+
+    /**
+     * Get the data type info of attribute.
+     *
+     * @return the data type info of attribute.
+     */
+    public YangType<?> getAttributeType() {
+        return attrType;
+    }
+
+    /**
+     * Set the data type info of attribute.
+     *
+     * @param type the data type info of attribute.
+     */
+    public void setAttributeType(YangType<?> type) {
+        attrType = type;
+    }
+
+    /**
+     * Get name of the attribute.
+     *
+     * @return name of the attribute.
+     */
+    public String getAttributeName() {
+        return name;
+    }
+
+    /**
+     * Set name of the attribute.
+     *
+     * @param attrName name of the attribute.
+     */
+    public void setAttributeName(String attrName) {
+        name = attrName;
+    }
+
+    /**
+     * Get if the added attribute is a list of info.
+     *
+     * @return the if the added attribute is a list of info.
+     */
+    public boolean isListAttr() {
+        return isListAttr;
+    }
+
+    /**
+     * Set if the added attribute is a list of info.
+     *
+     * @param isList if the added attribute is a list of info.
+     */
+    public void setListAttr(boolean isList) {
+        isListAttr = isList;
+    }
+
+    /**
+     * Get if the added attribute has to be accessed in a fully qualified
+     * manner.
+     *
+     * @return the if the added attribute has to be accessed in a fully
+     *         qualified manner.
+     */
+    public boolean isQualifiedName() {
+        return isQualifiedName;
+    }
+
+    /**
+     * Set if the added attribute has to be accessed in a fully qualified
+     * manner.
+     *
+     * @param isQualified if the added attribute has to be accessed in a fully
+     *            qualified manner.
+     */
+    public void setQualifiedName(boolean isQualified) {
+        isQualifiedName = isQualified;
+    }
+
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/CachedJavaFileHandle.java b/src/main/java/org/onosproject/yangutils/translator/tojava/CachedJavaFileHandle.java
new file mode 100644
index 0000000..86656e9
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/CachedJavaFileHandle.java
@@ -0,0 +1,652 @@
+/*
+ * Copyright 2016 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.File;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.translator.CachedFileHandle;
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen;
+import org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax;
+import org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator;
+import org.onosproject.yangutils.utils.UtilConstants;
+import org.onosproject.yangutils.utils.io.impl.FileSystemUtil;
+import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
+import org.onosproject.yangutils.utils.io.impl.SerializedDataStore;
+import org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType;
+import org.onosproject.yangutils.utils.io.impl.CopyrightHeader;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.slf4j.Logger;
+
+/**
+ * Maintain the information about the java file to be generated.
+ */
+public class CachedJavaFileHandle implements CachedFileHandle {
+
+    private static final Logger log = getLogger(CachedJavaFileHandle.class);
+
+    private static final int MAX_CACHABLE_ATTR = 64;
+    private static final String JAVA_FILE_EXTENSION = ".java";
+    private static final String TEMP_FILE_EXTENSION = ".tmp";
+
+    /**
+     * The type(s) of java source file(s) to be generated when the cached file
+     * handle is closed.
+     */
+    private GeneratedFileType genFileTypes;
+
+    /**
+     * The type(s) of java method to be generated when the cached file handle is
+     * closed.
+     */
+    private GeneratedMethodTypes genMethodTypes;
+
+    /**
+     * Java package in which the class/interface needs to be generated.
+     */
+    private String pkg;
+
+    /**
+     * Name of the object in YANG file.
+     */
+    private String yangName;
+
+    /**
+     * Sorted set of import info, to be used to maintain the set of classes to
+     * be imported in the generated class.
+     */
+    private SortedSet<ImportInfo> importSet;
+
+    /**
+     * Cached list of attribute info.
+     */
+    private List<AttributeInfo> attributeList;
+
+    /**
+     * Prevent invoking default constructor.
+     */
+    private CachedJavaFileHandle() {
+        setCachedAttributeList(new LinkedList<AttributeInfo>());
+    }
+
+    /**
+     * Create a cached file handle which takes care of adding attributes to the
+     * generated java file.
+     *
+     * @param pcg package in which class/interface need to be generated.
+     * @param yangName name of the attribute in YANG file.
+     * @param types the types of files that needs to be generated.
+     * @throws IOException file IO exception.
+     */
+    public CachedJavaFileHandle(String pcg, String yangName, GeneratedFileType types) throws IOException {
+        if ((new File(pcg).exists())) {
+            setGeneratedFileTypes(types);
+            setPackage(pcg);
+            setYangName(yangName);
+        } else {
+            FileSystemUtil.createPackage(pcg, yangName);
+            setGeneratedFileTypes(types);
+            setPackage(pcg);
+            setYangName(yangName);
+        }
+    }
+
+    /**
+     * Get the types of files being generated corresponding to the YANG
+     * definition.
+     *
+     * @return the types of files being generated corresponding to the YANG
+     *         definition.
+     */
+    public GeneratedFileType getGeneratedFileTypes() {
+        return genFileTypes;
+    }
+
+    /**
+     * Set 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(GeneratedFileType fileTypes) {
+        genFileTypes = fileTypes;
+    }
+
+    /**
+     * Get the corresponding name defined in YANG.
+     *
+     * @return the corresponding name defined in YANG.
+     */
+    public String getYangName() {
+        return yangName;
+    }
+
+    /**
+     * Set the corresponding name defined in YANG.
+     *
+     * @param yangName the corresponding name defined in YANG.
+     */
+    public void setYangName(String yangName) {
+        this.yangName = yangName;
+    }
+
+    /**
+     * Get the java package.
+     *
+     * @return the java package.
+     */
+    public String getPackage() {
+        return pkg;
+    }
+
+    /**
+     * Set the java package.
+     *
+     * @param pcg the package to set
+     */
+    public void setPackage(String pcg) {
+        pkg = pcg;
+    }
+
+    /**
+     * Get the set containing the imported class/interface info.
+     *
+     * @return the set containing the imported class/interface info.
+     */
+    public SortedSet<ImportInfo> getImportSet() {
+        return importSet;
+    }
+
+    /**
+     * Assign the set containing the imported class/interface info.
+     *
+     * @param importSet the set containing the imported class/interface info.
+     */
+    private void setImportSet(SortedSet<ImportInfo> importSet) {
+        this.importSet = importSet;
+    }
+
+    /**
+     * Add an imported class/interface info is it is not already part of the
+     * set. If already part of the set, return false, else add to set and return
+     * true.
+     *
+     * @param importInfo class/interface info being imported.
+     * @return status of new addition of class/interface to the import set
+     */
+    public boolean addImportInfo(ImportInfo importInfo) {
+        /*
+         * implement the import info adding. The return value will be used to
+         * check if the qualified name will be used or class/interface name will
+         * be used in the generated class.
+         */
+        if (getImportSet() == null) {
+            setImportSet(new TreeSet<ImportInfo>());
+        }
+        return getImportSet().add(importInfo);
+    }
+
+    /**
+     * Get the list of cached attribute list.
+     *
+     * @return the set containing the imported class/interface info.
+     */
+    public List<AttributeInfo> getCachedAttributeList() {
+        return attributeList;
+    }
+
+    /**
+     * Set the cached attribute list.
+     *
+     * @param attrList attribute list.
+     */
+    private void setCachedAttributeList(List<AttributeInfo> attrList) {
+        attributeList = attrList;
+    }
+
+    /**
+     * Flush the cached attribute list to the serialized file.
+     */
+    private void flushCacheAttrToSerFile() {
+
+        for (AttributeInfo attr : getCachedAttributeList()) {
+            parseAttributeInfo(attr);
+        }
+
+        /*
+         * clear the contents from the cached attribute list.
+         */
+        getCachedAttributeList().clear();
+    }
+
+    /**
+     * Add a new attribute to the file(s).
+     *
+     * @param attrType data type of the added attribute.
+     * @param name name of the attribute.
+     * @param isListAttr if the current added attribute needs to be maintained
+     *            in a list.
+     */
+    @Override
+    public void addAttributeInfo(YangType<?> attrType, String name, boolean isListAttr) {
+
+        AttributeInfo newAttr = new AttributeInfo();
+        attrType.setDataTypeName(attrType.getDataTypeName().replace("\"", ""));
+        if (attrType.getDataTypeName().equals("string")) {
+            attrType.setDataTypeName(
+                    attrType.getDataTypeName().substring(0, 1).toUpperCase() + attrType.getDataTypeName().substring(1));
+        }
+        newAttr.setAttributeType(attrType);
+        newAttr.setAttributeName(name);
+        newAttr.setListAttr(isListAttr);
+
+        /*
+         * TODO: get the prefix and name of data type from attrType and
+         * initialize in importInfo.
+         */
+
+        /**
+         * TODO: Handle QualifiedFlag for imports.
+         */
+
+        if (getCachedAttributeList() != null) {
+            if (getCachedAttributeList().size() == MAX_CACHABLE_ATTR) {
+                flushCacheAttrToSerFile();
+            }
+            getCachedAttributeList().add(newAttr);
+        } else {
+            List<AttributeInfo> newAttributeInfo = new LinkedList<>();
+            newAttributeInfo.add(newAttr);
+            setCachedAttributeList(newAttributeInfo);
+        }
+        name = JavaIdentifierSyntax.getCamelCase(name);
+    }
+
+    /**
+     * Flushes the cached contents to the target file, frees used resources.
+     */
+    @Override
+    public void close() throws IOException {
+
+        String className = getYangName();
+        className = (className.substring(0, 1).toUpperCase() + className.substring(1));
+        String packagePath = getPackage();
+        String filePath = UtilConstants.YANG_GEN_DIR + packagePath.replace(".", "/");
+        GeneratedFileType fileType = getGeneratedFileTypes();
+
+        /**
+         * Create interface file.
+         */
+        String interfaceFileName = className + JAVA_FILE_EXTENSION;
+        File interfaceFile = new File(filePath + File.separator + interfaceFileName);
+
+        /**
+         * Create temp builder interface file.
+         */
+        String builderInterfaceFileName = interfaceFileName + TEMP_FILE_EXTENSION;
+        File builderInterfaceFile = new File(filePath + File.separator + builderInterfaceFileName);
+
+        /**
+         * Create builder class file.
+         */
+        String builderFileName = className + UtilConstants.BUILDER + JAVA_FILE_EXTENSION;
+        File builderFile = new File(filePath + File.separator + builderFileName);
+        MethodsGenerator.setBuilderClassName(className + UtilConstants.BUILDER);
+
+        /**
+         * Create temp impl class file.
+         */
+
+        String implFileName = className + UtilConstants.IMPL + TEMP_FILE_EXTENSION;
+        File implTempFile = new File(filePath + File.separator + implFileName);
+
+        if (fileType.equals(GeneratedFileType.INTERFACE) || fileType.equals(GeneratedFileType.ALL)) {
+
+            try {
+                interfaceFile.createNewFile();
+                appendContents(interfaceFile, className, GeneratedFileType.INTERFACE);
+            } catch (IOException e) {
+                throw new IOException("Failed to create interface file.");
+            }
+        }
+
+        if (fileType.equals(GeneratedFileType.BUILDER_CLASS) || fileType.equals(GeneratedFileType.ALL)) {
+
+            try {
+                builderFile.createNewFile();
+                appendContents(builderFile, className, GeneratedFileType.BUILDER_CLASS);
+            } catch (IOException e) {
+                throw new IOException("Failed to create builder class file.");
+            }
+        }
+
+        if (fileType.equals(GeneratedFileType.IMPL) || fileType.equals(GeneratedFileType.ALL)) {
+
+            try {
+                implTempFile.createNewFile();
+                appendContents(implTempFile, className, GeneratedFileType.IMPL);
+            } catch (IOException e) {
+                throw new IOException("Failed to create impl class file.");
+            }
+        }
+
+        if (fileType.equals(GeneratedFileType.BUILDER_INTERFACE) || fileType.equals(GeneratedFileType.ALL)) {
+
+            try {
+                builderInterfaceFile.createNewFile();
+                appendContents(builderInterfaceFile, className, GeneratedFileType.BUILDER_INTERFACE);
+            } catch (IOException e) {
+                throw new IOException("Failed to create builder interface class file.");
+            }
+        }
+        /*
+         * TODO: add the file header using
+         * JavaCodeSnippetGen.getFileHeaderComment
+         */
+        /*
+         * TODO: get the import list using getImportText and add to the
+         * generated java file using JavaCodeSnippetGen.getImportText
+         */
+
+        List<String> attributes = new LinkedList<>();
+        List<String> interfaceMethods = new LinkedList<>();
+        List<String> builderInterfaceMethods = new LinkedList<>();
+        List<String> builderClassMethods = new LinkedList<>();
+        List<String> implClassMethods = new LinkedList<>();
+        //TODO: Handle imports for the attributes.
+        try {
+            attributes = SerializedDataStore.getSerializeData(SerializedDataStore.SerializedDataStoreType.ATTRIBUTE);
+
+            interfaceMethods = SerializedDataStore
+                    .getSerializeData(SerializedDataStore.SerializedDataStoreType.INTERFACE_METHODS);
+
+            builderInterfaceMethods = SerializedDataStore
+                    .getSerializeData(SerializedDataStore.SerializedDataStoreType.BUILDER_INTERFACE_METHODS);
+
+            builderClassMethods = SerializedDataStore
+                    .getSerializeData(SerializedDataStore.SerializedDataStoreType.BUILDER_METHODS);
+
+            implClassMethods = SerializedDataStore
+                    .getSerializeData(SerializedDataStore.SerializedDataStoreType.IMPL_METHODS);
+
+            //TODO:imports = SerializedDataStore.getSerializeData(SerializedDataStore.SerializedDataStoreType.IMPORT);
+        } catch (ClassNotFoundException | IOException e) {
+            log.info("There is no attribute info of " + className + " YANG file in the serialized files.");
+        }
+
+        if (getCachedAttributeList() != null) {
+            MethodsGenerator.setAttrInfo(getCachedAttributeList());
+            for (AttributeInfo attr : getCachedAttributeList()) {
+                attributes.add(getAttributeString(attr));
+
+                interfaceMethods.add(MethodsGenerator.getMethodString(attr, GeneratedFileType.INTERFACE));
+
+                builderClassMethods.add(MethodsGenerator.getMethodString(attr, GeneratedFileType.BUILDER_CLASS));
+
+                builderInterfaceMethods
+                .add(MethodsGenerator.getMethodString(attr, GeneratedFileType.BUILDER_INTERFACE));
+
+                implClassMethods.add(MethodsGenerator.getMethodString(attr, GeneratedFileType.IMPL));
+            }
+        }
+
+        builderInterfaceMethods.add(MethodsGenerator.parseBuilderInterfaceBuildMethodString(className));
+        builderClassMethods.add(UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
+                + MethodsGenerator.getDefaultConstructorString(GeneratedFileType.BUILDER_CLASS, className));
+        builderClassMethods.add(MethodsGenerator.getBuildString(className));
+
+        implClassMethods.add(UtilConstants.JAVA_DOC_FIRST_LINE
+                + MethodsGenerator.getDefaultConstructorString(GeneratedFileType.IMPL, className));
+        implClassMethods.add(MethodsGenerator.getConstructorString(className));
+
+        /**
+         * Add attributes to the file.
+         */
+        for (String attribute : attributes) {
+            insert(builderFile, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
+            insert(implTempFile, UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + attribute);
+        }
+
+        insert(builderFile, UtilConstants.NEW_LINE);
+        insert(implTempFile, UtilConstants.NEW_LINE);
+
+        /**
+         * Add getter methods to interface file.
+         */
+        for (String method : interfaceMethods) {
+            appendMethod(interfaceFile, method + UtilConstants.NEW_LINE);
+        }
+
+        /**
+         * Add getters and setters in builder interface.
+         */
+        for (String method : builderInterfaceMethods) {
+            appendMethod(builderInterfaceFile, UtilConstants.FOUR_SPACE_INDENTATION + method + UtilConstants.NEW_LINE);
+        }
+
+        insert(builderInterfaceFile, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
+        /**
+         * Add methods in builder class.
+         */
+        for (String method : builderClassMethods) {
+            appendMethod(builderFile, method + UtilConstants.NEW_LINE);
+        }
+
+        /**
+         * Add methods in impl class.
+         */
+        for (String method : implClassMethods) {
+            appendMethod(implTempFile, UtilConstants.FOUR_SPACE_INDENTATION + method + UtilConstants.NEW_LINE);
+        }
+
+        insert(implTempFile, UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE);
+
+        /**
+         * Append builder interface file to interface file and close it.
+         */
+        appendFileContents(builderInterfaceFile, interfaceFile);
+        insert(interfaceFile, closeFile(GeneratedFileType.INTERFACE, interfaceFileName));
+
+        /**
+         * Append impl class to builder class and close it.
+         */
+        appendFileContents(implTempFile, builderFile);
+        insert(builderFile, closeFile(GeneratedFileType.BUILDER_CLASS, builderFileName));
+
+        /**
+         * Remove temp files.
+         */
+        clean(implTempFile);
+        clean(builderInterfaceFile);
+    }
+
+    /**
+     * Appends the temp files to main files.
+     *
+     * @param appendFile temp file
+     * @param srcFile main file
+     */
+    private static void appendFileContents(File appendFile, File srcFile) throws IOException {
+        try {
+            FileSystemUtil.appendFileContents(appendFile, srcFile);
+        } catch (IOException e) {
+            throw new IOException("Failed to append " + appendFile + " in " + srcFile);
+        }
+    }
+
+    /**
+     * Append methods to the generated files.
+     *
+     * @param file file in which method needs to be appended.
+     * @param method method which needs to be appended.
+     */
+    private static void appendMethod(File file, String method) throws IOException {
+        insert(file, method);
+    }
+
+    /**
+     * Closes the current generated file.
+     *
+     * @param fileType generate file type
+     * @param yangName file name
+     * @return end of class definition string.
+     */
+    private static String closeFile(GeneratedFileType fileType, String yangName) {
+        return JavaCodeSnippetGen.getJavaClassDefClose(fileType, yangName);
+    }
+
+    /**
+     * Parses attribute info and fetch specific data and creates serialized
+     * files of it.
+     *
+     * @param attr attribute info.
+     */
+    private void parseAttributeInfo(AttributeInfo attr) {
+
+        String attrString = "";
+        String methodString = "";
+        String getterString = "";
+
+        try {
+            /*
+             * Serialize attributes.
+             */
+            attrString = getAttributeString(attr);
+            attrString = attrString.replace("\"", "");
+            SerializedDataStore.setSerializeData(attrString, SerializedDataStore.SerializedDataStoreType.ATTRIBUTE);
+
+            if (getGeneratedFileTypes().equals(GeneratedFileType.ALL)) {
+
+                methodString = MethodsGenerator.getMethodString(attr, GeneratedFileType.INTERFACE);
+                SerializedDataStore.setSerializeData(methodString,
+                        SerializedDataStore.SerializedDataStoreType.INTERFACE_METHODS);
+
+                methodString = MethodsGenerator.getMethodString(attr, GeneratedFileType.BUILDER_CLASS);
+                SerializedDataStore.setSerializeData(methodString,
+                        SerializedDataStore.SerializedDataStoreType.BUILDER_METHODS);
+
+                methodString = MethodsGenerator.getMethodString(attr, GeneratedFileType.BUILDER_INTERFACE);
+                SerializedDataStore.setSerializeData(methodString,
+                        SerializedDataStore.SerializedDataStoreType.BUILDER_INTERFACE_METHODS);
+
+                methodString = MethodsGenerator.getMethodString(attr, GeneratedFileType.IMPL);
+                SerializedDataStore.setSerializeData(methodString,
+                        SerializedDataStore.SerializedDataStoreType.IMPL_METHODS);
+
+            } else if (getGeneratedFileTypes().equals(GeneratedFileType.INTERFACE)) {
+
+                getterString = MethodsGenerator.getGetterString(attr);
+                SerializedDataStore.setSerializeData(methodString,
+                        SerializedDataStore.SerializedDataStoreType.INTERFACE_METHODS);
+            }
+        } catch (IOException e) {
+            log.info("Failed to get data for " + attr.getAttributeName() + " from serialized files.");
+        }
+    }
+
+    /**
+     * Returns attribute string.
+     *
+     * @param attr attribute info
+     * @return attribute string
+     */
+    private String getAttributeString(AttributeInfo attr) {
+        return JavaCodeSnippetGen.getJavaAttributeInfo(getGeneratedFileTypes(), attr.getAttributeName(),
+                attr.getAttributeType());
+    }
+
+    /**
+     * Appends all the contents into a generated java file.
+     *
+     * @param file generated file
+     * @param fileName generated file name
+     * @param type generated file type
+     */
+    private void appendContents(File file, String fileName, GeneratedFileType type) throws IOException {
+
+        if (type.equals(GeneratedFileType.IMPL)) {
+
+            write(file, fileName, type, JavaDocType.IMPL_CLASS);
+        } else if (type.equals(GeneratedFileType.BUILDER_INTERFACE)) {
+
+            write(file, fileName, type, JavaDocType.BUILDER_INTERFACE);
+        } else {
+
+            // TODO: handle imports for attributes.
+
+            if (type.equals(GeneratedFileType.INTERFACE)) {
+                insert(file, CopyrightHeader.getCopyrightHeader());
+                insert(file, "package" + UtilConstants.SPACE + getPackage() + UtilConstants.SEMI_COLAN
+                        + UtilConstants.NEW_LINE);
+                write(file, fileName, type, JavaDocType.INTERFACE);
+            } else if (type.equals(GeneratedFileType.BUILDER_CLASS)) {
+                insert(file, CopyrightHeader.getCopyrightHeader());
+                insert(file, "package" + UtilConstants.SPACE + getPackage() + UtilConstants.SEMI_COLAN
+                        + UtilConstants.NEW_LINE);
+                write(file, fileName, type, JavaDocType.BUILDER_CLASS);
+            }
+        }
+    }
+
+    /**
+     * Write data to the specific generated file.
+     *
+     * @param file generated file
+     * @param fileName file name
+     * @param genType generated file type
+     * @param javaDocType java doc type
+     */
+    private static void write(File file, String fileName, GeneratedFileType genType, JavaDocGen.JavaDocType javaDocType)
+            throws IOException {
+
+        insert(file, JavaDocGen.getJavaDoc(javaDocType, fileName));
+        insert(file, JavaCodeSnippetGen.getJavaClassDefStart(genType, fileName));
+    }
+
+    /**
+     * Insert in the generated file.
+     *
+     * @param file file in which need to be inserted.
+     * @param data data which need to be inserted.
+     */
+    private static void insert(File file, String data) throws IOException {
+        try {
+            FileSystemUtil.insertStringInFile(file, data);
+        } catch (IOException e) {
+            throw new IOException("Failed to insert in " + file + "file");
+        }
+    }
+
+    /**
+     * Removes temp files.
+     *
+     * @param file file to be removed.
+     */
+    private static void clean(File file) {
+        if (file.exists()) {
+            file.delete();
+        }
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/GeneratedMethodTypes.java b/src/main/java/org/onosproject/yangutils/translator/tojava/GeneratedMethodTypes.java
new file mode 100644
index 0000000..f733419
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/GeneratedMethodTypes.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016 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;
+
+/**
+ * Type of method generated.
+ */
+public enum GeneratedMethodTypes {
+    /**
+     * getter method.
+     */
+    GETTER,
+
+    /**
+     * setter method.
+     */
+    SETTER,
+
+    /**
+     * Constructor.
+     */
+    CONSTRUCTOR,
+
+    /**
+     * Build.
+     */
+    BUILD,
+
+    /**
+     * Default Constructor.
+     */
+    DEFAULT_CONSTRUCTOR
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/ImportInfo.java b/src/main/java/org/onosproject/yangutils/translator/tojava/ImportInfo.java
new file mode 100644
index 0000000..76d691d
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/ImportInfo.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2016 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.util.Objects;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Maintains the information about individual imports in the generated file.
+ */
+public class ImportInfo {
+
+    /**
+     * Package location where the imported class/interface is defined.
+     */
+    private String pkgInfo;
+
+    /**
+     * class/interface being referenced.
+     */
+    private String classInfo;
+
+    /**
+     * Default constructor.
+     */
+    public ImportInfo() {
+    }
+
+    /**
+     * Get the imported package info.
+     *
+     * @return the imported package info.
+     */
+    public String getPkgInfo() {
+        return pkgInfo;
+    }
+
+    /**
+     * Set the imported package info.
+     *
+     * @param pkgInfo the imported package info.
+     */
+    public void setPkgInfo(String pkgInfo) {
+        this.pkgInfo = pkgInfo;
+    }
+
+    /**
+     * Get the imported class/interface info.
+     *
+     * @return the imported class/interface info.
+     */
+    public String getClassInfo() {
+        return classInfo;
+    }
+
+    /**
+     * Set the imported class/interface info.
+     *
+     * @param classInfo the imported class/interface info.
+     */
+    public void setClassInfo(String classInfo) {
+        this.classInfo = classInfo;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(pkgInfo, classInfo);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ImportInfo) {
+            ImportInfo other = (ImportInfo) obj;
+            return Objects.equals(pkgInfo, other.pkgInfo) &&
+                    Objects.equals(classInfo, other.classInfo);
+        }
+        return false;
+    }
+
+    /**
+     * check if the import info matches.
+     *
+     * @param importInfo matched import
+     * @return if equal or not
+     */
+    public boolean exactMatch(ImportInfo importInfo) {
+        return equals(importInfo)
+                && Objects.equals(pkgInfo, importInfo.getPkgInfo())
+                && Objects.equals(classInfo, importInfo.getClassInfo());
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("pkgInfo", pkgInfo)
+                .add("classInfo", classInfo).toString();
+    }
+
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGenerator.java b/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGenerator.java
new file mode 100644
index 0000000..000ab8b
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGenerator.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016 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.IOException;
+
+import org.onosproject.yangutils.datamodel.YangNode;
+
+/**
+ * Implementation of Java code generator based on application schema.
+ */
+public final class JavaCodeGenerator {
+
+    /**
+     * Default constructor.
+     */
+    private JavaCodeGenerator() {
+    }
+
+    /**
+     * Generate Java code files corresponding to the YANG schema.
+     *
+     * @param rootNode root node of the data model tree.
+     * @throws IOException when fails to generate java code file the current node.
+     */
+    public static void generateJavaCode(YangNode rootNode) throws IOException {
+        YangNode curNode = rootNode;
+        TraversalType curTraversal = TraversalType.ROOT;
+
+        while (!(curNode == null)) {
+            if (curTraversal != TraversalType.PARENT) {
+                curNode.generateJavaCodeEntry();
+            }
+            if (curTraversal != TraversalType.PARENT && !(curNode.getChild() == null)) {
+                curTraversal = TraversalType.CHILD;
+                curNode = curNode.getChild();
+            } else if (!(curNode.getNextSibling() == null)) {
+                curTraversal = TraversalType.SIBILING;
+                curNode = curNode.getNextSibling();
+            } else {
+                curTraversal = TraversalType.PARENT;
+                curNode.generateJavaCodeExit();
+                curNode = curNode.getParent();
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
new file mode 100644
index 0000000..736f40c
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2016 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.utils;
+
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.utils.UtilConstants;
+
+/**
+ * Generates class definition for generated files.
+ */
+public final class ClassDefinitionGenerator {
+
+    /**
+     * Default constructor.
+     */
+    private ClassDefinitionGenerator() {
+    }
+
+    /**
+     * Generate class definition for specific classes.
+     *
+     * @param genFileTypes generated file type
+     * @param yangName class name
+     * @return class definition
+     */
+    public static String generateClassDefinition(GeneratedFileType genFileTypes, String yangName) {
+
+        /**
+         * based on the file type and the YANG name of the file, generate
+         * the class / interface definition start.
+         */
+        if (genFileTypes.equals(GeneratedFileType.INTERFACE)) {
+
+            return getInterfaceDefinition(yangName);
+        } else if (genFileTypes.equals(GeneratedFileType.BUILDER_CLASS)) {
+
+            return getBuilderClassDefinition(yangName);
+        } else if (genFileTypes.equals(GeneratedFileType.IMPL)) {
+
+            return getImplClassDefinition(yangName);
+        } else if (genFileTypes.equals(GeneratedFileType.BUILDER_INTERFACE)) {
+
+            return getBuilderInterfaceDefinition();
+        }
+        return null;
+    }
+
+    /**
+     * Returns interface file class definition.
+     *
+     * @param yangName file name
+     * @return definition
+     */
+    private static String getInterfaceDefinition(String yangName) {
+
+        return UtilConstants.PUBLIC + UtilConstants.SPACE + UtilConstants.INTERFACE + UtilConstants.SPACE + yangName
+                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns builder interface file class definition.
+     *
+     * @return definition
+     */
+    private static String getBuilderInterfaceDefinition() {
+        return UtilConstants.INTERFACE + UtilConstants.SPACE + UtilConstants.BUILDER + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns builder file class definition.
+     *
+     * @param yangName file name
+     * @return definition
+     */
+    private static String getBuilderClassDefinition(String yangName) {
+
+        return UtilConstants.PUBLIC + UtilConstants.SPACE + UtilConstants.CLASS + UtilConstants.SPACE + yangName
+                + UtilConstants.BUILDER + UtilConstants.SPACE + UtilConstants.IMPLEMENTS + UtilConstants.SPACE
+                + yangName + UtilConstants.PERIOD + UtilConstants.BUILDER + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns impl file class definition.
+     *
+     * @param yangName file name
+     * @return definition
+     */
+    private static String getImplClassDefinition(String yangName) {
+
+        return UtilConstants.PUBLIC + UtilConstants.SPACE + UtilConstants.FINAL + UtilConstants.SPACE
+                + UtilConstants.CLASS + UtilConstants.SPACE + yangName + UtilConstants.IMPL + UtilConstants.SPACE
+                + UtilConstants.IMPLEMENTS + UtilConstants.SPACE + yangName + UtilConstants.OPEN_CURLY_BRACKET
+                + UtilConstants.SPACE + UtilConstants.NEW_LINE;
+    }
+
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
new file mode 100644
index 0000000..5998342
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2016 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.utils;
+
+import java.util.List;
+import java.util.SortedSet;
+
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.translator.tojava.GeneratedMethodTypes;
+import org.onosproject.yangutils.translator.tojava.ImportInfo;
+import org.onosproject.yangutils.utils.UtilConstants;
+
+/**
+ * Utility class to generate the java snippet.
+ */
+public final class JavaCodeSnippetGen {
+
+    /**
+     * Default constructor.
+     */
+    private JavaCodeSnippetGen() {
+    }
+
+    /**
+     * Get the java file header comment.
+     *
+     * @return the java file header comment.
+     */
+    public static String getFileHeaderComment() {
+
+        /**
+         * TODO return the file header.
+         */
+        return null;
+    }
+
+    /**
+     * reorder the import list based on the ONOS import rules.
+     *
+     * @param importInfo the set of classes/interfaces to be imported.
+     * @return string of import info.
+     */
+    public List<ImportInfo> sortImportOrder(SortedSet<ImportInfo> importInfo) {
+        /* TODO: reorder the import list based on the ONOS import rules. */
+        return null;
+    }
+
+    /**
+     * Get the textual java code information corresponding to the import list.
+     *
+     * @param importInfo sorted list of import info.
+     * @return the textual java code information corresponding to the import
+     *         list.
+     */
+    public static String getImportText(List<ImportInfo> importInfo) {
+        /*
+         * TODO: get the textual java code information corresponding to the
+         * import list
+         */
+        return null;
+    }
+
+    /**
+     * Based on the file type and the YANG name of the file, generate the class
+     * / interface definition start.
+     *
+     * @param genFileTypes type of file being generated.
+     * @param yangName YANG name.
+     * @return corresponding textual java code information.
+     */
+    public static String getJavaClassDefStart(GeneratedFileType genFileTypes, String yangName) {
+        /*
+         * get the camel case name for java class / interface.
+         */
+        yangName = JavaIdentifierSyntax.getCamelCase(yangName);
+        return ClassDefinitionGenerator.generateClassDefinition(genFileTypes, yangName);
+    }
+
+    /**
+     * Get the textual java code for attribute definition in class.
+     *
+     * @param genFileTypes type of file being generated.
+     * @param yangName YANG name of the the attribute.
+     * @param type type of the the attribute.
+     * @return the textual java code for attribute definition in class.
+     */
+    public static String getJavaAttributeInfo(GeneratedFileType genFileTypes, String yangName, YangType<?> type) {
+        yangName = JavaIdentifierSyntax.getCamelCase(yangName);
+        return UtilConstants.PRIVATE + UtilConstants.SPACE + type.getDataTypeName() + UtilConstants.SPACE + yangName
+                + UtilConstants.SEMI_COLAN;
+    }
+
+    /**
+     * Based on the file type and method type(s) and the YANG name of the
+     * method, generate the method definitions(s).
+     *
+     * @param genFileTypes type of file being generated
+     * @param yangName name if the attribute whose getter / setter is required.
+     * @param methodTypes getter and / or setter type of method indicator.
+     * @param returnType type return type of the method.
+     * @return based on the file type and method type(s) the method
+     *         definitions(s).
+     */
+    public static String getJavaMethodInfo(GeneratedFileType genFileTypes, String yangName,
+            GeneratedMethodTypes methodTypes, YangType<?> returnType) {
+
+        yangName = JavaIdentifierSyntax.getCamelCase(yangName);
+        return MethodsGenerator.constructMethodInfo(genFileTypes, yangName, methodTypes, returnType);
+    }
+
+    /**
+     * Based on the file type and the YANG name of the file, generate the class
+     * / interface definition close.
+     *
+     * @param genFileTypes type of file being generated.
+     * @param yangName YANG name.
+     * @return corresponding textual java code information.
+     */
+    public static String getJavaClassDefClose(GeneratedFileType genFileTypes, String yangName) {
+
+        if (genFileTypes.equals(GeneratedFileType.INTERFACE)) {
+
+            return UtilConstants.CLOSE_CURLY_BRACKET;
+        } else if (genFileTypes.equals(GeneratedFileType.BUILDER_CLASS)) {
+
+            return UtilConstants.CLOSE_CURLY_BRACKET;
+        }
+        return null;
+    }
+
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
new file mode 100644
index 0000000..94bcfeb
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaIdentifierSyntax.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2016 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.utils;
+
+import java.util.ArrayList;
+
+import org.onosproject.yangutils.utils.UtilConstants;
+
+/**
+ * Utility Class for translating the name from YANG to java convention.
+ */
+public final class JavaIdentifierSyntax {
+
+    /**
+     * Util class, with static functions only.
+     */
+    private JavaIdentifierSyntax() {
+    }
+
+    /**
+     * Get the root package string.
+     *
+     * @param version YANG version.
+     * @param nameSpace name space of the module.
+     * @param revision revision of the module defined
+     * @return returns the root package string.
+     */
+    public static String getRootPackage(byte version, String nameSpace, String revision) {
+
+        String pkg;
+        pkg = UtilConstants.DEFAULT_BASE_PKG;
+        pkg = pkg + UtilConstants.PERIOD;
+        pkg = pkg + getYangVersion(version);
+        pkg = pkg + UtilConstants.PERIOD;
+        pkg = pkg + getPkgFromNameSpace(nameSpace);
+        pkg = pkg + UtilConstants.PERIOD;
+        pkg = pkg + getYangRevisionStr(revision);
+
+        return pkg;
+    }
+
+    /**
+     * Returns version.
+     *
+     * @param ver YANG version.
+     * @return version
+     */
+    private static String getYangVersion(byte ver) {
+        return "v" + ver;
+    }
+
+    /**
+     * Get package name from name space.
+     *
+     * @param nameSpace name space of YANG module
+     *  @return java package name as per java rules.
+     */
+    public static String getPkgFromNameSpace(String nameSpace) {
+        ArrayList<String> pkgArr = new ArrayList<String>();
+        nameSpace = nameSpace.replace("\"", "");
+
+        String[] nameSpaceArr = nameSpace.split(UtilConstants.COLAN);
+
+        for (String nameSpaceString : nameSpaceArr) {
+            pkgArr.add(nameSpaceString);
+        }
+        return getPkgFrmArr(pkgArr);
+    }
+
+    /**
+     * Returns revision string array.
+     *
+     * @param date YANG module revision
+     * @return revision string
+     */
+    public static String getYangRevisionStr(String date) {
+        String[] revisionArr = date.split(UtilConstants.HYPHEN);
+
+        String rev = "rev";
+        for (String element : revisionArr) {
+            Integer val = Integer.parseInt(element);
+            if (val < 10) {
+                rev = rev + "0";
+            }
+            rev = rev + val;
+        }
+        return rev;
+    }
+
+    /**
+     * Returns the package string.
+     *
+     * @param pkgArr package array
+     * @return package string
+     */
+    public static String getPkgFrmArr(ArrayList<String> pkgArr) {
+
+        String pkg = "";
+        int size = pkgArr.size();
+        int i = 0;
+        for (String member : pkgArr) {
+            pkg = pkg + member;
+            if (i != size - 1) {
+                pkg = pkg + UtilConstants.PERIOD;
+            }
+            i++;
+        }
+        return pkg;
+    }
+
+    /**
+     * Get the package from parent's package and string.
+     *
+     * @param parentPkg parent's package.
+     * @param childName child's name.
+     * @return package string.
+     */
+    public static String getPackageFromParent(String parentPkg, String childName) {
+        return parentPkg + UtilConstants.PERIOD + getSubPkgFromName(childName);
+    }
+
+    /**
+     * Get package sub name from YANG identifier name.
+     *
+     * @param name YANG identifier name.
+     * @return java package sub name as per java rules.
+     */
+    public static String getSubPkgFromName(String name) {
+        ArrayList<String> pkgArr = new ArrayList<String>();
+        String[] nameArr = name.split(UtilConstants.COLAN);
+
+        for (String nameString : nameArr) {
+            pkgArr.add(nameString);
+        }
+        return getPkgFrmArr(pkgArr);
+    }
+
+    /**
+     * Translate the YANG identifier name to java identifier.
+     *
+     * @param yangIdentifier identifier in YANG file.
+     * @return corresponding java identifier
+     */
+    public static String getCamelCase(String yangIdentifier) {
+        String[] strArray = yangIdentifier.split(UtilConstants.HYPHEN);
+        String camelCase = strArray[0];
+        for (int i = 1; i < strArray.length; i++) {
+            camelCase = camelCase + (strArray[i].substring(0, 1).toUpperCase() + strArray[i].substring(1));
+        }
+        return camelCase;
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
new file mode 100644
index 0000000..604caf6
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -0,0 +1,432 @@
+/*
+ * Copyright 2016 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.utils;
+
+import java.util.List;
+
+import org.onosproject.yangutils.datamodel.YangType;
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.translator.tojava.AttributeInfo;
+import org.onosproject.yangutils.translator.tojava.GeneratedMethodTypes;
+import org.onosproject.yangutils.utils.UtilConstants;
+import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
+
+/**
+ * Generated methods for generated files based on the file type.
+ */
+public final class MethodsGenerator {
+
+    private static String builderClassName;
+    private static List<AttributeInfo> attrInfo;
+
+    /**
+     * Sets the builder class name for setter methods of builder class.
+     *
+     * @param name builder class name
+     */
+    public static void setBuilderClassName(String name) {
+        builderClassName = name;
+    }
+
+    /**
+     * Sets the attribute info for the impl class's constructor method.
+     *
+     * @param attr list of attribute info
+     */
+    public static void setAttrInfo(List<AttributeInfo> attr) {
+        attrInfo = attr;
+    }
+
+    /**
+     * Returns attribute info for the impl class's constructor method.
+     *
+     * @return list of attribute info
+     */
+    public static List<AttributeInfo> getAttrInfo() {
+        return attrInfo;
+    }
+
+    /**
+     * Return the class name.
+     *
+     * @return class name
+     */
+    public static String getBuilderClassName() {
+        return builderClassName;
+    }
+
+    /**
+     * Default constructor.
+     */
+    private MethodsGenerator() {
+    }
+
+    /**
+     * Return method strings.
+     *
+     * @param attr attribute info.
+     * @param type generated file type
+     * @return method string
+     */
+    public static String getMethodString(AttributeInfo attr, GeneratedFileType type) {
+
+        if (type.equals(GeneratedFileType.BUILDER_CLASS)) {
+
+            return parseBuilderMethodString(attr);
+        } else if (type.equals(GeneratedFileType.INTERFACE)) {
+
+            return getGetterString(attr);
+        } else if (type.equals(GeneratedFileType.BUILDER_INTERFACE)) {
+
+            return parseBuilderInterfaceMethodString(attr);
+        } else if (type.equals(GeneratedFileType.IMPL)) {
+
+            return parseImplMethodString(attr);
+        }
+        return null;
+    }
+
+    /**
+     * Returns constructed method impl for specific generated file type.
+     *
+     * @param genFileTypes generated file type
+     * @param yangName class name
+     * @param methodTypes method types
+     * @param returnType return type of method
+     * @return constructed method impl
+     */
+    public static String constructMethodInfo(GeneratedFileType genFileTypes, String yangName,
+            GeneratedMethodTypes methodTypes, YangType<?> returnType) {
+
+        if (genFileTypes.equals(GeneratedFileType.INTERFACE)) {
+
+            /**
+             * If interface, only getter will be there.
+             */
+            return getGetterForInterface(yangName, returnType);
+        } else if (genFileTypes.equals(GeneratedFileType.BUILDER_INTERFACE)) {
+
+            /**
+             * If builder interface, getters and setters will be there.
+             */
+            if (methodTypes.equals(GeneratedMethodTypes.GETTER)) {
+
+                return getGetterForInterface(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.SETTER)) {
+
+                return getSetterForInterface(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.BUILD)) {
+
+                return getBuildForInterface(yangName);
+            }
+        } else if (genFileTypes.equals(GeneratedFileType.BUILDER_CLASS)) {
+
+            /**
+             * If Builder class , getters, setters ,build and default constructor impls will be there.
+             */
+            if (methodTypes.equals(GeneratedMethodTypes.GETTER)) {
+
+                return getGetterForClass(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.SETTER)) {
+
+                return getSetterForClass(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.BUILD)) {
+
+                return getBuild(yangName);
+            } else if (methodTypes.equals(GeneratedMethodTypes.DEFAULT_CONSTRUCTOR)) {
+
+                return getDefaultConstructor(yangName + UtilConstants.BUILDER);
+            }
+        } else if (genFileTypes.equals(GeneratedFileType.IMPL)) {
+
+            if (methodTypes.equals(GeneratedMethodTypes.GETTER)) {
+
+                return getGetterForClass(yangName, returnType);
+            } else if (methodTypes.equals(GeneratedMethodTypes.CONSTRUCTOR)) {
+
+                return getConstructor(yangName);
+            } else if (methodTypes.equals(GeneratedMethodTypes.DEFAULT_CONSTRUCTOR)) {
+
+                return getDefaultConstructor(yangName + UtilConstants.IMPL);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Returns the methods strings for builder class.
+     *
+     * @param attr attribute info.
+     * @return method string for builder class.
+     */
+    private static String parseBuilderMethodString(AttributeInfo attr) {
+
+        String overrideString = UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.OVERRIDE
+                + UtilConstants.NEW_LINE;
+
+        String getterString = JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS,
+                attr.getAttributeName(), GeneratedMethodTypes.GETTER, attr.getAttributeType());
+        String setterString = JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS,
+                attr.getAttributeName(), GeneratedMethodTypes.SETTER, attr.getAttributeType());
+
+        return overrideString + getterString + UtilConstants.NEW_LINE + overrideString + setterString
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns the methods strings for builder class.
+     *
+     * @param attr attribute info.
+     * @return method string for builder class.
+     */
+    private static String parseImplMethodString(AttributeInfo attr) {
+
+        return UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.OVERRIDE
+                + UtilConstants.NEW_LINE + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS,
+                        attr.getAttributeName(), GeneratedMethodTypes.GETTER, attr.getAttributeType())
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns the methods strings for builder interface.
+     *
+     * @param attr attribute info.
+     * @return method string for builder interface.
+     */
+    private static String parseBuilderInterfaceMethodString(AttributeInfo attr) {
+
+        return getGetterString(attr) + UtilConstants.NEW_LINE + getSetterString(attr);
+    }
+
+    /**
+     * Returns the methods strings for builder interface.
+     *
+     * @param name attribute name.
+     * @return method string for builder interface.
+     */
+    public static String parseBuilderInterfaceBuildMethodString(String name) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.BUILD, name) + JavaCodeSnippetGen
+                .getJavaMethodInfo(GeneratedFileType.BUILDER_INTERFACE, name, GeneratedMethodTypes.BUILD, null);
+    }
+
+    /**
+     * Returns getter string.
+     *
+     * @param attr attribute info.
+     * @return getter string
+     */
+    public static String getGetterString(AttributeInfo attr) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.GETTER, attr.getAttributeName())
+                + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.INTERFACE, attr.getAttributeName(),
+                        GeneratedMethodTypes.GETTER, attr.getAttributeType())
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns setter string.
+     *
+     * @param attr attribute info.
+     * @return setter string
+     */
+    private static String getSetterString(AttributeInfo attr) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.SETTER, attr.getAttributeName())
+                + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_INTERFACE, attr.getAttributeName(),
+                        GeneratedMethodTypes.SETTER, attr.getAttributeType());
+    }
+
+    /**
+     * Returns constructor method string.
+     *
+     * @param name class name
+     * @return constructor string
+     */
+    public static String getConstructorString(String name) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.CONSTRUCTOR, name) + JavaCodeSnippetGen
+                .getJavaMethodInfo(GeneratedFileType.IMPL, name, GeneratedMethodTypes.CONSTRUCTOR, null);
+    }
+
+    /**
+     * Returns default constructor method string.
+     *
+     * @param type generated file type
+     * @param name class name
+     * @return default constructor string
+     */
+    public static String getDefaultConstructorString(GeneratedFileType type, String name) {
+
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR, name)
+                + JavaCodeSnippetGen.getJavaMethodInfo(type, name, GeneratedMethodTypes.DEFAULT_CONSTRUCTOR, null);
+    }
+
+    /**
+     * Returns build method string.
+     *
+     * @param name class name
+     * @return build string
+     */
+    public static String getBuildString(String name) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.OVERRIDE + UtilConstants.NEW_LINE
+                + JavaCodeSnippetGen.getJavaMethodInfo(GeneratedFileType.BUILDER_CLASS, name,
+                        GeneratedMethodTypes.BUILD, null);
+    }
+
+    /**
+     * Returns the getter method strings for class file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return getter method for class.
+     */
+    private static String getGetterForClass(String yangName, YangType<?> returnType) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + returnType.getDataTypeName() + UtilConstants.SPACE + UtilConstants.GET_METHOD_PREFIX + yangName
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION
+                + UtilConstants.RETURN + UtilConstants.SPACE + yangName + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns the setter method strings for class file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return setter method for class.
+     */
+    private static String getSetterForClass(String yangName, YangType<?> returnType) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + getBuilderClassName()
+        + UtilConstants.SPACE + UtilConstants.SET_METHOD_PREFIX + yangName + UtilConstants.OPEN_PARENTHESIS
+        + returnType.getDataTypeName() + UtilConstants.SPACE + yangName + UtilConstants.CLOSE_PARENTHESIS
+        + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE
+        + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.THIS + UtilConstants.PERIOD + yangName
+        + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE + yangName + UtilConstants.SEMI_COLAN
+        + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN
+        + UtilConstants.SPACE + UtilConstants.THIS + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
+        + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns the getter method strings for interface file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return getter method for interface.
+     */
+    private static String getGetterForInterface(String yangName, YangType<?> returnType) {
+        returnType.setDataTypeName(returnType.getDataTypeName().replace("\"", ""));
+        return UtilConstants.FOUR_SPACE_INDENTATION + returnType.getDataTypeName() + UtilConstants.SPACE
+                + UtilConstants.GET_METHOD_PREFIX + yangName + UtilConstants.OPEN_PARENTHESIS
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN;
+    }
+
+    /**
+     * Returns the setter method strings for interface file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return setter method for interface.
+     */
+    private static String getSetterForInterface(String yangName, YangType<?> returnType) {
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.BUILDER + UtilConstants.SPACE
+                + UtilConstants.SET_METHOD_PREFIX + yangName + UtilConstants.OPEN_PARENTHESIS
+                + returnType.getDataTypeName() + UtilConstants.SPACE + yangName + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SEMI_COLAN;
+    }
+
+    /**
+     * Returns the build method strings for interface file.
+     *
+     * @param yangName name of the attribute.
+     * @param returnType return type of attribute
+     * @return build method for interface.
+     */
+    private static String getBuildForInterface(String yangName) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + yangName + UtilConstants.SPACE + UtilConstants.BUILD
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN;
+    }
+
+    /**
+     * Returns the constructor strings for class file.
+     *
+     * @param yangName name of the class.
+     * @return constructor for class
+     */
+    private static String getConstructor(String yangName) {
+
+        String builderAttribute = (yangName.substring(0, 1).toLowerCase() + yangName.substring(1));
+        String constructor = UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + yangName + UtilConstants.IMPL + UtilConstants.OPEN_PARENTHESIS + yangName + UtilConstants.BUILDER
+                + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+
+        if (getAttrInfo() != null) {
+            for (AttributeInfo attribute : getAttrInfo()) {
+                attribute.setAttributeName(JavaIdentifierSyntax.getCamelCase(attribute.getAttributeName()));
+                constructor = constructor + UtilConstants.TWELVE_SPACE_INDENTATION + UtilConstants.THIS
+                        + UtilConstants.PERIOD + attribute.getAttributeName() + UtilConstants.SPACE
+                        + UtilConstants.EQUAL + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT
+                        + UtilConstants.PERIOD + UtilConstants.GET_METHOD_PREFIX + attribute.getAttributeName()
+                        + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN
+                        + UtilConstants.NEW_LINE;
+            }
+            getAttrInfo().clear();
+        }
+        return constructor + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns the build method strings for class file.
+     *
+     * @param yangName class name
+     * @return build method string for class.
+     */
+    private static String getBuild(String yangName) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + yangName
+                + UtilConstants.SPACE + UtilConstants.BUILD + UtilConstants.OPEN_PARENTHESIS
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
+                + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN
+                + UtilConstants.SPACE + UtilConstants.NEW + UtilConstants.SPACE + yangName + UtilConstants.IMPL
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.THIS + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns the Default constructor strings for class file.
+     *
+     * @param yangName name of the class.
+     * @return Default constructor for class
+     */
+    private static String getDefaultConstructor(String name) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + name
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE;
+    }
+
+}
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/CachedFileHandle.java b/src/main/java/org/onosproject/yangutils/utils/io/CachedFileHandle.java
deleted file mode 100644
index 1327e12..0000000
--- a/src/main/java/org/onosproject/yangutils/utils/io/CachedFileHandle.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*Copyright 2016.year 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;
-
-import org.onosproject.yangutils.translator.GeneratedFileType;
-
-/**
- * Cached java file handle, which supports the addition of member attributes and
- * methods.
- */
-public interface CachedFileHandle {
-
-    /**
-     * Add a new attribute to the file(s).
-     *
-     * @param attrType data type of the added attribute.
-     * @param name name of the attribute.
-     * @param isListAttr if the current added attribute needs to be maintained
-     *            in a list.
-     * @param fileTypes types of files in which the attribute needs to be added.
-     */
-    void addAttributeInfo(String attrType, String name, boolean isListAttr, GeneratedFileType fileTypes);
-
-    /**
-     * Flushes the cached contents to the target file, frees used resources.
-     */
-    void close();
-}
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
index 8b7e732..3ba2fc6 100644
--- a/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
@@ -33,9 +33,11 @@
 public final class CopyrightHeader {
 
     private static final Logger log = getLogger(CopyrightHeader.class);
-    private static final int NULL = -1;
+    private static final int EOF = -1;
     private static ClassLoader classLoader = CopyrightHeader.class.getClassLoader();
 
+    private static String copyrightHeader;
+
     /**
      * Default constructor.
      */
@@ -43,21 +45,30 @@
     }
 
     /**
-     * Returns Copyright file header.
+     * Returns copyright file header.
      *
-     * @return Copyright file header
+     * @return copyright file header
+     * @throws IOException when fails to parse copyright header.
      */
-    public static String getCopyrightHeader() {
-        return parseOnosHeader();
+    public static String getCopyrightHeader() throws IOException {
+        return copyrightHeader;
+    }
+
+    /**
+     * Sets the copyright header.
+     *
+     * @param header copyright header
+     */
+    private static void setCopyrightHeader(String header) {
+        copyrightHeader = header;
     }
 
     /**
      * parse Copyright to the temporary file.
      *
-     * @param file generated file
-     * @param stream input stream
+     * @throws IOException when fails to get the copyright header.
      */
-    private static String parseOnosHeader() {
+    public static void parseCopyrightHeader() throws IOException {
 
         File temp = new File("temp.txt");
 
@@ -65,17 +76,18 @@
             InputStream stream = classLoader.getResourceAsStream("CopyrightHeader.txt");
             OutputStream out = new FileOutputStream(temp);
             int index;
-            while ((index = stream.read()) != NULL) {
+            while ((index = stream.read()) != EOF) {
                 out.write(index);
             }
             out.close();
-            return convertToString(temp.toString());
+            stream.close();
+            getStringFileContent(temp);
+            setCopyrightHeader(getStringFileContent(temp));
         } catch (IOException e) {
-            log.info("Failed to insert onos header in files.");
+            throw new IOException("failed to parse the Copyright header");
         } finally {
             temp.delete();
         }
-        return "";
     }
 
     /**
@@ -85,7 +97,8 @@
      * @return string of file.
      * @throws IOException when fails to convert to string
      */
-    private static String convertToString(String toAppend) throws IOException {
+    private static String getStringFileContent(File toAppend) throws IOException {
+
         BufferedReader bufferReader = new BufferedReader(new FileReader(toAppend));
         try {
             StringBuilder stringBuilder = new StringBuilder();
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/FileSystemUtil.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/FileSystemUtil.java
new file mode 100644
index 0000000..f7e3556
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/FileSystemUtil.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2016 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;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import org.onosproject.yangutils.translator.CachedFileHandle;
+import org.onosproject.yangutils.translator.GeneratedFileType;
+import org.onosproject.yangutils.translator.tojava.CachedJavaFileHandle;
+import org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax;
+import org.onosproject.yangutils.utils.UtilConstants;
+
+/**
+ * Utility to handle file system operations.
+ */
+public final class FileSystemUtil {
+    /**
+     * Hiding constructor of a utility class.
+     */
+    private FileSystemUtil() {
+    }
+
+    /**
+     * Check if the package directory structure created.
+     *
+     * @param pkg Package to check if it is created.
+     * @return existence status of package.
+     */
+    public static boolean doesPackageExist(File pkg) {
+        if (pkg.exists()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Create a package structure with package info java file if not present.
+     *
+     * @param pkg java package string
+     * @param pkgInfo description of package
+     * @throws IOException any IO exception
+     */
+    public static void createPackage(String pkg, String pkgInfo) throws IOException {
+        if (!doesPackageExist(new File(pkg))) {
+            try {
+                File pack = YangIoUtils
+                        .createDirectories(pkg.replace(UtilConstants.PERIOD, UtilConstants.SLASH));
+                YangIoUtils.addPackageInfo(pack, pkgInfo, pkg);
+            } catch (IOException e) {
+                throw new IOException("failed to create package-info file");
+            }
+        }
+    }
+
+    /**
+     * Create a java source file in the specified package.
+     *
+     * @param pkg java package under which the interface file needs to be created.
+     * @param yangName YANG name of the node for which java file needs to be created.
+     * @param types types of files to be created.
+     * @throws IOException when fails to create interface file.
+     * @return the cached java file handle, which can be used to further add methods.
+     */
+    public static CachedFileHandle createSourceFiles(String pkg, String yangName, GeneratedFileType types)
+            throws IOException {
+        //if (!doesPackageExist(new File(pkg))) {
+        //    throw new IOException("package does not exist.");
+        //}
+        yangName = JavaIdentifierSyntax.getCamelCase(yangName);
+        CachedFileHandle handler = new CachedJavaFileHandle(pkg, yangName, types);
+
+        return handler;
+    }
+
+    /**
+     * Read the contents from source file and append its contents to append
+     * file.
+     *
+     * @param toAppend destination file in which the contents of source file is
+     *            appended.
+     * @param srcFile source file from which data is read and added to to append
+     *            file.
+     * @throws IOException any IO errors.
+     */
+    public static void appendFileContents(File toAppend, File srcFile) throws IOException {
+
+        insertStringInFile(srcFile, UtilConstants.NEW_LINE + readAppendFile(toAppend.toString()));
+        //TODO: read the contents from src file and append its contents to append file.
+        return;
+    }
+
+    /**
+     * Reads file and convert it to string.
+     *
+     * @param toAppend file to be converted.
+     * @return string of file.
+     * @throws IOException when fails to convert to string
+     */
+    private static String readAppendFile(String toAppend) throws IOException {
+        BufferedReader bufferReader = new BufferedReader(new FileReader(toAppend));
+        try {
+            StringBuilder stringBuilder = new StringBuilder();
+            String line = bufferReader.readLine();
+
+            while (line != null) {
+                stringBuilder.append(UtilConstants.FOUR_SPACE_INDENTATION + line);
+                stringBuilder.append("\n");
+                line = bufferReader.readLine();
+            }
+            return stringBuilder.toString();
+        } finally {
+            bufferReader.close();
+        }
+    }
+
+    /**
+     * Insert content to the generated file.
+     *
+     * @param inputFile input file
+     * @param contentTobeAdded content to be appended to the file.
+     * @throws IOException when fails to append content to the file.
+     */
+    public static void insertStringInFile(File inputFile, String contentTobeAdded) throws IOException {
+        FileWriter fileWriter = new FileWriter(inputFile, true);
+        PrintWriter outputPrintWriter = new PrintWriter(fileWriter);
+        outputPrintWriter.write(contentTobeAdded);
+        outputPrintWriter.flush();
+        outputPrintWriter.close();
+
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
new file mode 100644
index 0000000..635acf1
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright 2016 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;
+
+import org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax;
+import org.onosproject.yangutils.utils.UtilConstants;
+
+/**
+ * Provides javadoc for the generated classes.
+ */
+public final class JavaDocGen {
+
+    /**
+     * Default Constructor.
+     */
+    private JavaDocGen() {
+    }
+
+    /**
+     * JavaDocs types.
+     */
+    public static enum JavaDocType {
+
+        /**
+         * For class.
+         */
+        IMPL_CLASS,
+
+        /**
+         * For builder class.
+         */
+        BUILDER_CLASS,
+
+        /**
+         * For interface.
+         */
+        INTERFACE,
+
+        /**
+         * For builder interface.
+         */
+        BUILDER_INTERFACE,
+
+        /**
+         * For package-info.
+         */
+        PACKAGE_INFO,
+
+        /**
+         * For getters.
+         */
+        GETTER,
+
+        /**
+         * For setters.
+         */
+        SETTER,
+
+        /**
+         * For default constructor.
+         */
+        DEFAULT_CONSTRUCTOR,
+
+        /**
+         * For constructor.
+         */
+        CONSTRUCTOR,
+
+        /**
+         * For build.
+         */
+        BUILD
+    }
+
+    /**
+     * Returns java docs.
+     *
+     * @param type java doc type
+     * @param name name of the YangNode
+     * @return javadocs.
+     */
+    public static String getJavaDoc(JavaDocType type, String name) {
+        name = JavaIdentifierSyntax.getCamelCase(name);
+        String javaDoc = "";
+        if (type.equals(JavaDocType.IMPL_CLASS)) {
+            javaDoc = generateForImplClass(name);
+        } else if (type.equals(JavaDocType.BUILDER_CLASS)) {
+            javaDoc = generateForBuilderClass(name);
+        } else if (type.equals(JavaDocType.INTERFACE)) {
+            javaDoc = generateForInterface(name);
+        } else if (type.equals(JavaDocType.BUILDER_INTERFACE)) {
+            javaDoc = generateForBuilderInterface(name);
+        } else if (type.equals(JavaDocType.PACKAGE_INFO)) {
+            javaDoc = generateForPackage(name);
+        } else if (type.equals(JavaDocType.GETTER)) {
+            javaDoc = generateForGetters(name);
+        } else if (type.equals(JavaDocType.SETTER)) {
+            javaDoc = generateForSetters(name);
+        } else if (type.equals(JavaDocType.DEFAULT_CONSTRUCTOR)) {
+            javaDoc = generateForDefaultConstructors();
+        } else if (type.equals(JavaDocType.BUILD)) {
+            javaDoc = generateForBuild(name);
+        } else if (type.equals(JavaDocType.CONSTRUCTOR)) {
+            javaDoc = generateForConstructors(name);
+        }
+        return javaDoc;
+    }
+
+    /**
+     * Generate javaDocs for getter method.
+     *
+     * @param attribute attribute
+     * @return javaDocs
+     */
+    private static String generateForGetters(String attribute) {
+        return (UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_GETTERS + attribute
+                + UtilConstants.PERIOD + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.NEW_LINE_ESTRIC + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_RETURN
+                + attribute + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generates javaDocs for setter method.
+     *
+     * @param attribute attribute
+     * @return javaDocs
+     */
+    private static String generateForSetters(String attribute) {
+        return (UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_SETTERS + attribute
+                + UtilConstants.PERIOD + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.NEW_LINE_ESTRIC + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_PARAM
+                + attribute + UtilConstants.SPACE + attribute + UtilConstants.NEW_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_RETURN + UtilConstants.BUILDER_OBJECT
+                + attribute + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDocs for the impl class.
+     *
+     * @param className class name
+     * @return javaDocs.
+     */
+    private static String generateForImplClass(String className) {
+        return (UtilConstants.JAVA_DOC_FIRST_LINE + UtilConstants.IMPL_CLASS_JAVA_DOC + className + UtilConstants.PERIOD
+                + UtilConstants.NEW_LINE + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDocs for the builder class.
+     *
+     * @param className class name
+     * @return javaDocs.
+     */
+    private static String generateForBuilderClass(String className) {
+        return (UtilConstants.NEW_LINE + UtilConstants.JAVA_DOC_FIRST_LINE + UtilConstants.BUILDER_CLASS_JAVA_DOC
+                + className + UtilConstants.PERIOD + UtilConstants.NEW_LINE + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDoc for the interface.
+     *
+     * @param interfaceName interface name
+     * @return javaDocs.
+     */
+    private static String generateForInterface(String interfaceName) {
+        return (UtilConstants.NEW_LINE + UtilConstants.JAVA_DOC_FIRST_LINE + UtilConstants.INTERFACE_JAVA_DOC
+                + interfaceName + UtilConstants.PERIOD + UtilConstants.NEW_LINE + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDoc for the builder interface.
+     *
+     * @param builderforName builder for name
+     * @return javaDocs.
+     */
+    private static String generateForBuilderInterface(String builderforName) {
+        return (UtilConstants.JAVA_DOC_FIRST_LINE + UtilConstants.BUILDER_INTERFACE_JAVA_DOC + builderforName
+                + UtilConstants.PERIOD + UtilConstants.NEW_LINE + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDocs for package-info.
+     *
+     * @param packageName package name
+     * @return javaDocs
+     */
+    private static String generateForPackage(String packageName) {
+        return (UtilConstants.JAVA_DOC_FIRST_LINE + UtilConstants.PACKAGE_INFO_JAVADOC + packageName
+                + UtilConstants.PERIOD + UtilConstants.NEW_LINE + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDocs for default constructor.
+     *
+     * @return javaDocs
+     */
+    private static String generateForDefaultConstructors() {
+        return (UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_DEFAULT_CONSTRUCTOR
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDocs for constructor with parameters.
+     *
+     * @param params list of parameters
+     * @param className class name
+     * @return javaDocs
+     */
+    private static String generateForConstructors(String className) {
+        return (UtilConstants.JAVA_DOC_FIRST_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.JAVA_DOC_SETTERS + className + UtilConstants.PERIOD + UtilConstants.NEW_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.NEW_LINE_ESTRIC
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_PARAM
+                + (className.substring(0, 1).toLowerCase() + className.substring(1)) + UtilConstants.OBJECT
+                + UtilConstants.SPACE + UtilConstants.BUILDER_OBJECT + UtilConstants.SPACE + className
+                + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_END_LINE);
+    }
+
+    /**
+     * Generate javaDocs for build.
+     *
+     * @return javaDocs
+     */
+    private static String generateForBuild(String buildName) {
+        return (UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_FIRST_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_BUILD + buildName + UtilConstants.PERIOD
+                + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.NEW_LINE_ESTRIC
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_RETURN
+                + UtilConstants.JAVA_DOC_BUILD_RETURN + buildName + UtilConstants.PERIOD + UtilConstants.NEW_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.JAVA_DOC_END_LINE);
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/SerializedDataStore.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/SerializedDataStore.java
new file mode 100644
index 0000000..d33e1fe
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/SerializedDataStore.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2016 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;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInput;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+/**
+ * Provides storage for serialized data while traversing data model tree for code generation.
+ */
+public final class SerializedDataStore {
+
+    /**
+     * Data Store types.
+     */
+    public static enum SerializedDataStoreType {
+
+        /**
+         * Methods.
+         */
+        INTERFACE_METHODS,
+
+        /**
+         * Methods.
+         */
+        BUILDER_METHODS,
+
+        /**
+         * Methods.
+         */
+        BUILDER_INTERFACE_METHODS,
+
+        /**
+         * Methods.
+         */
+        IMPL_METHODS,
+
+        /**
+         * Attributes.
+         */
+        ATTRIBUTE,
+
+        /**
+         * Imports.
+         */
+        IMPORT
+    }
+
+    /**
+     * File name string for serialized files of methods.
+     */
+    private static final String INTERFACE_METHOD_FILE_NAME = "SerializedInterfaceMethodDataStore";
+
+    /**
+     * File name string for serialized files of methods.
+     */
+    private static final String BUILDER_METHOD_FILE_NAME = "SerializedBuilderMethodDataStore";
+
+    /**
+     * File name string for serialized files of methods.
+     */
+    private static final String BUILDER_INTERFACE_METHOD_FILE_NAME = "SerializedBuilderInterfaceMethodDataStore";
+
+    /**
+     * File name string for serialized files of methods.
+     */
+    private static final String IMPL_METHOD_FILE_NAME = "SerializedImplMethodDataStore";
+
+    /**
+     * File name string for serialized files of attributes.
+     */
+    private static final String ATTRIBUTE_FILE_NAME = "SerializedAttributeDataStore";
+
+    /**
+     * File name string for serialized files of imports.
+     */
+    private static final String IMPORT_FILE_NAME = "SerializedImportDataStore";
+
+    /**
+     * File extension of serialized files.
+     */
+    private static final String SERIALIZE_FILE_EXTENSION = ".ser";
+
+    /**
+     * Buffer size.
+     */
+    private static final int BUFFER_SIZE = 8 * 1024;
+
+    /**
+     * Default constructor.
+     */
+    private SerializedDataStore() {
+    }
+
+    /**
+     * Writes specific info to a serialized file.
+     *
+     * @param data data to be stored
+     * @param type type of serialized data store
+     * @throws IOException when fails to create a serialized data file.
+     */
+    public static void setSerializeData(String data, SerializedDataStoreType type) throws IOException {
+
+        String fileName = "";
+        if (type.equals(SerializedDataStoreType.ATTRIBUTE)) {
+            fileName = ATTRIBUTE_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.INTERFACE_METHODS)) {
+            fileName = INTERFACE_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.BUILDER_INTERFACE_METHODS)) {
+            fileName = BUILDER_INTERFACE_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.BUILDER_METHODS)) {
+            fileName = BUILDER_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.IMPL_METHODS)) {
+            fileName = IMPL_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.IMPORT)) {
+            fileName = IMPORT_FILE_NAME;
+        } else {
+            throw new IOException("Unresolved file type.");
+        }
+
+        try {
+            OutputStream file = new FileOutputStream(fileName + SERIALIZE_FILE_EXTENSION);
+            OutputStream buffer = new BufferedOutputStream(file, BUFFER_SIZE);
+
+            ObjectOutput output = new ObjectOutputStream(buffer);
+            try {
+                output.writeObject(data);
+            } finally {
+                output.close();
+            }
+        } catch (IOException ex) {
+            throw new IOException("failed to serialize data");
+        }
+    }
+
+    /**
+     * Get the serialized data.
+     *
+     * @param type type of serialized data store
+     * @return list of attribute info.
+     * @throws IOException when fails to read from the file.
+     * @throws ClassNotFoundException when file is missing.
+     */
+    @SuppressWarnings("unchecked")
+    public static List<String> getSerializeData(SerializedDataStoreType type)
+            throws IOException, ClassNotFoundException {
+
+        String fileName = "";
+        if (type.equals(SerializedDataStoreType.ATTRIBUTE)) {
+            fileName = ATTRIBUTE_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.INTERFACE_METHODS)) {
+            fileName = INTERFACE_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.BUILDER_INTERFACE_METHODS)) {
+            fileName = BUILDER_INTERFACE_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.BUILDER_METHODS)) {
+            fileName = BUILDER_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.IMPL_METHODS)) {
+            fileName = IMPL_METHOD_FILE_NAME;
+        } else if (type.equals(SerializedDataStoreType.IMPORT)) {
+            fileName = IMPORT_FILE_NAME;
+        } else {
+            throw new IOException("Unresolved file type.");
+        }
+
+        try {
+            InputStream file = new FileInputStream(fileName + SERIALIZE_FILE_EXTENSION);
+            InputStream buffer = new BufferedInputStream(file);
+            ObjectInput input = new ObjectInputStream(buffer);
+            try {
+                List<String> recoveredData = (List<String>) input.readObject();
+                return recoveredData;
+            } finally {
+                input.close();
+            }
+        } catch (ClassNotFoundException ex) {
+            throw new ClassNotFoundException("failed to fetch the serialized data file.");
+        }
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/YangFileScanner.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangFileScanner.java
index ca5da57..a9006d2 100644
--- a/src/main/java/org/onosproject/yangutils/utils/io/impl/YangFileScanner.java
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangFileScanner.java
@@ -34,14 +34,39 @@
     }
 
     /**
-     * Returns the list of yang files.
+     * Returns the list of YANG files.
      *
      * @param root specified directory
-     * @return list of yang files.
-     * @throws IOException when files get deleted while performing the operations.
+     * @return list of YANG files.
+     * @throws IOException when files get deleted while performing the
+     *             operations.
      */
     public static List<String> getYangFiles(String root) throws IOException {
+        return getFiles(root, ".yang");
+    }
 
+    /**
+     * Returns the list of java files.
+     *
+     * @param root specified directory
+     * @return list of java files.
+     * @throws IOException when files get deleted while performing the
+     *             operations.
+     */
+    public static List<String> getJavaFiles(String root) throws IOException {
+        return getFiles(root, ".java");
+    }
+
+    /**
+     * Returns the list of required files.
+     *
+     * @param root specified directory
+     * @param extension file extension.
+     * @return list of required files.
+     * @throws IOException when files get deleted while performing the
+     *             operations.
+     */
+    public static List<String> getFiles(String root, String extension) throws IOException {
         List<String> store = new LinkedList<>();
         Stack<String> stack = new Stack<>();
         stack.push(root);
@@ -60,7 +85,7 @@
                         stack.push(current.toString());
                     } else {
                         String yangFile = current.getCanonicalPath();
-                        if (yangFile.endsWith(".yang")) {
+                        if (yangFile.endsWith(extension)) {
                             store.add(yangFile);
                         }
                     }
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
new file mode 100644
index 0000000..af83de4
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2016 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;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.List;
+
+import org.sonatype.plexus.build.incremental.BuildContext;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.model.Resource;
+
+import org.onosproject.yangutils.utils.UtilConstants;
+
+import static org.slf4j.LoggerFactory.getLogger;
+import org.slf4j.Logger;
+
+/**
+ * Provides common utility functionalities for code generation.
+ */
+public final class YangIoUtils {
+
+    private static final Logger log = getLogger(YangIoUtils.class);
+
+    /**
+     * Default constructor.
+     */
+    private YangIoUtils() {
+    }
+
+    /**
+     * Creates the directory structure.
+     *
+     * @param path directory path
+     * @return directory structure
+     */
+    public static File createDirectories(String path) {
+
+        File generatedDir = new File(UtilConstants.YANG_GEN_DIR + File.separator + path);
+        generatedDir.mkdirs();
+        return generatedDir;
+    }
+
+    /**
+     * Adds package info file for the created directory.
+     *
+     * @param path directory path
+     * @param classInfo class info for the package
+     * @param pack package of the directory
+     * @throws IOException when fails to create package info file.
+     */
+    public static void addPackageInfo(File path, String classInfo, String pack) throws IOException {
+
+        try {
+
+            File packageInfo = new File(path + File.separator + "package-info.java");
+            packageInfo.createNewFile();
+            if (packageInfo.exists()) {
+
+                FileWriter fileWriter = null;
+                BufferedWriter bufferedWriter = null;
+                fileWriter = new FileWriter(packageInfo);
+                bufferedWriter = new BufferedWriter(fileWriter);
+                bufferedWriter.write(CopyrightHeader.getCopyrightHeader());
+                bufferedWriter.write(JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.PACKAGE_INFO, classInfo));
+                bufferedWriter.write(UtilConstants.PACKAGE + UtilConstants.SPACE + pack + UtilConstants.SEMI_COLAN);
+                bufferedWriter.close();
+            }
+        } catch (IOException e) {
+            throw new IOException("Exception occured while creating package info file.");
+        }
+    }
+
+    /**
+     * Cleans the generated directory if already exist in source folder.
+     *
+     * @param baseDir generated directory in previous build.
+     */
+    public static void clean(String baseDir) {
+        File generatedDirectory = new File(baseDir + File.separator + UtilConstants.YANG_GEN_DIR);
+        if (generatedDirectory.exists()) {
+            List<String> javafiles;
+            try {
+                javafiles = YangFileScanner.getJavaFiles(generatedDirectory.toString());
+                for (String file : javafiles) {
+                    File currentFile = new File(file);
+                    currentFile.delete();
+                }
+            } catch (IOException e) {
+                log.info("Failed to delete the generated files in " + generatedDirectory + " directory");
+            }
+            generatedDirectory.delete();
+        }
+    }
+
+    /**
+     * Adds generated source directory to the compilation root.
+     *
+     * @param source directory
+     * @param project current maven project
+     * @param context current build context
+     */
+    public static void addToSource(String source, MavenProject project, BuildContext context) {
+
+        project.addCompileSourceRoot(source);
+        Resource rsc = new Resource();
+        rsc.setDirectory(source);
+        project.addResource(rsc);
+        context.refresh(project.getBasedir());
+        log.info("Source directory added to compilation root: " + source);
+    }
+
+}
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListenerTest.java
index c234fee..ea3b657 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListenerTest.java
@@ -66,8 +66,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the Config value is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -92,8 +92,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the Config value is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -136,10 +136,10 @@
     @Test
     public void processModuleSubStatementConfig() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("mismatched input 'config' expecting {'augment', 'choice', 'contact', 'container'," +
-                " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include', " +
-                "'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference'," +
-                " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
+        thrown.expectMessage("mismatched input 'config' expecting {'augment', 'choice', 'contact', 'container',"
+                + " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include', "
+                + "'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference',"
+                + " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementConfig.yang");
     }
 
@@ -167,8 +167,8 @@
         assertThat(container.isConfig(), is(true));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = container.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -203,8 +203,8 @@
         assertThat(yangList.isConfig(), is(true));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangList.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -234,8 +234,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         // Check whether config value is set correctly.
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListenerTest.java
index 25f64d6..957a90b 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListenerTest.java
@@ -154,8 +154,8 @@
         assertThat(yangContainer.getReference(), is("\"container reference\""));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = yangContainer.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangContainer.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListenerTest.java
index 9655b25..74731d4 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListenerTest.java
@@ -66,8 +66,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the description is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -175,8 +175,8 @@
         assertThat(container.getDescription(), is("\"container description\""));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = container.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -212,8 +212,8 @@
         assertThat(yangList.getDescription(), is("\"list description\""));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangList.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -243,8 +243,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         // Check whether description value is set correctly.
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListenerTest.java
index 94f0157..e3f581b 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListenerTest.java
@@ -66,8 +66,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafListInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -98,10 +98,10 @@
     @Test
     public void processLeafListInvalidStatement() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("mismatched input 'leaflist' expecting {'augment', 'choice', 'contact', 'container'," +
-                " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include'," +
-                " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference'," +
-                " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
+        thrown.expectMessage("mismatched input 'leaflist' expecting {'augment', 'choice', 'contact', 'container',"
+                + " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include',"
+                + " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference',"
+                + " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/LeafListInvalidStatement.yang");
     }
 
@@ -161,8 +161,8 @@
         assertThat(container.getName(), is("valid"));
 
         // Check whether leaf-list properties as set correctly.
-        ListIterator<YangLeafList> leafListIterator = container.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = container.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafListInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -198,8 +198,8 @@
         assertThat(yangList.getName(), is("valid"));
 
         // Check whether leaf-list properties as set correctly.
-        ListIterator<YangLeafList> leafListIterator = yangList.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangList.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafListInfo.getDataType().getDataTypeName(), is("\"uint16\""));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListenerTest.java
index 519f605..bfbbb49 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/LeafListenerTest.java
@@ -66,8 +66,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -98,10 +98,10 @@
     @Test
     public void processLeafInvalidStatement() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("mismatched input 'leafs' expecting {'augment', 'choice', 'contact', 'container'," +
-                " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include'," +
-                " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference'," +
-                " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
+        thrown.expectMessage("mismatched input 'leafs' expecting {'augment', 'choice', 'contact', 'container',"
+                + " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include',"
+                + " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference',"
+                + " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/LeafInvalidStatement.yang");
     }
 
@@ -161,8 +161,8 @@
         assertThat(container.getName(), is("valid"));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = container.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -197,8 +197,8 @@
         assertThat(yangList.getName(), is("valid"));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangList.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ListListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ListListenerTest.java
index 6664c5e..4f86754 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ListListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ListListenerTest.java
@@ -159,8 +159,8 @@
         assertThat(yangList.getReference(), is("\"list reference\""));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangList.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListenerTest.java
index 001e5a9..7797de6 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListenerTest.java
@@ -60,8 +60,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the mandatory value is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -86,8 +86,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the mandatory value is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -112,8 +112,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the mandatory value is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -146,10 +146,10 @@
     @Test
     public void processModuleSubStatementMandatory() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("mismatched input 'mandatory' expecting {'augment', 'choice', 'contact', 'container'," +
-                " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include'," +
-                " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference'," +
-                " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
+        thrown.expectMessage("mismatched input 'mandatory' expecting {'augment', 'choice', 'contact', 'container',"
+                + " 'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include',"
+                + " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference',"
+                + " 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementMandatory.yang");
     }
 }
\ No newline at end of file
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListenerTest.java
index f03ab75..11a973b 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListenerTest.java
@@ -62,8 +62,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafListInfo.getMaxElelements(), is(3));
@@ -99,9 +99,9 @@
     @Test
     public void processMaxElementsInvalidStatement() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("extraneous input 'max-element' expecting {'config', 'description', 'if-feature'," +
-                " 'max-elements', 'min-elements', 'must', 'ordered-by', 'reference', 'status', 'type', 'units', " +
-                "'when', '}'}");
+        thrown.expectMessage("extraneous input 'max-element' expecting {'config', 'description', 'if-feature',"
+                + " 'max-elements', 'min-elements', 'must', 'ordered-by', 'reference', 'status', 'type', 'units', "
+                + "'when', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/MaxElementsInvalidStatement.yang");
     }
 
@@ -145,8 +145,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafListInfo.getMaxElelements(), is(2147483647));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListenerTest.java
index 9ee71bd..2251082 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListenerTest.java
@@ -62,8 +62,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafListInfo.getMinElements(), is(3));
@@ -99,9 +99,9 @@
     @Test
     public void processMinElementsInvalidKeyword() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("extraneous input 'min-element' expecting {'config', 'description', 'if-feature'," +
-                " 'max-elements', 'min-elements', 'must', 'ordered-by', 'reference', 'status', 'type', 'units'," +
-                " 'when', '}'}");
+        thrown.expectMessage("extraneous input 'min-element' expecting {'config', 'description', 'if-feature',"
+                + " 'max-elements', 'min-elements', 'must', 'ordered-by', 'reference', 'status', 'type', 'units',"
+                + " 'when', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/MinElementsInvalidKeyword.yang");
     }
 
@@ -134,8 +134,8 @@
     @Test
     public void processMinElementsInvalidCardinality() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("Internal parser error detected: Invalid cardinality in" +
-                " min-elements before processing.");
+        thrown.expectMessage(
+                "Internal parser error detected: Invalid cardinality in" + " min-elements before processing.");
         YangNode node = manager.getDataModel("src/test/resources/MinElementsInvalidCardinality.yang");
     }
 }
\ No newline at end of file
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListenerTest.java
index 4e17177..28ab2c2 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListenerTest.java
@@ -66,8 +66,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the reference is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -174,8 +174,8 @@
         assertThat(container.getReference(), is("\"container reference\""));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = container.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -211,8 +211,8 @@
         assertThat(yangList.getReference(), is("\"list reference\""));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangList.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -242,8 +242,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         // Check whether description value is set correctly.
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/StatusListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/StatusListenerTest.java
index 9cfacf9..7b4c543 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/StatusListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/StatusListenerTest.java
@@ -66,8 +66,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the status is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -92,8 +92,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the status is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -118,8 +118,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether the status is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -152,10 +152,10 @@
     @Test
     public void processModuleSubStatementStatus() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("mismatched input 'status' expecting {'augment', 'choice', 'contact', 'container', " +
-                "'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include'," +
-                " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference', " +
-                "'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
+        thrown.expectMessage("mismatched input 'status' expecting {'augment', 'choice', 'contact', 'container', "
+                + "'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', 'include',"
+                + " 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', 'prefix', 'reference', "
+                + "'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementStatus.yang");
     }
 
@@ -184,8 +184,8 @@
         assertThat(container.getStatus(), is(YangStatusType.OBSOLETE));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = container.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = container.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -221,8 +221,8 @@
         assertThat(yangList.getStatus(), is(YangStatusType.CURRENT));
 
         // Check whether leaf properties as set correctly.
-        ListIterator<YangLeaf> leafIterator = yangList.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangList.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -252,8 +252,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         // Check whether status is set correctly.
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/TypeListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/TypeListenerTest.java
index 0a056a7..42332b7 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/TypeListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/TypeListenerTest.java
@@ -41,8 +41,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"hello\""));
@@ -67,8 +67,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getDataType().getDataTypeName(), is("\"uint16\""));
@@ -93,8 +93,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafListInfo.getDataType().getDataTypeName(), is("\"uint16\""));
diff --git a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListenerTest.java b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListenerTest.java
index c1fccba..c89138b 100644
--- a/src/test/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListenerTest.java
+++ b/src/test/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListenerTest.java
@@ -64,8 +64,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether units value is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -78,10 +78,10 @@
     @Test
     public void processModuleSubStatementUnits() throws IOException, ParserException {
         thrown.expect(ParserException.class);
-        thrown.expectMessage("mismatched input 'type' expecting {'augment', 'choice', 'contact', 'container', " +
-                "'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', " +
-                "'include', 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', " +
-                "'prefix', 'reference', 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
+        thrown.expectMessage("mismatched input 'type' expecting {'augment', 'choice', 'contact', 'container', "
+                + "'description', 'extension', 'deviation', 'feature', 'grouping', 'identity', 'import', "
+                + "'include', 'leaf', 'leaf-list', 'list', 'namespace', 'notification', 'organization', "
+                + "'prefix', 'reference', 'revision', 'rpc', 'typedef', 'uses', 'yang-version', '}'}");
         YangNode node = manager.getDataModel("src/test/resources/ModuleSubStatementUnits.yang");
     }
 
@@ -113,8 +113,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         // Check whether leaf properties is set correctly.
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
@@ -145,8 +145,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeaf> leafIterator = yangNode.getListOfLeaf().listIterator();
-        YangLeaf leafInfo = leafIterator.next();
+        ListIterator<YangLeaf<?>> leafIterator = yangNode.getListOfLeaf().listIterator();
+        YangLeaf<?> leafInfo = leafIterator.next();
 
         assertThat(leafInfo.getLeafName(), is("invalid-interval"));
         assertThat(leafInfo.getUnits(), is(nullValue()));
@@ -180,8 +180,8 @@
         YangModule yangNode = (YangModule) node;
         assertThat(yangNode.getName(), is("Test"));
 
-        ListIterator<YangLeafList> leafListIterator = yangNode.getListOfLeafList().listIterator();
-        YangLeafList leafListInfo = leafListIterator.next();
+        ListIterator<YangLeafList<?>> leafListIterator = yangNode.getListOfLeafList().listIterator();
+        YangLeafList<?> leafListInfo = leafListIterator.next();
 
         // Check whether units value is set correctly.
         assertThat(leafListInfo.getLeafName(), is("invalid-interval"));
diff --git a/src/test/java/org/onosproject/yangutils/utils/io/YangFileScannerTest.java b/src/test/java/org/onosproject/yangutils/utils/io/impl/YangFileScannerTest.java
similarity index 67%
rename from src/test/java/org/onosproject/yangutils/utils/io/YangFileScannerTest.java
rename to src/test/java/org/onosproject/yangutils/utils/io/impl/YangFileScannerTest.java
index 405d34b..6ead5e3 100644
--- a/src/test/java/org/onosproject/yangutils/utils/io/YangFileScannerTest.java
+++ b/src/test/java/org/onosproject/yangutils/utils/io/impl/YangFileScannerTest.java
@@ -31,7 +31,7 @@
 
     private final Logger log = getLogger(getClass());
 
-    String baseDir = "target/UnitTestCase";
+    private static final String BASEDIR = "target/UnitTestCase";
 
     /**
      * Checks an empty directory.
@@ -39,9 +39,9 @@
     @Test
     public void testWithSingleEmptyDirectoryInRoot() {
         try {
-            File dir = new File(baseDir);
+            File dir = new File(BASEDIR);
             dir.mkdirs();
-            List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
         } catch (IOException e) {
             log.info("IO Exception throwed");
         }
@@ -63,7 +63,7 @@
             File firstpath2 = createDirectory(dir2);
             File firstpath3 = createDirectory(dir3);
             File firstpath4 = createDirectory(dir4);
-            List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
         } catch (IOException e) {
             log.info("IO Exception throwed");
         }
@@ -79,7 +79,7 @@
             String firstFileName1 = "secondFile.yang";
             File firstpath1 = createDirectory(dir1);
             createFile(firstpath1, firstFileName1);
-            List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
         } catch (IOException e) {
             log.info("IO Exception throwed");
         }
@@ -101,7 +101,7 @@
             createFile(firstpath2, firstFileName3);
             createFile(firstpath2, firstFileName4);
             createFile(firstpath2, firstFileName5);
-            List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
         } catch (IOException e) {
             log.info("IO Exception throwed");
         }
@@ -143,7 +143,49 @@
             createFile(dir6, firstFileName3);
             createFile(dir6, firstFileName4);
             createFile(dir6, firstFileName5);
-            List<String> list = YangFileScanner.getYangFiles(baseDir.toString());
+            List<String> list = YangFileScanner.getYangFiles(BASEDIR.toString());
+        } catch (IOException e) {
+            log.info("IO Exception throwed");
+        }
+    }
+
+    /**
+     * Checks multi directories with many .java file.
+     */
+    @Test
+    public void testWithMultiDirectoriesMultiJavaFiles() {
+        try {
+            String dir2 = "newDir1/newDir2/newDir3/newDir4";
+            File dir3 = new File("target/UnitTestCase/newDir1");
+            File dir4 = new File("target/UnitTestCase/newDir1/newDir2");
+            File dir5 = new File("target/UnitTestCase/newDir1/newDir2/newDir3");
+            File dir6 = new File("target/UnitTestCase/newDir1/newDir2/newDir3/newDir4");
+            String firstFileName2 = "thirdFile.java";
+            String firstFileName3 = "fourthFile.java";
+            String firstFileName4 = "fifthFile.java";
+            String firstFileName5 = "sixthFile.java";
+            File firstpath2 = createDirectory(dir2);
+            createFile(firstpath2, firstFileName2);
+            createFile(firstpath2, firstFileName3);
+            createFile(firstpath2, firstFileName4);
+            createFile(dir3, firstFileName5);
+            createFile(dir3, firstFileName2);
+            createFile(dir3, firstFileName3);
+            createFile(dir3, firstFileName4);
+            createFile(dir3, firstFileName5);
+            createFile(dir4, firstFileName2);
+            createFile(dir4, firstFileName3);
+            createFile(dir4, firstFileName4);
+            createFile(dir4, firstFileName5);
+            createFile(dir5, firstFileName2);
+            createFile(dir5, firstFileName3);
+            createFile(dir5, firstFileName4);
+            createFile(dir5, firstFileName5);
+            createFile(dir6, firstFileName2);
+            createFile(dir6, firstFileName3);
+            createFile(dir6, firstFileName4);
+            createFile(dir6, firstFileName5);
+            List<String> list = YangFileScanner.getJavaFiles(BASEDIR.toString());
         } catch (IOException e) {
             log.info("IO Exception throwed");
         }
@@ -156,18 +198,18 @@
      * @return directory path
      */
     public File createDirectory(String path) {
-        File myDir = new File(baseDir + File.separator + path);
+        File myDir = new File(BASEDIR + File.separator + path);
         myDir.mkdirs();
         return myDir;
     }
 
     /**
-    * Method used for creating file inside the specified directory.
-    *
-    * @param myDir my current dirctory
-    * @param fileName file name
-    * @throws IOException io exception when fails to create a file.
-    */
+     * Method used for creating file inside the specified directory.
+     *
+     * @param myDir my current dirctory
+     * @param fileName file name
+     * @throws IOException io exception when fails to create a file.
+     */
     public void createFile(File myDir, String fileName) throws IOException {
         File file = null;
         try {
