diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangBelongsTo.java b/src/main/java/org/onosproject/yangutils/datamodel/YangBelongsTo.java
new file mode 100644
index 0000000..0dbc7ed
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangBelongsTo.java
@@ -0,0 +1,138 @@
+/*
+ * 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.datamodel;
+
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.parser.Parsable;
+import org.onosproject.yangutils.parser.ParsableDataType;
+
+/*-
+ *   Reference 6020.
+ *
+ *  The "belongs-to" statement specifies the module to which the
+ *  submodule belongs.  The argument is an identifier that is the name of
+ *  the module.
+ *
+ *  A submodule MUST only be included by the module to which it belongs,
+ *  or by another submodule that belongs to that module.
+ *
+ *  The mandatory "prefix" sub-statement assigns a prefix for the module
+ *  to which the submodule belongs.  All definitions in the local
+ *  submodule and any included submodules can be accessed by using the
+ *  prefix.
+ *
+ *  The belongs-to's sub-statements
+ *
+ *                +--------------+---------+-------------+
+ *                | substatement | section | cardinality |
+ *                +--------------+---------+-------------+
+ *                | prefix       | 7.1.4   | 1           |
+ *                +--------------+---------+-------------+
+ */
+
+/**
+ * Maintains the belongs-to data type information.
+ */
+public class YangBelongsTo implements Parsable {
+
+    /**
+     * Reference RFC 6020.
+     *
+     * The "belongs-to" statement specifies the module to which the submodule
+     * belongs. The argument is an identifier that is the name of the module.
+     */
+    private String belongsToModuleName;
+
+    /**
+     * Reference RFC 6020.
+     *
+     * The mandatory "prefix" substatement assigns a prefix for the module to
+     * which the submodule belongs. All definitions in the local submodule and
+     * any included submodules can be accessed by using the prefix.
+     */
+    private String prefix;
+
+    /**
+     * Create a belongs to object.
+     */
+    public YangBelongsTo() {
+
+    }
+
+    /**
+     * Get the belongs to module name.
+     *
+     * @return the belongs to module name
+     */
+    public String getBelongsToModuleName() {
+        return belongsToModuleName;
+    }
+
+    /**
+     * Set the belongs to module name.
+     *
+     * @param belongsToModuleName the belongs to module name to set
+     *
+     */
+    public void setBelongsToModuleName(String belongsToModuleName) {
+        this.belongsToModuleName = belongsToModuleName;
+    }
+
+    /**
+     * Get the prefix.
+     *
+     * @return the prefix.
+     */
+    public String getPrefix() {
+        return prefix;
+    }
+
+    /**
+     * Set the prefix.
+     *
+     * @param prefix the prefix to set
+     */
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    /**
+     * Returns the type of the data as belongs-to.
+     *
+     * @return ParsedDataType returns BELONGS_TO_DATA
+     */
+    public ParsableDataType getParsableDataType() {
+        return ParsableDataType.BELONGS_TO_DATA;
+    }
+
+    /**
+     * Validate the data on entering the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnEntry() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /**
+     * Validate the data on exiting the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnExit() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java b/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
new file mode 100644
index 0000000..388360a
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
@@ -0,0 +1,404 @@
+/*
+ * 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.datamodel;
+
+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;
+/*-
+ * Reference RFC 6020.
+ *
+ * The "container" statement is used to define an interior data node in the
+ * schema tree. It takes one argument, which is an identifier, followed by a
+ * block of sub-statements that holds detailed container information.
+ *
+ * A container node does not have a value, but it has a list of child nodes in
+ * the data tree. The child nodes are defined in the container's sub-statements.
+ *
+ * Containers with Presence
+ *
+ * YANG supports two styles of containers, those that exist only for organizing
+ * the hierarchy of data nodes, and those whose presence in the configuration
+ * has an explicit meaning.
+ *
+ * In the first style, the container has no meaning of its own, existing only to
+ * contain child nodes. This is the default style.
+ *
+ * For example, the set of scrambling options for Synchronous Optical Network
+ * (SONET) interfaces may be placed inside a "scrambling" container to enhance
+ * the organization of the configuration hierarchy, and to keep these nodes
+ * together. The "scrambling" node itself has no meaning, so removing the node
+ * when it becomes empty relieves the user from performing this task.
+ *
+ * In the second style, the presence of the container itself is configuration
+ * data, representing a single bit of configuration data. The container acts as
+ * both a configuration knob and a means of organizing related configuration.
+ * These containers are explicitly created and deleted.
+ *
+ * YANG calls this style a "presence container" and it is indicated using the
+ * "presence" statement, which takes as its argument a text string indicating
+ * what the presence of the node means.
+ *
+ * The container's Substatements
+ *
+ *                +--------------+---------+-------------+------------------+
+ *                | substatement | section | cardinality |data model mapping|
+ *                +--------------+---------+-------------+------------------+
+ *                | anyxml       | 7.10    | 0..n        | -not supported   |
+ *                | choice       | 7.9     | 0..n        | -child nodes     |
+ *                | config       | 7.19.1  | 0..1        | -boolean         |
+ *                | container    | 7.5     | 0..n        | -child nodes     |
+ *                | description  | 7.19.3  | 0..1        | -string          |
+ *                | grouping     | 7.11    | 0..n        | -child nodes     |
+ *                | if-feature   | 7.18.2  | 0..n        | -TODO            |
+ *                | leaf         | 7.6     | 0..n        | -YangLeaf        |
+ *                | leaf-list    | 7.7     | 0..n        | -YangLeafList    |
+ *                | list         | 7.8     | 0..n        | -child nodes     |
+ *                | must         | 7.5.3   | 0..n        | -TODO            |
+ *                | presence     | 7.5.5   | 0..1        | -boolean         |
+ *                | reference    | 7.19.4  | 0..1        | -string          |
+ *                | status       | 7.19.2  | 0..1        | -YangStatus      |
+ *                | typedef      | 7.3     | 0..n        | -child nodes     |
+ *                | uses         | 7.12    | 0..n        | -child nodes     |
+ *                | when         | 7.19.5  | 0..1        | -TODO            |
+ *                +--------------+---------+-------------+------------------+
+ */
+
+/**
+ * Data model node to maintain information defined in YANG container.
+ */
+public class YangContainer extends YangNode implements YangLeavesHolder, YangCommonInfo, Parsable {
+
+    /**
+     * Name of the container.
+     */
+    private String name;
+
+    /**
+     * If container maintains config data.
+     */
+    private boolean isConfig;
+
+    /**
+     * Description of container.
+     */
+    private String description;
+
+    /**
+     * List of leaves contained.
+     */
+    @SuppressWarnings("rawtypes")
+    private List<YangLeaf> listOfLeaf;
+
+    /**
+     * List of leaf-lists contained.
+     */
+    @SuppressWarnings("rawtypes")
+    private List<YangLeafList> listOfLeafList;
+
+    /**
+     * If it is a presence container, then the textual documentation of presence
+     * usage.
+     */
+    private String presence;
+
+    /**
+     * Reference of the module.
+     */
+    private String reference;
+
+    /**
+     * Status of the node.
+     */
+    private YangStatusType status;
+
+    /**
+     * package of the generated java code.
+     */
+    private String pkg;
+
+    /**
+     * Cached Java File Handle.
+     */
+    private CachedFileHandle fileHandle;
+
+    /**
+     * Create a container node.
+     */
+    public YangContainer() {
+        super(YangNodeType.CONTAINER_NODE);
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#getName()
+     */
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#setName(java.lang.String)
+     */
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Get the config flag.
+     *
+     * @return the isConfig
+     */
+    public boolean isConfig() {
+        return isConfig;
+    }
+
+    /**
+     * Set the config flag.
+     *
+     * @param isCfg the config flag.
+     */
+    public void setConfig(boolean isCfg) {
+        isConfig = isCfg;
+    }
+
+    /**
+     * Get the description.
+     *
+     * @return the description.
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Set the description.
+     *
+     * @param description set the description.
+     */
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Get the list of leaves.
+     *
+     * @return the list of leaves.
+     */
+    @SuppressWarnings("rawtypes")
+    public List<YangLeaf> getListOfLeaf() {
+        return listOfLeaf;
+    }
+
+    /**
+     * Set the list of leaves.
+     *
+     * @param leafsList the list of leaf to set.
+     */
+    @SuppressWarnings("rawtypes")
+    private void setListOfLeaf(List<YangLeaf> leafsList) {
+        listOfLeaf = leafsList;
+    }
+
+    /**
+     * Add a leaf.
+     *
+     * @param leaf the leaf to be added.
+     */
+    @SuppressWarnings("rawtypes")
+    public void addLeaf(YangLeaf<?> leaf) {
+        if (getListOfLeaf() == null) {
+            setListOfLeaf(new LinkedList<YangLeaf>());
+        }
+
+        getListOfLeaf().add(leaf);
+    }
+
+    /**
+     * Get the list of leaf-list.
+     *
+     * @return the list of leaf-list.
+     */
+    @SuppressWarnings("rawtypes")
+    public List<YangLeafList> getListOfLeafList() {
+        return listOfLeafList;
+    }
+
+    /**
+     * Set the list of leaf-list.
+     *
+     * @param listOfLeafList the list of leaf-list to set.
+     */
+    @SuppressWarnings("rawtypes")
+    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+        this.listOfLeafList = listOfLeafList;
+    }
+
+    /**
+     * Add a leaf-list.
+     *
+     * @param leafList the leaf-list to be added.
+     */
+    @SuppressWarnings("rawtypes")
+    public void addLeafList(YangLeafList<?> leafList) {
+        if (getListOfLeafList() == null) {
+            setListOfLeafList(new LinkedList<YangLeafList>());
+        }
+
+        getListOfLeafList().add(leafList);
+    }
+
+    /**
+     * Get the presence string if present.
+     *
+     * @return the isPressence.
+     */
+    public String getPresence() {
+        return presence;
+    }
+
+    /**
+     * Set the presence string.
+     *
+     * @param presence the presence flag
+     */
+    public void setPresence(String presence) {
+        this.presence = presence;
+    }
+
+    /**
+     * Get the textual reference.
+     *
+     * @return the reference.
+     */
+    public String getReference() {
+        return reference;
+    }
+
+    /**
+     * Set the textual reference.
+     *
+     * @param reference the reference to set.
+     */
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * Get the status.
+     *
+     * @return the status.
+     */
+    public YangStatusType getStatus() {
+        return status;
+    }
+
+    /**
+     * Set the status.
+     *
+     * @param status the status to set.
+     */
+    public void setStatus(YangStatusType status) {
+        this.status = status;
+    }
+
+    /**
+     * Get the cached file handle.
+     *
+     * @return the fileHandle
+     */
+    public CachedFileHandle getFileHandle() {
+        return fileHandle;
+    }
+
+    /**
+     * Set the cached file handle.
+     *
+     * @param handle the fileHandle to set
+     */
+    public void setFileHandle(CachedFileHandle handle) {
+        fileHandle = handle;
+    }
+
+    /**
+     * Returns the type of the data.
+     *
+     * @return returns CONTAINER_DATA.
+     */
+    public ParsableDataType getParsableDataType() {
+        return ParsableDataType.CONTAINER_DATA;
+    }
+
+    /**
+     * Validate the data on entering the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnEntry() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /**
+     * Validate the data on exiting the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnExit() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /**
+     * Get the mapped java package.
+     *
+     * @return the java package
+     */
+    @Override
+    public String getPackage() {
+        return pkg;
+    }
+
+    /**
+     * Set the mapped java package.
+     *
+     * @param pcg the package to set
+     */
+    @Override
+    public void setPackage(String pcg) {
+        pkg = pcg;
+    }
+
+    /**
+     * Generate the java code corresponding to YANG container.
+     */
+    public void generateJavaCodeEntry() {
+        //TODO: autogenerated method stub, to be implemented
+    return;
+    }
+
+    /**
+     * Free resources used to generate code.
+     */
+    public void generateJavaCodeExit() {
+          //TODO: autogenerated method stub, to be implemented
+        return;
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangDataTypes.java b/src/main/java/org/onosproject/yangutils/datamodel/YangDataTypes.java
index 1f9466f..bf77059 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangDataTypes.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangDataTypes.java
@@ -22,18 +22,21 @@
 public enum YangDataTypes {
     /**
      * Reference:RFC 6020.
+     *
      * int8 represents integer values between -128 and 127, inclusively.
      */
     INT8,
 
     /**
      * Reference:RFC 6020.
+     *
      * int16 represents integer values between -32768 and 32767, inclusively.
      */
     INT16,
 
     /**
      * Reference:RFC 6020.
+     *
      * int32 represents integer values between -2147483648 and 2147483647,
      * inclusively.
      */
@@ -41,6 +44,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * int64 represents integer values between -9223372036854775808 and
      * 9223372036854775807, inclusively.
      */
@@ -48,24 +52,28 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * uint8 represents integer values between 0 and 255, inclusively.
      */
     UINT8,
 
     /**
      * Reference:RFC 6020.
+     *
      * uint16 represents integer values between 0 and 65535, inclusively.
      */
     UINT16,
 
     /**
      * Reference:RFC 6020.
+     *
      * uint32 represents integer values between 0 and 4294967295, inclusively.
      */
     UINT32,
 
     /**
      * Reference:RFC 6020.
+     *
      * uint64 represents integer values between 0 and 18446744073709551615,
      * inclusively.
      */
@@ -73,6 +81,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The decimal64 type represents a subset of the real numbers, which can be
      * represented by decimal numerals. The value space of decimal64 is the set
      * of numbers that can be obtained by multiplying a 64-bit signed integer by
@@ -83,6 +92,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The string built-in type represents human-readable strings in YANG. Legal
      * characters are tab, carriage return, line feed, and the legal characters
      * of Unicode and ISO/IEC 10646
@@ -91,12 +101,14 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The boolean built-in type represents a boolean value.
      */
     BOOLEAN,
 
     /**
      * Reference:RFC 6020.
+     *
      * The enumeration built-in type represents values from a set of assigned
      * names.
      */
@@ -104,6 +116,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The bits built-in type represents a bit set. That is, a bits value is a
      * set of flags identified by small integer position numbers starting at 0.
      * Each bit number has an assigned name.
@@ -112,6 +125,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The binary built-in type represents any binary data, i.e., a sequence of
      * octets.
      */
@@ -119,6 +133,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The leafref type is used to reference a particular leaf instance in the
      * data tree. The "path" sub-statement (Section 9.9.2) selects a set of leaf
      * instances, and the leafref value space is the set of values of these leaf
@@ -139,12 +154,14 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The identityref type is used to reference an existing identity.
      */
     IDENTITYREF,
 
     /**
      * Reference:RFC 6020.
+     *
      * The empty built-in type represents a leaf that does not have any value,
      * it conveys information by its presence or absence.
      *
@@ -154,6 +171,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The union built-in type represents a value that corresponds to one of its
      * member types.
      *
@@ -175,6 +193,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The instance-identifier built-in type is used to uniquely identify a
      * particular instance node in the data tree.
      *
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangList.java b/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
new file mode 100644
index 0000000..d75c09d
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
@@ -0,0 +1,456 @@
+/*
+ * 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.datamodel;
+
+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;
+
+/*-
+ *  The "list" statement is used to define an interior data node in the
+ *  schema tree.  A list node may exist in multiple instances in the data
+ *  tree.  Each such instance is known as a list entry.  The "list"
+ *  statement takes one argument, which is an identifier, followed by a
+ *  block of sub-statements that holds detailed list information.
+ *
+ *  A list entry is uniquely identified by the values of the list's keys,
+ *  if defined.
+ *
+ *  The list's sub-statements
+ *
+ *                +--------------+---------+-------------+------------------+
+ *                | substatement | section | cardinality |data model mapping|
+ *                +--------------+---------+-------------+------------------+
+ *                | anyxml       | 7.10    | 0..n        |-not supported    |
+ *                | choice       | 7.9     | 0..n        |-child nodes      |
+ *                | config       | 7.19.1  | 0..1        |-boolean          |
+ *                | container    | 7.5     | 0..n        |-child nodes      |
+ *                | description  | 7.19.3  | 0..1        |-string           |
+ *                | grouping     | 7.11    | 0..n        |-child nodes      |
+ *                | if-feature   | 7.18.2  | 0..n        |-TODO             |
+ *                | key          | 7.8.2   | 0..1        |-String list      |
+ *                | leaf         | 7.6     | 0..n        |-YangLeaf         |
+ *                | leaf-list    | 7.7     | 0..n        |-YangLeafList     |
+ *                | list         | 7.8     | 0..n        |-child nodes      |
+ *                | max-elements | 7.7.4   | 0..1        |-int              |
+ *                | min-elements | 7.7.3   | 0..1        |-int              |
+ *                | must         | 7.5.3   | 0..n        |-TODO             |
+ *                | ordered-by   | 7.7.5   | 0..1        |-TODO             |
+ *                | reference    | 7.19.4  | 0..1        |-string           |
+ *                | status       | 7.19.2  | 0..1        |-YangStatus       |
+ *                | typedef      | 7.3     | 0..n        |-child nodes      |
+ *                | unique       | 7.8.3   | 0..n        |-TODO             |
+ *                | uses         | 7.12    | 0..n        |-child nodes(TODO)|
+ *                | when         | 7.19.5  | 0..1        |-TODO             |
+ *                +--------------+---------+-------------+------------------+
+ */
+
+/**
+ * List data represented in YANG.
+ */
+public class YangList extends YangNode
+        implements YangLeavesHolder, YangCommonInfo, Parsable {
+
+    /**
+     * name of the YANG list.
+     */
+    private String name;
+
+    /**
+     * If list maintains config data.
+     */
+    private boolean isConfig;
+
+    /**
+     * Description of list.
+     */
+    private String description;
+
+    /**
+     * Reference RFC 6020.
+     *
+     * The "key" statement, which MUST be present if the list represents
+     * configuration, and MAY be present otherwise, takes as an argument a
+     * string that specifies a space-separated list of leaf identifiers of this
+     * list. A leaf identifier MUST NOT appear more than once in the key. Each
+     * such leaf identifier MUST refer to a child leaf of the list. The leafs
+     * can be defined directly in sub-statements to the list, or in groupings
+     * used in the list.
+     *
+     * The combined values of all the leafs specified in the key are used to
+     * uniquely identify a list entry. All key leafs MUST be given values when a
+     * list entry is created. Thus, any default values in the key leafs or their
+     * types are ignored. It also implies that any mandatory statement in the
+     * key leafs are ignored.
+     *
+     * A leaf that is part of the key can be of any built-in or derived type,
+     * except it MUST NOT be the built-in type "empty".
+     *
+     * All key leafs in a list MUST have the same value for their "config" as
+     * the list itself.
+     *
+     * List of key leaf names.
+     */
+    private List<String> keyList;
+
+    /**
+     * List of leaves.
+     */
+    @SuppressWarnings("rawtypes")
+    private List<YangLeaf> listOfLeaf;
+
+    /**
+     * List of leaf-lists.
+     */
+    @SuppressWarnings("rawtypes")
+    private List<YangLeafList> listOfLeafList;
+
+    /**
+     * The "max-elements" statement, which is optional, takes as an argument a
+     * positive integer or the string "unbounded", which puts a constraint on
+     * valid list entries. A valid leaf-list or list always has at most
+     * max-elements entries.
+     *
+     * If no "max-elements" statement is present, it defaults to "unbounded".
+     */
+    private int maxElelements;
+
+    /**
+     * The "min-elements" statement, which is optional, takes as an argument a
+     * non-negative integer that puts a constraint on valid list entries. A
+     * valid leaf-list or list MUST have at least min-elements entries.
+     *
+     * If no "min-elements" statement is present, it defaults to zero.
+     *
+     * The behavior of the constraint depends on the type of the leaf-list's or
+     * list's closest ancestor node in the schema tree that is not a non-
+     * presence container:
+     *
+     * o If this ancestor is a case node, the constraint is enforced if any
+     * other node from the case exists.
+     *
+     * o Otherwise, it is enforced if the ancestor node exists.
+     */
+    private int minElements;
+
+    /**
+     * reference.
+     */
+    private String reference;
+
+    /**
+     * Status of the node.
+     */
+
+    private YangStatusType status;
+
+    /**
+     * Constructor.
+     *
+     * @param type list node
+     */
+    public YangList(YangNodeType type) {
+        super(type);
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#getName()
+     */
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#setName(java.lang.String)
+     */
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * Get the config flag.
+     *
+     * @return the isConfig
+     */
+    public boolean isConfig() {
+        return isConfig;
+    }
+
+    /**
+     * Set the config flag.
+     *
+     * @param isCfg the config flag.
+     */
+    public void setConfig(boolean isCfg) {
+        isConfig = isCfg;
+    }
+
+    /**
+     * Get the description.
+     *
+     * @return the description.
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Set the description.
+     *
+     * @param description set the description.
+     */
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Get the list of key field names.
+     *
+     * @return the list of key field names.
+     */
+    public List<String> getKeyList() {
+        return keyList;
+    }
+
+    /**
+     * Set the list of key field names.
+     *
+     * @param keyList the list of key field names.
+     */
+    private void setKeyList(List<String> keyList) {
+        this.keyList = keyList;
+    }
+
+    /**
+     * Add a key field name.
+     *
+     * @param key key field name.
+     */
+    public void addKey(String key) {
+        if (getKeyList() == null) {
+            setKeyList(new LinkedList<String>());
+        }
+
+        getKeyList().add(key);
+    }
+
+    /**
+     * Get the list of leaves.
+     *
+     * @return the list of leaves.
+     */
+    @SuppressWarnings("rawtypes")
+    public List<YangLeaf> getListOfLeaf() {
+        return listOfLeaf;
+    }
+
+    /**
+     * Set the list of leaves.
+     *
+     * @param leafsList the list of leaf to set.
+     */
+    @SuppressWarnings("rawtypes")
+    private void setListOfLeaf(List<YangLeaf> leafsList) {
+        listOfLeaf = leafsList;
+    }
+
+    /**
+     * Add a leaf.
+     *
+     * @param leaf the leaf to be added.
+     */
+    @SuppressWarnings("rawtypes")
+    public void addLeaf(YangLeaf<?> leaf) {
+        if (getListOfLeaf() == null) {
+            setListOfLeaf(new LinkedList<YangLeaf>());
+        }
+
+        getListOfLeaf().add(leaf);
+    }
+
+    /**
+     * Get the list of leaf-list.
+     *
+     * @return the list of leaf-list.
+     */
+    @SuppressWarnings("rawtypes")
+    public List<YangLeafList> getListOfLeafList() {
+        return listOfLeafList;
+    }
+
+    /**
+     * Set the list of leaf-list.
+     *
+     * @param listOfLeafList the list of leaf-list to set.
+     */
+    @SuppressWarnings("rawtypes")
+    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+        this.listOfLeafList = listOfLeafList;
+    }
+
+    /**
+     * Add a leaf-list.
+     *
+     * @param leafList the leaf-list to be added.
+     */
+    @SuppressWarnings("rawtypes")
+    public void addLeafList(YangLeafList<?> leafList) {
+        if (getListOfLeafList() == null) {
+            setListOfLeafList(new LinkedList<YangLeafList>());
+        }
+
+        getListOfLeafList().add(leafList);
+    }
+
+    /**
+     * Get the max elements.
+     *
+     * @return the max elements.
+     */
+    public int getMaxElelements() {
+        return maxElelements;
+    }
+
+    /**
+     * Set the max elements.
+     *
+     * @param maxElelements the max elements.
+     */
+    public void setMaxElelements(int maxElelements) {
+        this.maxElelements = maxElelements;
+    }
+
+    /**
+     * Get the minimum elements.
+     *
+     * @return the minimum elements.
+     */
+    public int getMinElements() {
+        return minElements;
+    }
+
+    /**
+     * Set the minimum elements.
+     *
+     * @param minElements the minimum elements.
+     */
+    public void setMinElements(int minElements) {
+        this.minElements = minElements;
+    }
+
+    /**
+     * Get the textual reference.
+     *
+     * @return the reference.
+     */
+    public String getReference() {
+        return reference;
+    }
+
+    /**
+     * Set the textual reference.
+     *
+     * @param reference the reference to set.
+     */
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * Get the status.
+     *
+     * @return the status.
+     */
+    public YangStatusType getStatus() {
+        return status;
+    }
+
+    /**
+     * Set the status.
+     *
+     * @param status the status to set.
+     */
+    public void setStatus(YangStatusType status) {
+        this.status = status;
+    }
+
+    /**
+     * Returns the type of the parsed data.
+     *
+     * @return returns LIST_DATA.
+     */
+    public ParsableDataType getParsableDataType() {
+        return ParsableDataType.LIST_DATA;
+    }
+
+    /**
+     * Validate the data on entering the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnEntry() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /**
+     * Validate the data on exiting the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnExit() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
+     */
+    public void generateJavaCodeEntry() {
+        // TODO Auto-generated method stub
+
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeExit()
+     */
+    public void generateJavaCodeExit() {
+        // TODO Auto-generated method stub
+
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#getPackage()
+     */
+    @Override
+    public String getPackage() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#setPackage(java.lang.String)
+     */
+    @Override
+    public void setPackage(String pkg) {
+        // 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 d6f7304..1434363 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
@@ -17,7 +17,14 @@
 
 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.CodeGenerator;
+import org.onosproject.yangutils.utils.io.CachedFileHandle;
+
+/*-
  * Reference:RFC 6020.
  * The "module" statement defines the module's name,
  * and groups all statements that belong to the module together. The "module"
@@ -57,14 +64,11 @@
  *                +--------------+---------+-------------+-----------------------+
  */
 
-import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
-import org.onosproject.yangutils.parser.Parsable;
-import org.onosproject.yangutils.parser.ParsableDataType;
-
 /**
  * Data model node to maintain information defined in YANG module.
  */
-public class YangModule extends YangNode implements YangLeavesHolder, YangDesc, YangReference, Parsable {
+public class YangModule extends YangNode
+        implements YangLeavesHolder, YangDesc, YangReference, Parsable, CodeGenerator {
 
     /**
      * Name of the module.
@@ -73,6 +77,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The "contact" statement provides contact information for the module. The
      * argument is a string that is used to specify contact information for the
      * person or persons to whom technical queries concerning this module should
@@ -83,6 +88,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The "description" statement takes as an argument a string that contains a
      * human-readable textual description of this definition. The text is
      * provided in a language (or languages) chosen by the module developer; for
@@ -119,6 +125,7 @@
 
     /**
      * Reference:RFC 6020.
+     *
      * The "organization" statement defines the party responsible for this
      * module. The argument is a string that is used to specify a textual
      * description of the organization(s) under whose auspices this module was
@@ -147,26 +154,34 @@
     private byte version;
 
     /**
+     * package of the generated java code.
+     */
+    private String pkg;
+
+    /**
+     * Cached Java File Handle.
+     */
+    private CachedFileHandle fileHandle;
+
+    /**
      * Create a YANG node of module type.
      */
     public YangModule() {
         super(YangNodeType.MODULE_NODE);
     }
 
-    /**
-     * Get the module name.
-     *
-     * @return the module name.
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#getName()
      */
+    @Override
     public String getName() {
         return name;
     }
 
-    /**
-     * set the module name.
-     *
-     * @param moduleName the module name to set.
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#setName(java.lang.String)
      */
+    @Override
     public void setName(String moduleName) {
         name = moduleName;
     }
@@ -375,7 +390,7 @@
      * @param org the organization to set.
      */
     public void setOrganization(String org) {
-        this.organization = org;
+        organization = org;
     }
 
     /**
@@ -451,6 +466,44 @@
     }
 
     /**
+     * Get the mapped java package.
+     *
+     * @return the java package
+     */
+    @Override
+    public String getPackage() {
+        return pkg;
+    }
+
+    /**
+     * Set the mapped java package.
+     *
+     * @param pcg the package to set
+     */
+    @Override
+    public void setPackage(String pcg) {
+        pkg = pcg;
+    }
+
+    /**
+     * Get the cached file handle.
+     *
+     * @return the fileHandle
+     */
+    public CachedFileHandle getFileHandle() {
+        return fileHandle;
+    }
+
+    /**
+     * Set the cached file handle.
+     *
+     * @param handle the fileHandle to set
+     */
+    public void setFileHandle(CachedFileHandle handle) {
+        fileHandle = handle;
+    }
+
+    /**
      * Returns the type of the parsed data.
      *
      * @return returns MODULE_DATA.
@@ -476,4 +529,22 @@
     public void validateDataOnExit() throws DataModelException {
         // TODO auto-generated method stub, to be implemented by parser
     }
+
+    /**
+     * Generates java code for module.
+     */
+    public void generateJavaCodeEntry() {
+        //TODO: autogenerated method stub, to be implemented
+
+        return;
+    }
+
+    /**
+     * Free resources used to generate code.
+     */
+    public void generateJavaCodeExit() {
+                //TODO: autogenerated method stub, to be implemented
+        return;
+    }
+
 }
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java b/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
index 0d050c6..8c69bb6 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
@@ -16,25 +16,36 @@
 package org.onosproject.yangutils.datamodel;
 
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
+import org.onosproject.yangutils.translator.CodeGenerator;
 
 /**
  * Base class of a node in data model tree.
  */
-public abstract class YangNode {
+public abstract class YangNode implements CodeGenerator {
 
-    /* Type of information maintained in node */
+    /**
+     * Type of node.
+     */
     private YangNodeType nodeType;
 
-    /* Parent reference */
+    /**
+     * Parent reference.
+     */
     private YangNode parent;
 
-    /* First child reference */
+    /**
+     * First child reference.
+     */
     private YangNode child;
 
-    /* Next sibling reference */
+    /**
+     * Next sibling reference.
+     */
     private YangNode nextSibling;
 
-    /* Previous sibling reference */
+    /**
+     * Previous sibling reference.
+     */
     private YangNode previousSibling;
 
     /**
@@ -213,4 +224,33 @@
         curNode.setNextSibling(newChild);
         return;
     }
+
+    /**
+     * Get the YANG name of the node.
+     *
+     * @return the name of node as defined in YANG file.
+     */
+    public abstract String getName();
+
+    /**
+     * Set the YANG name of the node.
+     *
+     * @param name the name of node as defined in YANG file.
+     */
+    public abstract void setName(String name);
+
+    /**
+     * Get the mapped java package.
+     *
+     * @return the java package
+     */
+    public abstract String getPackage();
+
+    /**
+     * Set the mapped java package.
+     *
+     * @param pkg the package to set
+     */
+    public abstract void setPackage(String pkg);
+
 }
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangStatusType.java b/src/main/java/org/onosproject/yangutils/datamodel/YangStatusType.java
index d23ede4..302af6a 100644
--- a/src/main/java/org/onosproject/yangutils/datamodel/YangStatusType.java
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangStatusType.java
@@ -23,27 +23,30 @@
  */
 
 /**
- * ENUM to represent the status of YANG entities.
+ * Represents the status of YANG entities.
  */
 public enum YangStatusType {
     /**
      * Reference:RFC 6020.
+     *
      * "current" means that the definition is current and valid.
      */
     CURRENT,
 
     /**
      * Reference:RFC 6020.
-     * "deprecated" indicates an obsolete definition, but it permits new/
-     * continued implementation in order to foster interoperability with
-     * older/existing implementations.
+     *
+     * "deprecated" indicates an obsolete definition, but it
+     * permits new/ continued implementation in order to foster interoperability
+     * with older/existing implementations.
      */
     DEPRECATED,
 
     /**
      * Reference:RFC 6020.
-     * "obsolete" means the definition is obsolete and SHOULD NOT be implemented
-     * and/or can be removed from implementations.
+     *
+     * "obsolete" means the definition is obsolete and
+     * SHOULD NOT be implemented and/or can be removed from implementations.
      */
     OBSOLETE
 }
diff --git a/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java b/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
new file mode 100644
index 0000000..163599a
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
@@ -0,0 +1,490 @@
+/*
+ * 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.datamodel;
+
+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;
+
+/*
+ *  Reference RFC 6020.
+ *
+ *  While the primary unit in YANG is a module, a YANG module can itself
+ *  be constructed out of several submodules.  Submodules allow a module
+ *  designer to split a complex model into several pieces where all the
+ *  submodules contribute to a single namespace, which is defined by the
+ *  module that includes the submodules.
+ *
+ *  The "submodule" statement defines the submodule's name, and groups
+ *  all statements that belong to the submodule together.  The
+ *  "submodule" statement's argument is the name of the submodule,
+ *  followed by a block of sub-statements that hold detailed submodule
+ *  information.
+ *
+ *  The submodule's sub-statements
+ *
+ *                +--------------+---------+-------------+------------------+
+ *                | substatement | section | cardinality |data model mapping|
+ *                +--------------+---------+-------------+------------------+
+ *                | anyxml       | 7.10    | 0..n        | - not supported  |
+ *                | augment      | 7.15    | 0..n        | - child nodes    |
+ *                | belongs-to   | 7.2.2   | 1           | - YangBelongsTo  |
+ *                | choice       | 7.9     | 0..n        | - child nodes    |
+ *                | contact      | 7.1.8   | 0..1        | - string         |
+ *                | container    | 7.5     | 0..n        | - child nodes    |
+ *                | description  | 7.19.3  | 0..1        | - string         |
+ *                | deviation    | 7.18.3  | 0..n        | - TODO           |
+ *                | extension    | 7.17    | 0..n        | - TODO           |
+ *                | feature      | 7.18.1  | 0..n        | - TODO           |
+ *                | grouping     | 7.11    | 0..n        | - child nodes    |
+ *                | identity     | 7.16    | 0..n        | - TODO           |
+ *                | import       | 7.1.5   | 0..n        | - YangImport     |
+ *                | include      | 7.1.6   | 0..n        | - YangInclude    |
+ *                | leaf         | 7.6     | 0..n        | - YangLeaf       |
+ *                | leaf-list    | 7.7     | 0..n        | - YangLeafList   |
+ *                | list         | 7.8     | 0..n        | - child nodes    |
+ *                | notification | 7.14    | 0..n        | - TODO           |
+ *                | organization | 7.1.7   | 0..1        | - string         |
+ *                | reference    | 7.19.4  | 0..1        | - string         |
+ *                | revision     | 7.1.9   | 0..n        | - string         |
+ *                | rpc          | 7.13    | 0..n        | - TODO           |
+ *                | typedef      | 7.3     | 0..n        | - child nodes    |
+ *                | uses         | 7.12    | 0..n        | - child nodes    |
+ *                | YANG-version | 7.1.2   | 0..1        | - int            |
+ *                +--------------+---------+-------------+------------------+
+ */
+/**
+ * Data model node to maintain information defined in YANG sub-module.
+ */
+public class YangSubModule extends YangNode
+        implements YangLeavesHolder, YangDesc, YangReference, Parsable {
+
+    /**
+     * Name of sub module.
+     */
+    private String name;
+
+    /**
+     * Module to which it belongs to.
+     */
+    private YangBelongsTo belongsTo;
+
+    /**
+     * Reference RFC 6020.
+     *
+     * The "contact" statement provides contact information for the module. The
+     * argument is a string that is used to specify contact information for the
+     * person or persons to whom technical queries concerning this module should
+     * be sent, such as their name, postal address, telephone number, and
+     * electronic mail address.
+     */
+    private String contact;
+
+    /**
+     * Description.
+     */
+    private String description;
+
+    /**
+     * List of YANG modules imported.
+     */
+    private List<YangImport> importList;
+
+    /**
+     * List of YANG sub-modules included.
+     */
+    private List<YangInclude> includeList;
+
+    /**
+     * List of leaves at root level in the sub-module.
+     */
+    @SuppressWarnings("rawtypes")
+    private List<YangLeaf> listOfLeaf;
+
+    /**
+     * List of leaf-lists at root level in the sub-module.
+     */
+    @SuppressWarnings("rawtypes")
+    private List<YangLeafList> listOfLeafList;
+
+    /**
+     * organization owner of the sub-module.
+     */
+    private String organization;
+
+    /**
+     * reference of the sub-module.
+     */
+    private String reference;
+
+    /**
+     * revision info of the sub-module.
+     */
+    private YangRevision revision;
+
+    /**
+     * YANG version.
+     */
+    private byte version;
+
+    /**
+     * Create a sub module node.
+     */
+    public YangSubModule() {
+        super(YangNodeType.SUB_MODULE_NODE);
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#getName()
+     */
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#setName(java.lang.String)
+     */
+    @Override
+    public void setName(String subModuleName) {
+        name = subModuleName;
+    }
+
+    /**
+     * Get the module info.
+     *
+     * @return the belongs to info
+     */
+    public YangBelongsTo getBelongsTo() {
+        return belongsTo;
+    }
+
+    /**
+     * Set the module info.
+     *
+     * @param belongsTo module info to set.
+     */
+    public void setBelongsTo(YangBelongsTo belongsTo) {
+        this.belongsTo = belongsTo;
+    }
+
+    /**
+     * Get the contact.
+     *
+     * @return the contact.
+     */
+    public String getContact() {
+        return contact;
+    }
+
+    /**
+     * Set the contact.
+     *
+     * @param contact the contact to set
+     */
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+
+    /**
+     * Get the description.
+     *
+     * @return the description.
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Set the description.
+     *
+     * @param description set the description.
+     */
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Get the list of imported modules.
+     *
+     * @return the list of imported modules.
+     */
+    public List<YangImport> getImportList() {
+        return importList;
+    }
+
+    /**
+     * prevent setting the import list from outside.
+     *
+     * @param importList the import list to set.
+     */
+    private void setImportList(List<YangImport> importList) {
+        this.importList = importList;
+    }
+
+    /**
+     * Add the imported module information to the import list.
+     *
+     * @param importedModule module being imported.
+     */
+    public void addImportedInfo(YangImport importedModule) {
+
+        if (getImportList() == null) {
+            setImportList(new LinkedList<YangImport>());
+        }
+
+        getImportList().add(importedModule);
+
+        return;
+    }
+
+    /**
+     * Get the list of included sub modules.
+     *
+     * @return the included list of sub modules.
+     */
+    public List<YangInclude> getIncludeList() {
+        return includeList;
+    }
+
+    /**
+     * Set the list of included sub modules.
+     *
+     * @param includeList the included list to set.
+     */
+    private void setIncludeList(List<YangInclude> includeList) {
+        this.includeList = includeList;
+    }
+
+    /**
+     * Add the included sub module information to the include list.
+     *
+     * @param includeModule submodule being included.
+     */
+    public void addIncludedInfo(YangInclude includeModule) {
+
+        if (getIncludeList() == null) {
+            setIncludeList(new LinkedList<YangInclude>());
+        }
+
+        getIncludeList().add(includeModule);
+        return;
+    }
+
+    /**
+     * Get the list of leaves.
+     *
+     * @return the list of leaves.
+     */
+    @SuppressWarnings("rawtypes")
+    public List<YangLeaf> getListOfLeaf() {
+        return listOfLeaf;
+    }
+
+    /**
+     * Set the list of leaves.
+     *
+     * @param leafsList the list of leaf to set.
+     */
+    @SuppressWarnings("rawtypes")
+    private void setListOfLeaf(List<YangLeaf> leafsList) {
+        listOfLeaf = leafsList;
+    }
+
+    /**
+     * Add a leaf.
+     *
+     * @param leaf the leaf to be added.
+     */
+    @SuppressWarnings("rawtypes")
+    public void addLeaf(YangLeaf<?> leaf) {
+        if (getListOfLeaf() == null) {
+            setListOfLeaf(new LinkedList<YangLeaf>());
+        }
+
+        getListOfLeaf().add(leaf);
+    }
+
+    /**
+     * Get the list of leaf-list.
+     *
+     * @return the list of leaf-list.
+     */
+    @SuppressWarnings("rawtypes")
+    public List<YangLeafList> getListOfLeafList() {
+        return listOfLeafList;
+    }
+
+    /**
+     * Set the list of leaf-list.
+     *
+     * @param listOfLeafList the list of leaf-list to set.
+     */
+    @SuppressWarnings("rawtypes")
+    private void setListOfLeafList(List<YangLeafList> listOfLeafList) {
+        this.listOfLeafList = listOfLeafList;
+    }
+
+    /**
+     * Add a leaf-list.
+     *
+     * @param leafList the leaf-list to be added.
+     */
+    @SuppressWarnings("rawtypes")
+    public void addLeafList(YangLeafList<?> leafList) {
+        if (getListOfLeafList() == null) {
+            setListOfLeafList(new LinkedList<YangLeafList>());
+        }
+
+        getListOfLeafList().add(leafList);
+    }
+
+    /**
+     * Get the sub-modules organization.
+     *
+     * @return the organization.
+     */
+    public String getOrganization() {
+        return organization;
+    }
+
+    /**
+     * Set the sub-modules organization.
+     *
+     * @param org the organization to set.
+     */
+    public void setOrganization(String org) {
+        organization = org;
+    }
+
+    /**
+     * Get the textual reference.
+     *
+     * @return the reference.
+     */
+    public String getReference() {
+        return reference;
+    }
+
+    /**
+     * Set the textual reference.
+     *
+     * @param reference the reference to set.
+     */
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * Get the revision.
+     *
+     * @return the revision.
+     */
+    public YangRevision getRevision() {
+        return revision;
+    }
+
+    /**
+     * Set the revision.
+     *
+     * @param revision the revision to set.
+     */
+    public void setRevision(YangRevision revision) {
+        this.revision = revision;
+    }
+
+    /**
+     * Get the version.
+     *
+     * @return the version.
+     */
+    public byte getVersion() {
+        return version;
+    }
+
+    /**
+     * Set the version.
+     *
+     * @param version the version to set.
+     */
+    public void setVersion(byte version) {
+        this.version = version;
+    }
+
+    /**
+     * Returns the type of the parsed data.
+     *
+     * @return returns SUB_MODULE_DATA.
+     */
+    public ParsableDataType getParsableDataType() {
+        return ParsableDataType.SUB_MODULE_DATA;
+    }
+
+    /**
+     * Validate the data on entering the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnEntry() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /**
+     * Validate the data on exiting the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules.
+     */
+    public void validateDataOnExit() throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry()
+     */
+    public void generateJavaCodeEntry() {
+        // TODO Auto-generated method stub
+
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeExit()
+     */
+    public void generateJavaCodeExit() {
+        // TODO Auto-generated method stub
+
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#getPackage()
+     */
+    @Override
+    public String getPackage() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    /* (non-Javadoc)
+     * @see org.onosproject.yangutils.datamodel.YangNode#setPackage(java.lang.String)
+     */
+    @Override
+    public void setPackage(String pkg) {
+        // TODO Auto-generated method stub
+
+    }
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/CodeGenerator.java b/src/main/java/org/onosproject/yangutils/translator/CodeGenerator.java
new file mode 100644
index 0000000..b0ed97c
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/CodeGenerator.java
@@ -0,0 +1,34 @@
+/*
+ * 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;
+
+/**
+ * Abstraction of an entity which provides Code generator functionalities.
+ */
+public interface CodeGenerator {
+
+    /**
+     * Traverse the schema of application and generate corresponding code.
+     */
+    void generateJavaCodeEntry();
+
+    /**
+     * Traverse the schema of application and generate corresponding code.
+     */
+    void generateJavaCodeExit();
+
+}
diff --git a/src/main/java/org/onosproject/yangutils/translator/GeneratedFileType.java b/src/main/java/org/onosproject/yangutils/translator/GeneratedFileType.java
new file mode 100644
index 0000000..6a285c7
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/translator/GeneratedFileType.java
@@ -0,0 +1,34 @@
+/*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.translator;
+
+/**
+ * Type of files generated.
+ */
+public enum GeneratedFileType {
+    /**
+     * interface file.
+     */
+    INTERFACE,
+
+    /**
+     * class file.
+     */
+    BUILDER_CLASS,
+
+    /**
+     * interface and class file.
+     */
+    BOTH
+}
diff --git a/src/main/java/org/onosproject/yangutils/utils/io/CachedFileHandle.java b/src/main/java/org/onosproject/yangutils/utils/io/CachedFileHandle.java
new file mode 100644
index 0000000..1327e12
--- /dev/null
+++ b/src/main/java/org/onosproject/yangutils/utils/io/CachedFileHandle.java
@@ -0,0 +1,39 @@
+/*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();
+}
