[ONOS-5539] Process sub tree defect fix

Change-Id: I6e06a8ca430a86cc538543b161bbbc56dc9cade6
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java
index 93720fd..17976e6 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java
@@ -410,8 +410,7 @@
     public void detectCollidingChild(String idName, YangConstructType type)
             throws DataModelException {
 
-        if (getParent() instanceof YangCase &&
-                type != CASE_DATA) {
+        if (getParent() instanceof YangCase && type != CASE_DATA) {
             ((CollisionDetector) getParent()).detectCollidingChild(idName, type);
         }
         YangNode node = getChild();
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
index 76a10e1..26fcbd4 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNode.java
@@ -32,7 +32,7 @@
 /**
  * Represents base class of a node in data model tree.
  */
-public abstract class YangNode extends DefaultLocationInfo
+public abstract class YangNode
         implements Cloneable, Serializable, YangSchemaNode,
         Comparable<YangNode> {
 
@@ -78,10 +78,9 @@
      */
     private boolean isToTranslate = true;
 
-    /**
-     * Flag if the node needs to generate operation type info for translation.
-     */
-    private boolean isOpTypeReq;
+    private transient int lineNumber;
+    private transient int charPosition;
+    private String fileName;
 
     /**
      * Map of YANG context information. It is to be consumed by YMS.
@@ -146,7 +145,7 @@
      */
     protected YangNode(YangNodeType type,
                        Map<YangSchemaNodeIdentifier, YangSchemaNodeContextInfo> ysnContextInfoMap) {
-        setNodeType(type);
+        nodeType = type;
         this.ysnContextInfoMap = ysnContextInfoMap;
     }
 
@@ -889,14 +888,38 @@
      * @return true if op type info required for node
      */
     public boolean isOpTypeReq() {
-        if (this instanceof RpcNotificationContainer) {
-            isOpTypeReq = true;
-            return true;
-        }
-        if (this instanceof InvalidOpTypeHolder) {
-            isOpTypeReq = false;
-            return false;
-        }
-        return this.getParent().isOpTypeReq();
+        return this instanceof RpcNotificationContainer ||
+                !(this instanceof InvalidOpTypeHolder) &&
+                        getParent().isOpTypeReq();
+    }
+
+    @Override
+    public int getLineNumber() {
+        return lineNumber;
+    }
+
+    @Override
+    public int getCharPosition() {
+        return charPosition;
+    }
+
+    @Override
+    public void setLineNumber(int lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    @Override
+    public void setCharPosition(int charPositionInLine) {
+        charPosition = charPositionInLine;
+    }
+
+    @Override
+    public String getFileName() {
+        return fileName;
+    }
+
+    @Override
+    public void setFileName(String name) {
+        fileName = name;
     }
 }
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
index 05063d3..ad9c4f5 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangType.java
@@ -31,6 +31,8 @@
 import java.util.ListIterator;
 
 import static org.onosproject.yangutils.datamodel.BuiltInTypeObjectFactory.getDataObjectFromString;
+import static org.onosproject.yangutils.datamodel.utils.ResolvableStatus.UNRESOLVED;
+import static org.onosproject.yangutils.datamodel.utils.YangConstructType.TYPE_DATA;
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypeUtils.isOfRangeRestrictedType;
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
 
@@ -71,7 +73,7 @@
     /**
      * YANG node identifier.
      */
-    private YangNodeIdentifier nodeIdentifier;
+    private YangNodeIdentifier nodeId;
 
     /**
      * YANG data type.
@@ -109,8 +111,8 @@
      */
     public YangType() {
 
-        nodeIdentifier = new YangNodeIdentifier();
-        resolvableStatus = ResolvableStatus.UNRESOLVED;
+        nodeId = new YangNodeIdentifier();
+        resolvableStatus = UNRESOLVED;
     }
 
     /**
@@ -119,7 +121,7 @@
      * @return prefix associated with data type name
      */
     public String getPrefix() {
-        return nodeIdentifier.getPrefix();
+        return nodeId.getPrefix();
     }
 
     /**
@@ -128,7 +130,7 @@
      * @param prefix prefix associated with data type name
      */
     public void setPrefix(String prefix) {
-        nodeIdentifier.setPrefix(prefix);
+        nodeId.setPrefix(prefix);
     }
 
     /**
@@ -137,7 +139,7 @@
      * @return the name of data type
      */
     public String getDataTypeName() {
-        return nodeIdentifier.getName();
+        return nodeId.getName();
     }
 
     /**
@@ -146,7 +148,7 @@
      * @param typeName the name to set
      */
     public void setDataTypeName(String typeName) {
-        nodeIdentifier.setName(typeName);
+        nodeId.setName(typeName);
     }
 
     /**
@@ -190,25 +192,25 @@
      *
      * @return node identifier
      */
-    public YangNodeIdentifier getNodeIdentifier() {
-        return nodeIdentifier;
+    public YangNodeIdentifier getNodeId() {
+        return nodeId;
     }
 
     /**
      * Sets node identifier.
      *
-     * @param nodeIdentifier the node identifier
+     * @param nodeId the node identifier
      */
-    public void setNodeIdentifier(YangNodeIdentifier nodeIdentifier) {
-        this.nodeIdentifier = nodeIdentifier;
+    public void setNodeId(YangNodeIdentifier nodeId) {
+        this.nodeId = nodeId;
     }
 
     /**
      * Resets the class attributes to its default value.
      */
     public void resetYangType() {
-        nodeIdentifier = new YangNodeIdentifier();
-        resolvableStatus = ResolvableStatus.UNRESOLVED;
+        nodeId = new YangNodeIdentifier();
+        resolvableStatus = UNRESOLVED;
         dataType = null;
         dataTypeExtendedInfo = null;
     }
@@ -220,7 +222,7 @@
      */
     @Override
     public YangConstructType getYangConstructType() {
-        return YangConstructType.TYPE_DATA;
+        return TYPE_DATA;
     }
 
     /**
@@ -429,18 +431,24 @@
                         }
                     }
                 } else if (dataType == YangDataTypes.STRING) {
-                    if (((YangDerivedInfo) getDataTypeExtendedInfo()).getResolvedExtendedInfo() != null) {
-                        YangStringRestriction stringRestriction =
-                                ((YangStringRestriction) ((YangDerivedInfo) getDataTypeExtendedInfo())
-                                        .getResolvedExtendedInfo());
-                        if (!(stringRestriction.isValidStringOnLengthRestriction(value) &&
-                                stringRestriction.isValidStringOnPatternRestriction(value))) {
-                            throw new DataTypeException("YANG file error : Input value \"" + value
-                                                                + "\" is not a valid " + dataType);
+                    Object info = ((YangDerivedInfo) getDataTypeExtendedInfo())
+                            .getResolvedExtendedInfo();
+                    if (info != null) {
+                        if (info instanceof YangStringRestriction) {
+                            YangStringRestriction stringRestriction =
+                                    (YangStringRestriction) info;
+                            if (!(stringRestriction.isValidStringOnLengthRestriction(value) &&
+                                    stringRestriction.isValidStringOnPatternRestriction(value))) {
+                                throw new DataTypeException("YANG file error : Input value \"" + value
+                                                                    + "\" is not a valid " + dataType);
+                            }
                         }
                     }
                 } else if (dataType == YangDataTypes.BITS) {
-                    YangBits bits = (YangBits) getDataTypeExtendedInfo();
+                    YangTypeDef prevTypedef = ((YangDerivedInfo) getDataTypeExtendedInfo())
+                            .getReferredTypeDef();
+                    YangType type = prevTypedef.getTypeList().iterator().next();
+                    YangBits bits = (YangBits) type.getDataTypeExtendedInfo();
                     if (bits.fromString(value) == null) {
                         throw new DataTypeException("YANG file error : Input value \"" + value + "\" is not a valid " +
                                                             dataType);
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
index cfcd3e7..c169250 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
@@ -322,7 +322,8 @@
      * @return de-serializes YANG data-model nodes
      * @throws IOException when fails do IO operations
      */
-    private static Set<YangNode> deSerializeDataModel(String serializedFileInfo) throws IOException {
+    public static Set<YangNode> deSerializeDataModel(String serializedFileInfo)
+            throws IOException {
 
         Set<YangNode> nodes;
         try {
diff --git a/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java b/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
index aa55b96..3c1fed0 100644
--- a/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/linker/impl/YangLinkerUtils.java
@@ -49,7 +49,9 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
 
@@ -201,13 +203,19 @@
             augment.setChild(null);
 
             for (YangNode node : childNodes) {
-                YangCase javaCase = getYangCaseNode(JAVA_GENERATION);
-                javaCase.setName(node.getName());
-                augment.addChild(javaCase);
-                node.setParent(javaCase);
+                Map<YangNode, List<YangNode>> map = new LinkedHashMap<>();
                 node.setNextSibling(null);
                 node.setPreviousSibling(null);
+                node.setParent(null);
+                YangCase javaCase = getYangCaseNode(JAVA_GENERATION);
+                javaCase.setName(node.getName());
+                //Break the tree to from a new tree.
+                traverseAndBreak(node, map);
+                augment.addChild(javaCase);
+                node.setParent(javaCase);
                 javaCase.addChild(node);
+                //Connect each node to its correct parent again.
+                connectTree(map);
             }
             if (augment.getListOfLeaf() != null) {
                 for (YangLeaf leaf : augment.getListOfLeaf()) {
@@ -237,6 +245,63 @@
         }
     }
 
+    private static void connectTree(Map<YangNode, List<YangNode>> map)
+            throws DataModelException {
+        ArrayList<YangNode> keys = new ArrayList<>(map.keySet());
+        int size = keys.size();
+        for (int i = size - 1; i >= 0; i--) {
+            YangNode curNode = keys.get(i);
+            List<YangNode> nodes = map.get(curNode);
+            if (nodes != null) {
+                for (YangNode node : nodes) {
+                    curNode.addChild(node);
+                }
+            }
+        }
+        map.clear();
+    }
+
+    private static void processHierarchyChild(YangNode node,
+                                              Map<YangNode, List<YangNode>> map) {
+        YangNode child = node.getChild();
+        if (child != null) {
+            List<YangNode> nodes = new ArrayList<>();
+            while (child != null) {
+                nodes.add(child);
+                child.setParent(null);
+                child = child.getNextSibling();
+                if (child != null) {
+                    child.getPreviousSibling().setNextSibling(null);
+                    child.setPreviousSibling(null);
+                }
+            }
+            map.put(node, nodes);
+        }
+        node.setChild(null);
+    }
+
+    private static void traverseAndBreak(YangNode rootNode,
+                                         Map<YangNode, List<YangNode>> map) {
+
+        YangNode curNode = rootNode;
+        TraversalType curTraversal = ROOT;
+        while (curNode != null) {
+            if (curTraversal != PARENT && curNode.getChild() != null) {
+                curTraversal = CHILD;
+                curNode = curNode.getChild();
+            } else if (curNode.getNextSibling() != null) {
+                curTraversal = SIBILING;
+                curNode = curNode.getNextSibling();
+            } else {
+                curTraversal = PARENT;
+                curNode = curNode.getParent();
+                if (curNode != null) {
+                    processHierarchyChild(curNode, map);
+                }
+            }
+        }
+    }
+
     /**
      * Returns error messages.
      *
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index 00a7baf..7f6eb84 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -20,12 +20,12 @@
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
-import org.onosproject.yangutils.datamodel.YangGrouping;
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.datamodel.YangSchemaNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
 import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
@@ -114,8 +114,10 @@
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.INTERFACE;
+import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION;
 import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION_IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_PKG;
+import static org.onosproject.yangutils.utils.UtilConstants.METHOD;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_ATTRIBUTE;
 import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_TYPE_CLASS;
@@ -123,6 +125,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
 import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
+import static org.onosproject.yangutils.utils.UtilConstants.REFLECT_IMPORTS;
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
@@ -134,6 +137,7 @@
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ADD_TO_LIST;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.SETTER_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
@@ -606,10 +610,20 @@
         TempJavaBeanFragmentFiles tempFiles =
                 getBeanFiles((JavaCodeGeneratorInfo) parent);
         tempFiles.setAttrNode(curNode);
-
-        JavaAttributeInfo attr =
-                getCurNodeAsAttributeInTarget(curNode, parent, isList,
-                                              tempFiles);
+        if (curNode instanceof YangChoice) {
+            JavaQualifiedTypeInfoTranslator info = new
+                    JavaQualifiedTypeInfoTranslator();
+            info.setClassInfo(INVOCATION_TARGET_EXCEPTION);
+            info.setPkgInfo(REFLECT_IMPORTS);
+            tempFiles.addToSubTreeImports(info);
+            info = new
+                    JavaQualifiedTypeInfoTranslator();
+            info.setClassInfo(METHOD);
+            info.setPkgInfo(REFLECT_IMPORTS);
+            tempFiles.addToSubTreeImports(info);
+        }
+        JavaAttributeInfo attr = getCurNodeAsAttributeInTarget(
+                curNode, parent, isList, tempFiles);
         tempFiles.addJavaSnippetInfoToApplicableTempFiles(attr, config);
     }
 
@@ -763,16 +777,10 @@
                 container.getDataType(),
                 tempFiles.getIsQualifiedAccessOrAddToImportList(
                         container.getJavaQualifiedInfo()), listAttribute);
-        boolean isInGrouping;
-        if (container.isLeafList()) {
-            isInGrouping = !(((YangLeafList) container).getContainedIn()
-                    instanceof YangGrouping);
-        } else {
-            isInGrouping = !(((YangLeaf) container).getContainedIn()
-                    instanceof YangGrouping);
-        }
-        if (container.getDataType().getDataType() == YangDataTypes.BITS &&
-                isInGrouping) {
+        boolean condition =
+                ((YangSchemaNode) container).getReferredSchema() == null &&
+                        container.getDataType().getDataType() == YangDataTypes.BITS;
+        if (condition) {
             addBitsHandler(attr, container.getDataType(), tempFiles);
         }
         return attr;
@@ -1094,7 +1102,12 @@
             throws IOException {
         String setter = getSetterForClass(attr, getGeneratedJavaClassName(),
                                           getGeneratedJavaFiles());
-        appendToFile(setterImplTempFileHandle, getOverRideString() + setter);
+        String javadoc = getOverRideString();
+        if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
+            javadoc = getJavaDoc(SETTER_METHOD, attr.getAttributeName(),
+                                 false, null);
+        }
+        appendToFile(setterImplTempFileHandle, javadoc + setter);
     }
 
     /**
@@ -1106,9 +1119,13 @@
     protected void addGetterImpl(JavaAttributeInfo attr)
             throws IOException {
         String getter = getGetterForClass(attr, getGeneratedJavaFiles());
+        String javadoc = getOverRideString();
+        if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
+            javadoc = getJavaDoc(GETTER_METHOD, attr.getAttributeName(),
+                                 false, null);
+        }
         if (javaFlagSet(BUILDER_CLASS_MASK)) {
-            appendToFile(getterImplTempFileHandle, getOverRideString() +
-                    getter);
+            appendToFile(getterImplTempFileHandle, javadoc + getter);
         } else {
             String appDataStructure = null;
             if (attr.getCompilerAnnotation() != null) {
@@ -1531,8 +1548,8 @@
                 new JavaQualifiedTypeInfoTranslator();
         typeInfo.setClassInfo(BIT_SET);
         typeInfo.setPkgInfo(JAVA_UTIL_PKG);
-        this.getJavaImportData().addImportInfo(typeInfo, info.getJavaName(),
-                                               info.getPackage());
+        getJavaImportData().addImportInfo(typeInfo, info.getJavaName(),
+                                          info.getPackage());
         JavaAttributeInfo attributeInfo =
                 getAttributeInfoForTheData(typeInfo, VALUE_LEAF, null, false, false);
         addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
@@ -1617,10 +1634,12 @@
         if (tempFlagSet(ATTRIBUTES_MASK)) {
             addAttribute(newAttrInfo);
         }
-        if (tempFlagSet(GETTER_FOR_INTERFACE_MASK)) {
+        if (tempFlagSet(GETTER_FOR_INTERFACE_MASK) &&
+                !attrName.equals(SUBTREE_FILTERED)) {
             addGetterForInterface(newAttrInfo);
         }
-        if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required) {
+        if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required &&
+                !attrName.equals(SUBTREE_FILTERED)) {
             addSetterForInterface(newAttrInfo);
         }
         if (tempFlagSet(SETTER_FOR_CLASS_MASK) && required) {
@@ -1826,13 +1845,10 @@
 
     //Adds import for bitset and base64 list.
     private void addBitsAndBase64Imports(YangNode curNode, List<String> imports) {
-        if (curNode instanceof YangLeavesHolder) {
-            YangLeavesHolder holder = (YangLeavesHolder) curNode;
-            String impt = getJavaImportData()
-                    .getImportForToBitSet();
-            if (!holder.getListOfLeaf().isEmpty() &&
-                    !imports.contains(impt)) {
-                imports.add(impt);
+        if (curNode.isOpTypeReq()) {
+            String impt = getJavaImportData().getImportForToBitSet();
+            if (!imports.contains(impt)) {
+                imports.add(getJavaImportData().getImportForToBitSet());
             }
         }
     }
@@ -1890,7 +1906,9 @@
      * @param imports list of imports
      */
     private void addInvocationExceptionImport(List<String> imports) {
-        imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
+        if (!imports.contains(INVOCATION_TARGET_EXCEPTION_IMPORT)) {
+            imports.add(INVOCATION_TARGET_EXCEPTION_IMPORT);
+        }
     }
 
     /**
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
index 51aec14..8514291 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/YangJavaModelUtils.java
@@ -233,18 +233,15 @@
 
         TempJavaCodeFragmentFiles translator =
                 info.getTempJavaCodeFragmentFiles();
-
+        TempJavaBeanFragmentFiles bean = getBeanFiles(info);
         if (info instanceof RpcNotificationContainer) {
-            getBeanFiles(info).setRootNode(true);
+            bean.setRootNode(true);
             /*
              * event classes code generation.
              */
             updateNotificationNodeInfo(info, config);
         }
         if (info instanceof YangLeavesHolder) {
-            if (info instanceof YangAugment) {
-                getBeanFiles(info).addIsSubTreeFilteredFlag(config);
-            }
 
             YangLeavesHolder holder = (YangLeavesHolder) info;
             boolean isLeafPresent = holder.getListOfLeaf() != null && !holder
@@ -261,20 +258,21 @@
              * Output
              */
             if (isLeafPresent || isLeafListPresent) {
-                getBeanFiles(info).addCurNodeLeavesInfoToTempFiles((YangNode) info,
-                                                                   config);
+                bean.addCurNodeLeavesInfoToTempFiles((YangNode) info,
+                                                     config);
             }
             //Add value leaf flag attribute to temp file.
             if (isLeafPresent) {
-                getBeanFiles(info).addValueLeafFlag(config, (YangNode) info);
+                bean.addValueLeafFlag(config, (YangNode) info);
             }
             if (((YangNode) info).isOpTypeReq()) {
                 // Add operation type as an attribute.
-                getBeanFiles(info).addOperationTypeToTempFiles((YangNode) info,
-                                                               config);
+                bean.addOperationTypeToTempFiles((YangNode) info,
+                                                 config);
+                bean.addIsSubTreeFilteredFlag(config);
                 if (isLeafPresent) {
                     //Add select leaf flag attribute to temp file.
-                    getBeanFiles(info).addSelectLeafFlag(config);
+                    bean.addSelectLeafFlag(config);
                 }
             }
         } else if (info instanceof YangTypeHolder) {
@@ -433,21 +431,18 @@
         }
 
         generateCodeOfNode(info, config);
-        TempJavaCodeFragmentFiles tempFiles =
-                info.getTempJavaCodeFragmentFiles();
+        TempJavaBeanFragmentFiles tempFiles = getBeanFiles(info);
         if (!(info instanceof YangChoice)) {
-            getBeanFiles(info).addYangAugmentedMap(config);
+            tempFiles.addYangAugmentedMap(config);
         }
         if (info instanceof YangCase) {
             YangNode parent = ((YangCase) info).getParent();
             JavaQualifiedTypeInfoTranslator typeInfo =
                     getQualifierInfoForCasesParent(parent, config);
-            getBeanFiles(info).getJavaExtendsListHolder()
-                    .addToExtendsList(typeInfo, (YangNode) info,
-                                      tempFiles.getBeanTempFiles());
+            tempFiles.getJavaExtendsListHolder()
+                    .addToExtendsList(typeInfo, (YangNode) info, tempFiles);
 
-            getBeanFiles(info).addParentInfoInCurNodeTempFile((YangNode) info,
-                                                              config);
+            tempFiles.addParentInfoInCurNodeTempFile((YangNode) info, config);
         }
     }
 
@@ -629,7 +624,6 @@
                                          YangPluginConfig config) {
 
         List<String> clsInfo = new ArrayList<>();
-        String add = null;
         while (node.getParent() != null) {
             if (node instanceof YangJavaAugmentTranslator) {
                 YangJavaAugmentTranslator augment =
@@ -658,9 +652,6 @@
                                       subModule.getRevision(),
                                       config.getConflictResolver()));
         }
-        if (add != null) {
-            clsInfo.add(add);
-        }
         clsInfo.add(getCamelCase(node.getName(), config.getConflictResolver()));
 
         int size = clsInfo.size();
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
index 4f8c94d..7bc490f 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
@@ -17,7 +17,6 @@
 package org.onosproject.yangutils.translator.tojava.utils;
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
-import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
@@ -38,7 +37,6 @@
 import org.onosproject.yangutils.translator.tojava.TempJavaEventFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaServiceFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaTypeFragmentFiles;
-import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
 import java.io.File;
 import java.io.IOException;
@@ -93,7 +91,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_INT_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_STRING_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.builderMethod;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.generateBuildMethodInAugmentClass;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.generateBuildMethodForSubTree;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodImpl;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAugmentsDataMethodForService;
@@ -442,8 +440,8 @@
         methods.add(((TempJavaCodeFragmentFilesContainer) curNode)
                             .getTempJavaCodeFragmentFiles()
                             .addBuildMethodImpl());
-        if (curNode instanceof YangAugment) {
-            methods.add(generateBuildMethodInAugmentClass(className));
+        if (curNode.isOpTypeReq()) {
+            methods.add(generateBuildMethodForSubTree(curNode));
         }
         methods.add(addDefaultConstructor(curNode, PUBLIC, BUILDER));
 
@@ -472,8 +470,6 @@
 
         JavaFileInfoTranslator fileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        YangPluginConfig config = fileInfo.getPluginConfig();
-
         boolean leavesPresent;
         YangLeavesHolder leavesHolder;
         if (curNode instanceof YangLeavesHolder) {
@@ -531,7 +527,7 @@
                 methods.add(getProcessSubtreeFilteringStart(curNode) +
                                     getProcessSubtreeFunctionBody(curNode) +
                                     augmentableSubTreeFiltering +
-                                    getProcessSubTreeFilteringEnd(name, curNode));
+                                    getProcessSubTreeFilteringEnd(name));
 
                 if (curNode instanceof YangLeavesHolder) {
                     if (((YangLeavesHolder) curNode).getListOfLeaf() != null &&
@@ -741,11 +737,9 @@
      *
      * @param curNode current node
      * @param methods list of methods string
-     * @throws IOException a violation in IO rule
      */
     private static void addTypedefToString(YangNode curNode,
-                                           List<String> methods)
-            throws IOException {
+                                           List<String> methods) {
         //To string method.
 
         List<YangType<?>> types = ((YangTypeDef) curNode).getTypeList();
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index a93a5cf..b0a7032 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -17,6 +17,7 @@
 package org.onosproject.yangutils.translator.tojava.utils;
 
 import org.onosproject.yangutils.datamodel.InvalidOpTypeHolder;
+import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
 import org.onosproject.yangutils.datamodel.YangEnum;
@@ -1224,7 +1225,8 @@
      * @return enum's constructor
      */
     static String getEnumsConstructor(String className) {
-        StringBuilder builder = new StringBuilder();
+        StringBuilder builder = new StringBuilder(
+                getJavaDoc(TYPE_CONSTRUCTOR, className, false, null));
         String clsName = getSmallCase(className);
         LinkedHashMap<String, String> map = new LinkedHashMap<>();
         map.put(clsName, INT);
@@ -1861,15 +1863,19 @@
     }
 
     /**
-     * Returns build method for augment class.
+     * Returns build method for subtree filtering in class.
      *
-     * @param name class name
-     * @return build method for augment class
+     * @param node YANG node
+     * @return build method for subtree filtering in class
      */
-    static String generateBuildMethodInAugmentClass(String name) {
+    static String generateBuildMethodForSubTree(YangNode node) {
+        String name = getCapitalCase(node.getJavaClassNameOrBuiltInType());
         StringBuilder builder = new StringBuilder(getJavaDoc(BUILD_METHOD,
                                                              name, false, null));
         String def = DEFAULT_CAPS + name;
+        if (node instanceof RpcNotificationContainer) {
+            def = name + OP_PARAM;
+        }
         builder.append(methodSignature(BUILD_FOR_FILTER, null, PUBLIC, null,
                                        name, null, CLASS_TYPE))
                 .append(EIGHT_SPACE_INDENTATION).append(SUBTREE_FILTERED)
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
index f680b50..b901b62 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/StringGenerator.java
@@ -302,7 +302,6 @@
                              String paramType, boolean isBuilderSetter, String setterVal) {
         StringBuilder builder = new StringBuilder();
         String body;
-        String cond;
         switch (type) {
             case GETTER:
                 return getReturnString(paraName, space);
@@ -323,7 +322,7 @@
                         NEW + SPACE + paraName + getOpenCloseParaWithValue(
                                 THIS) + signatureClose(), space);
             case CONSTRUCTOR:
-                return space + THIS + PERIOD + paraName + SPACE +
+                return space + paraName + SPACE +
                         EQUAL + SPACE + BUILDER_LOWER_CASE + OBJECT + PERIOD +
                         prefix + methodName +
                         brackets(OPEN_CLOSE_BRACKET, null, null) +
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
index fb7b732..2a1b28f 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
@@ -60,16 +60,15 @@
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.methodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.multiAttrMethodSignature;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.signatureClose;
-import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.valueAssign;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.AND_OPERATION;
 import static org.onosproject.yangutils.utils.UtilConstants.APP_INSTANCE;
+import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
-import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.BREAK;
-import static org.onosproject.yangutils.utils.UtilConstants.BUILD;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
+import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_LOWER_CASE;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILD_FOR_FILTER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
@@ -88,6 +87,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG;
 import static org.onosproject.yangutils.utils.UtilConstants.IS_EMPTY;
 import static org.onosproject.yangutils.utils.UtilConstants.IS_SELECT_ALL_SCHEMA_CHILD_FLAG;
+import static org.onosproject.yangutils.utils.UtilConstants.LEAF_IDENTIFIER;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.NOT;
 import static org.onosproject.yangutils.utils.UtilConstants.NULL;
@@ -109,9 +109,11 @@
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yangutils.utils.UtilConstants.SELECT_OR_CONTAINMENT_NODE_PARAM;
 import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLON;
+import static org.onosproject.yangutils.utils.UtilConstants.SET_METHOD_PREFIX;
 import static org.onosproject.yangutils.utils.UtilConstants.SIXTEEN_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
 import static org.onosproject.yangutils.utils.UtilConstants.STF_BUILDER_PARAM;
+import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
 import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERING_RESULT_BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.THIRTY_TWO_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TO;
@@ -122,6 +124,8 @@
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWO;
 import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF_SET;
+import static org.onosproject.yangutils.utils.UtilConstants.ZERO;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 
@@ -203,11 +207,28 @@
          * isAnySelectOrContainmentNode = true;
          * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
          * }*/
+
+/*        if (isSubTreeFiltered && !appInstance.isLeafValueSet(
+                LeafIdentifier.LEAF2)) {
+            subTreeFilteringResultBuilder.leaf2(leaf2());
+        } else {
+            return false;
+        }*/
+        String condition = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + NOT +
+                APP_INSTANCE + PERIOD + VALUE_LEAF_SET +
+                getOpenCloseParaWithValue(
+                        LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase());
         return getIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
                 attributeName, VALUE_LEAF, EMPTY_STRING, GET)) +
                 getIfConditionBegin(TWELVE_SPACE_INDENTATION, attrQualifiedType) +
-                getReturnString(FALSE, SIXTEEN_SPACE_INDENTATION) +
-                signatureClose() +
+                getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, condition) +
+                TWENTY_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
+                PERIOD + attributeName + getOpenCloseParaWithValue(
+                attributeName + OPEN_CLOSE_BRACKET_STRING) + signatureClose() +
+                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
+                OPEN_CURLY_BRACKET + NEW_LINE + getReturnString(
+                FALSE, TWENTY_SPACE_INDENTATION) + signatureClose() +
+                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
                 TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
                 OPEN_CURLY_BRACKET + NEW_LINE +
                 getSubTreeBuilderCallString(SIXTEEN_SPACE_INDENTATION, attributeName,
@@ -215,8 +236,7 @@
                 getElseIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
                         attributeName, SELECT_LEAF, EMPTY_STRING, GET) + SPACE +
                         OR_OPERATION + SPACE + IS_SELECT_ALL_SCHEMA_CHILD_FLAG) +
-                valueAssign(IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG, TRUE,
-                            TWELVE_SPACE_INDENTATION) +
+                getSelectOrContainmentAssignString() +
                 getSubTreeBuilderCallString(TWELVE_SPACE_INDENTATION, attributeName,
                                             EIGHT_SPACE);
     }
@@ -449,15 +469,14 @@
             name = caseName;
         }
 
-        String javadoc = "\n   /**\n" +
-                "     * Checks if the passed " + name +
-                " maps the content match query condition.\n" +
+        String javadoc = "\n    /**\n" +
+                "     * Checks if the passed " + name + " maps the content " +
+                "match query condition.\n" +
                 "     *\n" +
-                "     * @param " + instance + SPACE +
-                instance + SPACE + "being passed to check" +
-                " for" +
-                " content match\n" +
-                "     * @param isSelectAllSchemaChild is select all schema child\n" +
+                "     * @param " + instance + SPACE + instance + SPACE +
+                "being passed to check for content match\n" +
+                "     * @param isSelectAllSchemaChild is select all schema " +
+                "child\n" +
                 "     * @return match result\n" +
                 "     */\n";
         Map<String, String> param = new LinkedHashMap<>();
@@ -471,9 +490,9 @@
         builder.append(getNewInstance(builderNamePrefix + BUILDER,
                                       SUBTREE_FILTERING_RESULT_BUILDER,
                                       EIGHT_SPACE_INDENTATION, EMPTY_STRING));
-        builder.append(getNewInstance(BOOLEAN_WRAPPER,
+        builder.append(getNewInstance(BIT_SET,
                                       IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG,
-                                      EIGHT_SPACE_INDENTATION, FALSE));
+                                      EIGHT_SPACE_INDENTATION, EMPTY_STRING));
         if (caseName != null) {
             builder.append(getCaseCastString(javaFileInfo, instance, curNode));
         }
@@ -494,7 +513,7 @@
     private static String getProcessStfMethods(
             String methodName, YangNode curNode, String path, int file)
             throws IOException {
-        StringBuilder builder = new StringBuilder();
+        StringBuilder builder = new StringBuilder(EMPTY_STRING);
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
         String instance = APP_INSTANCE;
@@ -509,8 +528,8 @@
         Map<String, String> param = new LinkedHashMap<>();
         param.put(instance, name);
         param.put(STF_BUILDER_PARAM, builderNamePrefix + BUILDER);
-        param.put(SELECT_OR_CONTAINMENT_NODE_PARAM, BOOLEAN_WRAPPER);
-        param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_WRAPPER);
+        param.put(SELECT_OR_CONTAINMENT_NODE_PARAM, BIT_SET);
+        param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
 
         builder.append(multiAttrMethodSignature(methodName, null,
                                                 PRIVATE, BOOLEAN_DATA_TYPE, param, CLASS_TYPE));
@@ -605,11 +624,10 @@
     /**
      * Returns is filter content match close.
      *
-     * @param name    name of class
-     * @param curNode current node
+     * @param name name of class
      * @return is filter content match close
      */
-    static String getProcessSubTreeFilteringEnd(String name, YangNode curNode) {
+    static String getProcessSubTreeFilteringEnd(String name) {
         /* generate code will look like this.
         if (!isSelectAllSchemaChild && !isAnySelectOrContainmentNode) {
             return processSubtreeFiltering(appInstance, true);
@@ -619,19 +637,16 @@
 
         StringBuilder builder = new StringBuilder();
         String cond1 = NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG + SPACE + AND_OPERATION +
-                SPACE + NOT + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG;
+                SPACE + NOT + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
+                PERIOD + GET + getOpenCloseParaWithValue(ZERO);
         String call = PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
                 APP_INSTANCE + COMMA + SPACE + TRUE);
         builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond1))
                 .append(getReturnString(call, TWELVE_SPACE_INDENTATION))
                 .append(signatureClose()).append(methodClose(EIGHT_SPACE));
-        String build = BUILD;
-        if (curNode instanceof YangAugment) {
-            build = BUILD_FOR_FILTER;
-        }
 
         call = getOpenCloseParaWithValue(name) + SPACE +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + build +
+                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + BUILD_FOR_FILTER +
                 OPEN_CLOSE_BRACKET_STRING;
         builder.append(getReturnString(call, EIGHT_SPACE_INDENTATION))
                 .append(signatureClose()).append(methodClose(FOUR_SPACE))
@@ -666,7 +681,8 @@
             cast = name;
         }
 
-        String resultString = cast + PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
+        String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
+                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
                 + APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
                 + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
                 NEW_LINE;
@@ -677,18 +693,20 @@
                 .append(getSelectOrContainmentAssignString());
 
         builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
-                                           getAppInstanceCondition(name)));
+                                           getAppInstanceCondition(name, NOT)));
 
         String assignment = SIXTEEN_SPACE_INDENTATION + clsInfo + SPACE + RESULT +
-                signatureClose();
+                SPACE + EQUAL + SPACE + NULL + signatureClose();
 
         builder.append(assignment)
                 .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
                                             SELECT_ALL_CHILD));
+/*
+        result = ((DefaultInterfaces)(DefaultInterfaces.builder()
+                .build())).processSubtreeFiltering(appInstance.interfaces(),
+                                                   true);*/
 
-        assignment = TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE +
-                getAppInstanceAttrString(name) + signatureClose();
-
+        assignment = getDummyObjectCreation(node, name, clsInfo, type, classCast, false);
         builder.append(assignment).append(SIXTEEN_SPACE_INDENTATION).append(
                 CLOSE_CURLY_BRACKET).append(ELSE).append(OPEN_CURLY_BRACKET)
                 .append(NEW_LINE);
@@ -704,18 +722,20 @@
                 PERIOD + name + getOpenCloseParaWithValue(RESULT) +
                 signatureClose();
         builder.append(assignment).append(methodClose(SIXTEEN_SPACE)).append(
-                methodClose(TWELVE_SPACE)).append(methodClose(EIGHT_SPACE));
+                TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
+                .append(getSubTreeFilteredCondition(name)).append(methodClose(EIGHT_SPACE));
         return builder.toString();
     }
 
-    private static String getAppInstanceCondition(String name) {
+    private static String getAppInstanceCondition(String name, String condition) {
         return APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING + SPACE +
-                NOT + EQUAL + SPACE + NULL;
+                condition + EQUAL + SPACE + NULL;
     }
 
     private static String getSelectOrContainmentAssignString() {
         return TWELVE_SPACE_INDENTATION + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
-                SPACE + EQUAL + SPACE + TRUE + signatureClose();
+                PERIOD + SET_METHOD_PREFIX + getOpenCloseParaWithValue(ZERO) +
+                signatureClose();
     }
 
     /**
@@ -747,8 +767,8 @@
         if (node != null && node instanceof YangChoice) {
             cast = name;
         }
-        String resultString = cast + PERIOD +
-                PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
+        String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
+                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
                 name + "2" + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
                 NEW_LINE;
         /*
@@ -756,14 +776,38 @@
          */
         builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION,
                                            IS_SELECT_ALL_SCHEMA_CHILD_FLAG))
-                .append(getForLoopString(TWELVE_SPACE_INDENTATION, type, name,
+                .append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
+                                            getAppInstanceCondition(name, NOT)))
+                .append(getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
                                          getAppInstanceAttrString(name)));
+        String assignment;
+        if (!isLeafList) {
+            builder.append(TWENTY_SPACE_INDENTATION).append(type).append(SPACE)
+                    .append(RESULT).append(signatureClose());
+            assignment = getDummyObjectCreation(node, name, type, clsInfo,
+                                                classCast, true);
+            builder.append(assignment);
+            assignment = TWENTY_SPACE_INDENTATION +
+                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
+                    getCapitalCase(TO) + caps + getOpenCloseParaWithValue(RESULT) +
+                    signatureClose();
+            builder.append(assignment);
+        } else {
+            assignment = TWENTY_SPACE_INDENTATION +
+                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
+                    getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name) +
+                    signatureClose();
+            builder.append(assignment);
+        }
+        builder.append(methodClose(SIXTEEN_SPACE))
+                .append(TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET);
 
-        String assignment = SIXTEEN_SPACE_INDENTATION +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
-                getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name) +
-                signatureClose();
-        builder.append(assignment).append(methodClose(TWELVE_SPACE));
+/*    } else {
+        if (isSubTreeFiltered && leafList2() != null) {
+            subTreeFilteringResultBuilder.addToLeafList2(leafList2());
+        }
+    }*/
+        builder.append(getSubTreeFilteredCondition(name));
 
         String cond = name + OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL +
                 SPACE + NULL;
@@ -780,9 +824,9 @@
         builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION, cond));
 
         if (isLeafList) {
-            cond = getAppInstanceCondition(name) + SPACE + OR_OPERATION + SPACE +
-                    APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING +
-                    PERIOD + IS_EMPTY;
+            cond = getAppInstanceCondition(name, EQUAL) + SPACE + OR_OPERATION +
+                    SPACE + APP_INSTANCE + PERIOD + name +
+                    OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY;
             /*
              * If there is no app instance to perform content match
              */
@@ -829,8 +873,8 @@
                     .append(methodClose(SIXTEEN_SPACE)); // for instance iterator
 
         } else {
-            cond = getAppInstanceCondition(name) + SPACE + AND_OPERATION +
-                    SPACE + getAppInstanceAttrString(name) +
+            cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
+                    SPACE + NOT + getAppInstanceAttrString(name) +
                     PERIOD + IS_EMPTY;
             /*if there is any app instance entry*/
             builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
@@ -852,13 +896,14 @@
             assignment = THIRTY_TWO_SPACE_INDENTATION +
                     SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
                     getCapitalCase(TO) + caps + getOpenCloseParaWithValue(
-                    name) + signatureClose();
+                    RESULT) + signatureClose();
             builder.append(assignment).append(methodClose(TWENTY_EIGHT_SPACE))
                     //loop all the app instance(s)
                     .append(methodClose(TWENTY_FOUR_SPACE))
                     //loop all the query condition instance(s)
                     .append(methodClose(TWENTY_SPACE))
-                    .append(methodClose(SIXTEEN_SPACE));
+                    .append(SIXTEEN_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
+                    .append(getSubTreeFilteredCondition(name));
             //if there is any app instance entry
         }
 
@@ -869,7 +914,7 @@
         if (isLeafList) {
             builder.append(getSelectOrContainmentAssignString());
         }
-        cond = getAppInstanceCondition(name) + SPACE + AND_OPERATION +
+        cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
                 SPACE + NOT + getAppInstanceAttrString(name) + PERIOD + IS_EMPTY;
         builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
                 .append(getForLoopString(SIXTEEN_SPACE_INDENTATION, type,
@@ -889,7 +934,7 @@
 
     //Returns method string for op params augmented syntax
     static String getAugmentableSubTreeFiltering() {
-        return "        for (Object augmentInfo : this.yangAugmentedInfoMap()" +
+        return "        for (Object augmentInfo : yangAugmentedInfoMap()" +
                 ".values()) {\n" +
                 "            Object appInstanceInfo = appInstance.yangAugmentedInfo(" +
                 "augmentInfo.getClass());\n" +
@@ -916,6 +961,22 @@
                 "        }\n";
     }
 
+    private static String getSubTreeFilteredCondition(String name) {
+        StringBuilder builder = new StringBuilder();
+        String cond = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + name +
+                OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL + SPACE + NULL;
+
+        builder.append(ELSE).append(OPEN_CURLY_BRACKET).append(NEW_LINE)
+                .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
+                .append(TWENTY_SPACE_INDENTATION)
+                .append(SUBTREE_FILTERING_RESULT_BUILDER).append(PERIOD)
+                .append(name).append(getOpenCloseParaWithValue(name)).append(
+                signatureClose()).append(SIXTEEN_SPACE_INDENTATION).append(
+                CLOSE_CURLY_BRACKET).append(NEW_LINE).append(TWELVE_SPACE_INDENTATION)
+                .append(CLOSE_CURLY_BRACKET).append(NEW_LINE);
+        return builder.toString();
+    }
+
     private static String getNameOfClassForIfCase(YangNode curNode) {
         String name = null;
         JavaFileInfoTranslator parentInfo;
@@ -951,4 +1012,47 @@
         return null;
     }
 
+    private static String getDummyObjectCreation(YangNode node, String name,
+                                                 String clsInfo, String type,
+                                                 String classCast, boolean isList) {
+        String para = getAppInstanceAttrString(name);
+        if (isList) {
+            para = name;
+        }
+        if (node != null && node instanceof YangChoice) {
+            return getChoiceReflectionResult(name, clsInfo);
+        }
+        return TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE +
+                getOpenCloseParaWithValue(
+                        classCast + type + PERIOD + BUILDER_LOWER_CASE +
+                                OPEN_CLOSE_BRACKET_STRING + NEW_LINE +
+                                TWENTY_EIGHT_SPACE_INDENTATION + PERIOD +
+                                BUILD_FOR_FILTER + OPEN_CLOSE_BRACKET_STRING) +
+                PERIOD + PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
+                para + COMMA + SPACE + TRUE) + signatureClose();
+
+    }
+
+    private static String getChoiceReflectionResult(String name, String returnType) {
+        String call = "appInstance." + name + "()";
+        return "                    Class<?>[] classArray = " + call + "" +
+                ".getClass()" +
+                ".getInterfaces();\n" +
+                "                    Class<?> caseClass = classArray[0];\n" +
+                "                    try {\n" +
+                "                        Object obj1 = caseClass.newInstance();\n" +
+                "                        Method method = caseClass.getMethod(\"builder\", caseClass);\n" +
+                "                        Object obj = method.invoke(obj1," +
+                " (Object) null);\n" +
+                "                        method = caseClass.getMethod(\"build\", caseClass);\n" +
+                "                        Object obj2 = method.invoke(obj, " +
+                "(Object) null);\n" +
+                "                        method = caseClass.getMethod(\"processSubtreeFiltering\", caseClass);\n" +
+                "                        result = (" + returnType + ") method.invoke" +
+                "(obj2, " + call + ", true);\n" +
+                "                    } catch (NoSuchMethodException | InstantiationException |\n" +
+                "                            IllegalAccessException | InvocationTargetException e) {\n" +
+                "                        e.printStackTrace();\n" +
+                "                    }\n";
+    }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index 8266eca..3a1a1f5 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -167,11 +167,6 @@
     public static final String JAVA_DOC_BUILD = " * Builds object of ";
 
     /**
-     * JavaDocs's return statement for build method.
-     */
-    public static final String JAVA_DOC_BUILD_RETURN = "object of ";
-
-    /**
      * JavaDocs's statement for builder object.
      */
     public static final String BUILDER_OBJECT = "builder object of ";
@@ -238,11 +233,6 @@
     public static final String COMPARE_TO = "compareTo";
 
     /**
-     * Static attribute for period.
-     */
-    public static final String INVOKE = "invoke";
-
-    /**
      * Static attribute for parse byte.
      */
     public static final String PARSE_BYTE = "parseByte";
@@ -340,11 +330,6 @@
     public static final String SCHEMA_NAME = "schemaName";
 
     /**
-     * Static attribute for schema name value.
-     */
-    public static final String STR_VAL = "stringValue";
-
-    /**
      * Static attribute for validateRange.
      */
     public static final String VALIDATE_RANGE = "validateRange";
@@ -506,11 +491,6 @@
     public static final String SUBJECT = "Subject";
 
     /**
-     * Static attribute for ListenerRegistry.
-     */
-    public static final String LISTENER_REG = "ListenerRegistry";
-
-    /**
      * Static attribute for ListenerService.
      */
     public static final String LISTENER_SERVICE = "ListenerService";
@@ -551,11 +531,6 @@
     public static final String LEAFREF = "leafref";
 
     /**
-     * Static attribute for identityref string.
-     */
-    public static final String IDENTITYREF = "identityref";
-
-    /**
      * Static attribute for output variable of rpc.
      */
     public static final String RPC_INPUT_VAR_NAME = "inputVar";
@@ -576,11 +551,6 @@
     public static final String ADD = "+";
 
     /**
-     * Static attribute for single quote.
-     */
-    public static final String SINGLE_QUOTE = "\'";
-
-    /**
      * Static attribute for quotes.
      */
     public static final String QUOTES = "\"";
@@ -626,11 +596,6 @@
     public static final char CHAR_OF_OPEN_SQUARE_BRACKET = '[';
 
     /**
-     * Static attribute for close square bracket character.
-     */
-    public static final char CHAR_OF_CLOSE_SQUARE_BRACKET = ']';
-
-    /**
      * Static attribute for slash string.
      */
     public static final String SLASH_FOR_STRING = "/";
@@ -656,11 +621,6 @@
     public static final String ADD_STRING = "add";
 
     /**
-     * Static attribute for string replace syntax.
-     */
-    public static final String REPLACE_STRING = "replace";
-
-    /**
      * Static attribute for string trim syntax.
      */
     public static final String TRIM_STRING = "trim";
@@ -735,11 +695,6 @@
     public static final String IF = "if";
 
     /**
-     * Static attribute for else-if.
-     */
-    public static final String ELSE_IF = "else if";
-
-    /**
      * Static attribute for of.
      */
     public static final String OF = "of";
@@ -889,37 +844,11 @@
     public static final String GET_METHOD_PREFIX = "get";
 
     /**
-     * Static attribute for getter method prefix.
-     */
-    public static final String GET_METHOD = "getMethod";
-
-    /**
-     * Static attribute for getter method prefix.
-     */
-    public static final String GET_CLASS = "getClass()";
-
-    /**
      * Static attribute for setter method prefix.
      */
     public static final String SET_METHOD_PREFIX = "set";
 
     /**
-     * Static attribute for get filter leaf flags.
-     */
-    public static final String GET_VALUE_LEAF_FLAGS = "getValueLeafFlags";
-
-    /**
-     * Static attribute for get select filter leaf flags.
-     */
-    public static final String GET_SELECT_LEAF_FLAGS = "getSelectLeafFlags";
-
-
-    /**
-     * Static attribute for getLeafIndex.
-     */
-    public static final String GET_LEAF_INDEX = "getLeafIndex()";
-
-    /**
      * Static attribute for op param.
      */
     public static final String OP_PARAM = "OpParam";
@@ -1066,11 +995,6 @@
             TWENTY_EIGHT_SPACE_INDENTATION + FOUR_SPACE_INDENTATION;
 
     /**
-     * continue.
-     */
-    public static final String CONTINUE = "continue";
-
-    /**
      * Static attribute for generated code path.
      */
     public static final String YANG_GEN_DIR = "src/main/java/";
@@ -1335,11 +1259,6 @@
     public static final String BUILDER_LOWER_CASE = "builder";
 
     /**
-     * Static attribute for manager syntax.
-     */
-    public static final String MANAGER = "Manager";
-
-    /**
      * Static attribute for service syntax.
      */
     public static final String SERVICE = "Service";
@@ -1470,9 +1389,9 @@
     public static final String COLLECTION_IMPORTS = "java.util";
 
     /**
-     * Static attribute for regex.
+     * Static attribute for reflect.
      */
-    public static final String REGEX_IMPORTS = "java.util.regex";
+    public static final String REFLECT_IMPORTS = "java.lang.reflect";
 
     /**
      * Static attribute for map.
@@ -1531,9 +1450,9 @@
     public static final String SET_VALUE_PARA = "setValue";
 
     /**
-     * Static attribute for java utilities import package.
+     * Static attribute for Method.
      */
-    public static final String HELPER = "helper";
+    public static final String METHOD = "Method";
 
     /**
      * Static attribute for bitset.
@@ -1583,7 +1502,7 @@
     public static final String SET = "Set";
 
     /**
-     * Comment to be added for autogenerated impl methods.
+     * Comment to be added for auto generated impl methods.
      */
     public static final String YANG_UTILS_TODO =
             "//TODO: YANG utils generated code";
@@ -1749,18 +1668,6 @@
     public static final String FOR = "for";
 
     /**
-     * Static attribute for YangAugmentedOpParamInfo.
-     */
-    public static final String YANG_AUGMENTED_OP_PARAM_INFO =
-            "YangAugmentedOpParamInfo";
-
-    /**
-     * Static attribute for NoSuchMethodException.
-     */
-    public static final String NO_SUCH_METHOD_EXCEPTION =
-            "NoSuchMethodException";
-
-    /**
      * Static attribute for InvocationTargetException.
      */
     public static final String INVOCATION_TARGET_EXCEPTION =
@@ -1771,11 +1678,6 @@
      */
     public static final String INVOCATION_TARGET_EXCEPTION_IMPORT = "import" +
             " java.lang.reflect.InvocationTargetException;\n";
-    /**
-     * Static attribute for IllegalAccessException.
-     */
-    public static final String ILLEGAL_ACCESS_EXCEPTION =
-            "IllegalAccessException";
 
     /**
      * Static attribute for arrayList.
@@ -1861,21 +1763,11 @@
     public static final String BUILDER_INTERFACE = "builder interface";
 
     /**
-     * Static attribute for binary.
-     */
-    public static final String BINARY = "binary";
-
-    /**
      * Static attribute for bits.
      */
     public static final String BITS = "bits";
 
     /**
-     * Static attribute for bits.
-     */
-    public static final String BITS_CAPS = "Bits";
-
-    /**
      * Static attribute for YANG.
      */
     public static final String YANG = "yang";
@@ -1951,11 +1843,6 @@
     public static final String SELECT_ALL_CHILD_SCHEMA_PARAM =
             "isSelectAllSchemaChild";
 
-    /**
-     * Static param for ResultOfProcessSubTree.
-     */
-    public static final String CHOICE_STF_METHOD_NAME =
-            "ResultOfProcessSubTree";
     //File type extension for java classes.
     public static final String JAVA_FILE_EXTENSION = ".java";
 
diff --git a/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java b/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
index 02389a1..fb76dff 100644
--- a/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
+++ b/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
@@ -16,22 +16,31 @@
 
 package org.onosproject.yangutils.parser.impl.listeners;
 
-import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangReferenceResolver;
+import org.onosproject.yangutils.datamodel.YangResolutionInfo;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.datamodel.utils.Parsable;
 import org.onosproject.yangutils.linker.exceptions.LinkerException;
-import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType;
 
+import java.util.List;
+
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_BASE;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_COMPILER_ANNOTATION;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_DERIVED_DATA_TYPE;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_IDENTITYREF;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_IF_FEATURE;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_LEAFREF;
+import static org.onosproject.yangutils.datamodel.ResolvableType.YANG_USES;
 import static org.onosproject.yangutils.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
 import static org.onosproject.yangutils.datamodel.utils.YangConstructType.MODULE_DATA;
+import static org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser.ModuleStatementContext;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction
-        .constructListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CHILD;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
@@ -78,13 +87,14 @@
      * @param listener Listener's object
      * @param ctx      context object of the grammar rule
      */
-    public static void processModuleEntry(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) {
+    public static void processModuleEntry(TreeWalkListener listener,
+                                          ModuleStatementContext ctx) {
 
         // Check if stack is empty.
-        checkStackIsEmpty(listener, INVALID_HOLDER, MODULE_DATA, ctx.identifier().getText(), ENTRY);
-
-        String identifier = getValidIdentifier(ctx.identifier().getText(), MODULE_DATA, ctx);
-
+        checkStackIsEmpty(listener, INVALID_HOLDER, MODULE_DATA,
+                          ctx.identifier().getText(), ENTRY);
+        String identifier = getValidIdentifier(ctx.identifier().getText(),
+                                               MODULE_DATA, ctx);
         YangModule yangModule = getYangModuleNode(JAVA_GENERATION);
         yangModule.setName(identifier);
         yangModule.setLineNumber(ctx.getStart().getLine());
@@ -105,38 +115,32 @@
      * @param listener Listener's object
      * @param ctx      context object of the grammar rule
      */
-    public static void processModuleExit(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) {
+    public static void processModuleExit(TreeWalkListener listener,
+                                         ModuleStatementContext ctx) {
 
         // Check for stack to be non empty.
-        checkStackIsNotEmpty(listener, MISSING_HOLDER, MODULE_DATA, ctx.identifier().getText(), EXIT);
-
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, MODULE_DATA,
+                             ctx.identifier().getText(), EXIT);
         Parsable tmpNode = listener.getParsedDataStack().peek();
         if (!(tmpNode instanceof YangModule)) {
-            throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, MODULE_DATA,
-                                                                    ctx.identifier().getText(), EXIT));
+            throwError(MISSING_CURRENT_HOLDER, ctx);
         }
 
         YangModule module = (YangModule) tmpNode;
-        if (module.getUnresolvedResolutionList(ResolvableType.YANG_COMPILER_ANNOTATION) != null
-                && module.getUnresolvedResolutionList(ResolvableType.YANG_COMPILER_ANNOTATION).size() != 0
-                && module.getChild() != null) {
-            throw new ParserException(constructListenerErrorMessage(INVALID_CHILD, MODULE_DATA,
-                                                                    ctx.identifier().getText(), EXIT));
+        List<YangResolutionInfo> info = module.getUnresolvedResolutionList(
+                YANG_COMPILER_ANNOTATION);
+        if (info != null && !info.isEmpty() && module.getChild() != null) {
+            throwError(INVALID_CHILD, ctx);
         }
-
+        YangReferenceResolver resolver = (YangReferenceResolver) listener
+                .getParsedDataStack().peek();
         try {
-            ((YangReferenceResolver) listener.getParsedDataStack()
-                    .peek()).resolveSelfFileLinking(ResolvableType.YANG_IF_FEATURE);
-            ((YangReferenceResolver) listener.getParsedDataStack()
-                    .peek()).resolveSelfFileLinking(ResolvableType.YANG_USES);
-            ((YangReferenceResolver) listener.getParsedDataStack()
-                    .peek()).resolveSelfFileLinking(ResolvableType.YANG_DERIVED_DATA_TYPE);
-            ((YangReferenceResolver) listener.getParsedDataStack()
-                    .peek()).resolveSelfFileLinking(ResolvableType.YANG_LEAFREF);
-            ((YangReferenceResolver) listener.getParsedDataStack()
-                    .peek()).resolveSelfFileLinking(ResolvableType.YANG_BASE);
-            ((YangReferenceResolver) listener.getParsedDataStack()
-                    .peek()).resolveSelfFileLinking(ResolvableType.YANG_IDENTITYREF);
+            resolver.resolveSelfFileLinking(YANG_IF_FEATURE);
+            resolver.resolveSelfFileLinking(YANG_USES);
+            resolver.resolveSelfFileLinking(YANG_DERIVED_DATA_TYPE);
+            resolver.resolveSelfFileLinking(YANG_LEAFREF);
+            resolver.resolveSelfFileLinking(YANG_BASE);
+            resolver.resolveSelfFileLinking(YANG_IDENTITYREF);
         } catch (DataModelException e) {
             LinkerException linkerException = new LinkerException(e.getMessage());
             linkerException.setLine(e.getLineNumber());
@@ -145,4 +149,10 @@
             throw linkerException;
         }
     }
+
+    private static void throwError(ListenerErrorType type,
+                                   ModuleStatementContext ctx) {
+        throw new ParserException(constructListenerErrorMessage(
+                type, MODULE_DATA, ctx.identifier().getText(), EXIT));
+    }
 }
diff --git a/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java b/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
index 88def1d..bf69035 100644
--- a/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
+++ b/parser/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
@@ -99,7 +99,7 @@
 
         // Create YANG type object and fill the values.
         YangType<?> type = getYangType(JAVA_GENERATION);
-        type.setNodeIdentifier(nodeIdentifier);
+        type.setNodeId(nodeIdentifier);
         type.setDataType(yangDataTypes);
 
         type.setLineNumber(ctx.getStart().getLine());
diff --git a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerCollisionDetector.java b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerCollisionDetector.java
index 632f50d..55b9e01 100644
--- a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerCollisionDetector.java
+++ b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerCollisionDetector.java
@@ -55,9 +55,10 @@
             String identifierName, YangConstructType constructType)
             throws ParserException {
 
-        if (listener.getParsedDataStack().peek() instanceof CollisionDetector) {
+        Object obj = listener.getParsedDataStack().peek();
+        if (obj instanceof CollisionDetector) {
             try {
-                ((CollisionDetector) listener.getParsedDataStack().peek()).detectCollidingChild(
+                ((CollisionDetector) obj).detectCollidingChild(
                         identifierName, constructType);
             } catch (DataModelException e) {
                 ParserException parserException = new ParserException(e.getMessage());
diff --git a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangPluginUtils.java b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangPluginUtils.java
index 00331b2..9f461b6 100644
--- a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangPluginUtils.java
+++ b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangPluginUtils.java
@@ -18,18 +18,18 @@
 
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Plugin;
 import org.apache.maven.model.Resource;
 import org.apache.maven.project.MavenProject;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.slf4j.Logger;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
-import java.io.PrintWriter;
 import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
@@ -39,8 +39,6 @@
 import java.util.Set;
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.parseJarFile;
-import static org.onosproject.yangutils.utils.UtilConstants.COLON;
-import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
 import static org.onosproject.yangutils.utils.UtilConstants.JAR;
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
@@ -56,14 +54,10 @@
 public final class YangPluginUtils {
 
     private static final Logger log = getLogger(YangPluginUtils.class);
-
-    private static final String TARGET_RESOURCE_PATH = SLASH + TEMP + SLASH + YANG_RESOURCES + SLASH;
-
+    private static final String TARGET_RESOURCE_PATH = SLASH + TEMP + SLASH +
+            YANG_RESOURCES + SLASH;
     private static final String SERIALIZED_FILE_EXTENSION = ".ser";
-    private static final String TEXT_FILE_EXTENSION = ".txt";
     private static final String YANG_META_DATA = "YangMetaData";
-    private static final String VERSION_META_DATA = "VersionMetaData";
-    private static final String PLUGIN_ARTIFACT = "onos-yang-maven-plugin";
 
     private YangPluginUtils() {
     }
@@ -75,7 +69,8 @@
      * @param project current maven project
      * @param context current build context
      */
-    static void addToCompilationRoot(String source, MavenProject project, BuildContext context) {
+    static void addToCompilationRoot(String source, MavenProject project,
+                                     BuildContext context) {
         project.addCompileSourceRoot(source);
         context.refresh(project.getBasedir());
         log.info("Source directory added to compilation root: " + source);
@@ -89,15 +84,14 @@
      * @param project      maven project
      * @throws IOException when fails to copy files to destination resource directory
      */
-    static void copyYangFilesToTarget(Set<YangFileInfo> yangFileInfo, String outputDir, MavenProject project)
+    static void copyYangFilesToTarget(Set<YangFileInfo> yangFileInfo,
+                                      String outputDir, MavenProject project)
             throws IOException {
 
         List<File> files = getListOfFile(yangFileInfo);
-
         String path = outputDir + TARGET_RESOURCE_PATH;
         File targetDir = new File(path);
         targetDir.mkdirs();
-
         for (File file : files) {
             Files.copy(file.toPath(),
                        new File(path + file.getName()).toPath(),
@@ -127,93 +121,58 @@
     /**
      * Serializes data-model.
      *
-     * @param directory   base directory for serialized files
-     * @param fileInfoSet YANG file info set
-     * @param project     maven project
-     * @param operation   true if need to add to resource
+     * @param dir       base directory for serialized files
+     * @param fileSet   YANG file info set
+     * @param project   maven project
+     * @param operation true if need to add to resource
      * @throws IOException when fails to do IO operations
      */
-    public static void serializeDataModel(String directory, Set<YangFileInfo> fileInfoSet,
-                                          MavenProject project, boolean operation) throws IOException {
-
-        String serFileDirPath = directory + TARGET_RESOURCE_PATH;
-        File dir = new File(serFileDirPath);
-        dir.mkdirs();
-
+    public static void serializeDataModel(String dir, Set<YangFileInfo> fileSet,
+                                          MavenProject project, boolean operation)
+            throws IOException {
+        String serFileDirPath = dir + TARGET_RESOURCE_PATH;
+        File dir1 = new File(serFileDirPath);
+        dir1.mkdirs();
         if (operation) {
-            addToProjectResource(directory + SLASH + TEMP + SLASH, project);
+            addToProjectResource(dir + SLASH + TEMP + SLASH, project);
         }
-
         Set<YangNode> nodes = new HashSet<>();
-        for (YangFileInfo fileInfo : fileInfoSet) {
+        for (YangFileInfo fileInfo : fileSet) {
             nodes.add(fileInfo.getRootNode());
         }
 
-        String serFileName = serFileDirPath + YANG_META_DATA + SERIALIZED_FILE_EXTENSION;
-        FileOutputStream fileOutputStream = new FileOutputStream(serFileName);
-        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
+        String serFileName = serFileDirPath + YANG_META_DATA +
+                SERIALIZED_FILE_EXTENSION;
+        FileOutputStream out = new FileOutputStream(serFileName);
+        ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
         objectOutputStream.writeObject(nodes);
         objectOutputStream.close();
-        fileOutputStream.close();
-        if (operation) {
-            addVersionMetaDataFile(project, serFileDirPath);
-        }
-    }
-
-    /**
-     * Adds version meta data files for YSR to know version of YANG tools.
-     *
-     * @param project maven project
-     * @param dir     directory
-     * @throws IOException when fails to do IO operations
-     */
-    private static void addVersionMetaDataFile(MavenProject project, String dir)
-            throws IOException {
-        List<Plugin> plugins = project.getBuildPlugins();
-        Iterator<Plugin> it = plugins.iterator();
-        Plugin plugin = it.next();
-        String data = EMPTY_STRING;
-        while (it.hasNext()) {
-            if (plugin.getArtifactId().equals(PLUGIN_ARTIFACT)) {
-                data = plugin.getGroupId() + COLON + plugin.getArtifactId()
-                        + COLON + plugin.getVersion();
-            }
-            plugin = it.next();
-        }
-        if (data.equals(EMPTY_STRING)) {
-            throw new IOException("Invalid artifact for " + PLUGIN_ARTIFACT);
-        }
-        String verFileName = dir + VERSION_META_DATA + TEXT_FILE_EXTENSION;
-        PrintWriter out = new PrintWriter(verFileName);
-        out.print(data);
         out.close();
     }
 
     /**
      * Returns list of jar path.
      *
-     * @param project         maven project
-     * @param localRepository local repository
-     * @param remoteRepos     remote repository
+     * @param project     maven project
+     * @param localRepo   local repository
+     * @param remoteRepos remote repository
      * @return list of jar paths
      */
-    private static List<String> resolveDependencyJarPath(MavenProject project, ArtifactRepository localRepository,
-                                                         List<ArtifactRepository> remoteRepos) {
+    private static List<String> resolveDependencyJarPath(
+            MavenProject project, ArtifactRepository localRepo,
+            List<ArtifactRepository> remoteRepos) {
 
         StringBuilder path = new StringBuilder();
         List<String> jarPaths = new ArrayList<>();
         for (Object obj : project.getDependencies()) {
 
             Dependency dependency = (Dependency) obj;
-            path.append(localRepository.getBasedir());
-            path.append(SLASH);
-            path.append(getPackageDirPathFromJavaJPackage(dependency.getGroupId()));
-            path.append(SLASH);
-            path.append(dependency.getArtifactId());
-            path.append(SLASH);
-            path.append(dependency.getVersion());
-            path.append(SLASH);
-            path.append(dependency.getArtifactId() + HYPHEN + dependency.getVersion() + PERIOD + JAR);
+            path.append(localRepo.getBasedir()).append(SLASH)
+                    .append(getPackageDirPathFromJavaJPackage(dependency.getGroupId()))
+                    .append(SLASH).append(dependency.getArtifactId())
+                    .append(SLASH).append(dependency.getVersion()).append(SLASH)
+                    .append(dependency.getArtifactId()).append(HYPHEN)
+                    .append(dependency.getVersion()).append(PERIOD).append(JAR);
             File jarFile = new File(path.toString());
             if (jarFile.exists()) {
                 jarPaths.add(path.toString());
@@ -230,21 +189,23 @@
     /**
      * Resolves inter jar dependencies.
      *
-     * @param project         current maven project
-     * @param localRepository local maven repository
-     * @param remoteRepos     list of remote repository
-     * @param directory       directory for serialized files
+     * @param project     current maven project
+     * @param localRepo   local maven repository
+     * @param remoteRepos list of remote repository
+     * @param dir         directory for serialized files
      * @return list of resolved datamodel nodes
      * @throws IOException when fails to do IO operations
      */
-    static List<YangNode> resolveInterJarDependencies(MavenProject project, ArtifactRepository localRepository,
-                                                      List<ArtifactRepository> remoteRepos, String directory)
+    static List<YangNode> resolveInterJarDependencies(
+            MavenProject project, ArtifactRepository localRepo,
+            List<ArtifactRepository> remoteRepos, String dir)
             throws IOException {
 
-        List<String> dependenciesJarPaths = resolveDependencyJarPath(project, localRepository, remoteRepos);
+        List<String> dependenciesJarPaths =
+                resolveDependencyJarPath(project, localRepo, remoteRepos);
         List<YangNode> resolvedDataModelNodes = new ArrayList<>();
         for (String dependency : dependenciesJarPaths) {
-            resolvedDataModelNodes.addAll(parseJarFile(dependency, directory));
+            resolvedDataModelNodes.addAll(parseJarFile(dependency, dir));
         }
         return resolvedDataModelNodes;
     }
diff --git a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index c56d8aa..ba0f6fd 100644
--- a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -78,8 +78,7 @@
  */
 @Mojo(name = "yang2java", defaultPhase = PROCESS_SOURCES,
         requiresDependencyResolution = COMPILE)
-public class YangUtilManager
-        extends AbstractMojo {
+public class YangUtilManager extends AbstractMojo {
 
     private static final String DEFAULT_PKG =
             getPackageDirPathFromJavaJPackage(DEFAULT_BASE_PKG);
@@ -278,7 +277,7 @@
      *
      * @return YANG node set
      */
-    Set<YangNode> getYangNodeSet() {
+    public Set<YangNode> getYangNodeSet() {
         return yangNodeSet;
     }
 
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/AugmentTranslatorTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/AugmentTranslatorTest.java
index c4a2341..531a285 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/AugmentTranslatorTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/AugmentTranslatorTest.java
@@ -57,7 +57,7 @@
         yangPluginConfig.setCodeGenDir(DIR);
         utilManager.translateToJava(yangPluginConfig);
         compileCode(COMP);
-        //deleteDirectory(DIR);
+        deleteDirectory(DIR);
     }
 
     /**
@@ -113,8 +113,6 @@
     @Test
     public void processChoiceAugmentInterTranslator() throws IOException,
             ParserException, MojoExecutionException {
-        //FIXME: for augment having node with child nodes.
-        /*
         deleteDirectory(DIR);
         String searchDir = "src/test/resources/choiceAugment";
         utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
@@ -127,7 +125,6 @@
         utilManager.translateToJava(yangPluginConfig);
         compileCode(COMP);
         deleteDirectory(DIR);
-        */
     }
 
 }
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/ChoiceCaseTranslatorTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/ChoiceCaseTranslatorTest.java
index 662b7e5..367bf82 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/ChoiceCaseTranslatorTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/ChoiceCaseTranslatorTest.java
@@ -16,11 +16,13 @@
 
 package org.onosproject.yangutils.plugin.manager;
 
+import org.apache.maven.plugin.MojoExecutionException;
 import org.junit.Test;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
+import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
 
 import java.io.File;
 import java.io.IOException;
@@ -33,7 +35,10 @@
  * Unit tests for choice-case translator.
  */
 public final class ChoiceCaseTranslatorTest {
-
+    private final YangUtilManager utilManager = new YangUtilManager();
+    private static final String DIR = "target/ChoiceCaseTestGenFile/";
+    private static final String COMP = System.getProperty("user.dir") + File
+            .separator + DIR;
     private final YangUtilsParserManager manager = new YangUtilsParserManager();
 
     /**
@@ -54,5 +59,26 @@
         compileCode(dir1);
         deleteDirectory(dir);
     }
-    // TODO enhance the test cases, after having a framework of translator test.
+
+    /**
+     * Checks augment translation should not result in any exception.
+     *
+     * @throws MojoExecutionException
+     */
+    @Test
+    public void processChoiceAllTranslator() throws IOException,
+            ParserException, MojoExecutionException {
+        deleteDirectory(DIR);
+        String searchDir = "src/test/resources/choiceTranslator";
+        utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
+        utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
+        utilManager.resolveDependenciesUsingLinker();
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        utilManager.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        deleteDirectory(DIR);
+    }
 }
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/GroupingTranslatorTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/GroupingTranslatorTest.java
new file mode 100644
index 0000000..a590cc0
--- /dev/null
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/GroupingTranslatorTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.plugin.manager;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.junit.Test;
+import org.onosproject.yangutils.parser.exceptions.ParserException;
+import org.onosproject.yangutils.utils.io.YangPluginConfig;
+import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.onosproject.yangutils.utils.io.YangPluginConfig.compileCode;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory;
+
+/**
+ * Unit test case for grouping translator.
+ */
+public class GroupingTranslatorTest {
+
+    private final YangUtilManager utilManager = new YangUtilManager();
+    private static final String DIR = "target/groupingTranslator/";
+    private static final String COMP = System.getProperty("user.dir") + File
+            .separator + DIR;
+
+    /**
+     * Checks grouping translation should not result in any exception.
+     *
+     * @throws MojoExecutionException
+     */
+    @Test
+    public void processTranslator() throws IOException, ParserException, MojoExecutionException {
+
+        deleteDirectory(DIR);
+        String searchDir = "src/test/resources/grouping";
+        utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
+        utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
+        utilManager.resolveDependenciesUsingLinker();
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        utilManager.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        deleteDirectory(DIR);
+    }
+
+}
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/IdentityTranslatorTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/IdentityTranslatorTest.java
index 4e9cdcb..adeb42f 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/IdentityTranslatorTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/IdentityTranslatorTest.java
@@ -57,6 +57,6 @@
         yangPluginConfig.setCodeGenDir(DIR);
         utilManager.translateToJava(yangPluginConfig);
         compileCode(COMP);
-        //deleteDirectory(DIR);
+        deleteDirectory(DIR);
     }
 }
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterJarLinkerTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterJarLinkerTest.java
index 6ec65b9..e80bf0b 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterJarLinkerTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/InterJarLinkerTest.java
@@ -49,6 +49,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 import static org.onosproject.yangutils.utils.UtilConstants.TEMP;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_RESOURCES;
+import static org.onosproject.yangutils.utils.io.impl.YangFileScanner.getYangFiles;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory;
 
 /**
@@ -78,7 +79,7 @@
     @Test
     public void processSingleJarLinking()
             throws IOException, MojoExecutionException {
-        utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(YANG_FILES_DIR));
+        utilManager.createYangFileInfoSet(getYangFiles(YANG_FILES_DIR));
         Set<YangFileInfo> info = utilManager.getYangFileInfoSet();
         int size1 = info.size();
         utilManager.parseYangFileInfoSet();
@@ -104,7 +105,7 @@
     @Test
     public void processMultipleJarLinking()
             throws IOException, MojoExecutionException {
-        utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(YANG_FILES_DIR));
+        utilManager.createYangFileInfoSet(getYangFiles(YANG_FILES_DIR));
 
         Set<YangFileInfo> info = utilManager.getYangFileInfoSet();
         int size1 = info.size();
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/ProcessSubTreeCodeGenTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/ProcessSubTreeCodeGenTest.java
new file mode 100644
index 0000000..501e2bc
--- /dev/null
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/plugin/manager/ProcessSubTreeCodeGenTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yangutils.plugin.manager;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.junit.Test;
+import org.onosproject.yangutils.parser.exceptions.ParserException;
+import org.onosproject.yangutils.utils.io.YangPluginConfig;
+import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.onosproject.yangutils.utils.io.YangPluginConfig.compileCode;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory;
+
+/**
+ * Unit test case for process sub tree code generation test.
+ */
+public class ProcessSubTreeCodeGenTest {
+
+    private final YangUtilManager utilManager = new YangUtilManager();
+    private static final String DIR = "target/pstf/";
+    private static final String COMP = System.getProperty("user.dir") + File
+            .separator + DIR;
+
+    /**
+     * Checks pst translation should not result in any exception.
+     *
+     * @throws MojoExecutionException
+     */
+    @Test
+    public void processTranslator() throws IOException, ParserException, MojoExecutionException {
+
+        deleteDirectory(DIR);
+        String searchDir = "src/test/resources/pstcodegen";
+        utilManager.createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
+        utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
+        utilManager.resolveDependenciesUsingLinker();
+
+        YangPluginConfig yangPluginConfig = new YangPluginConfig();
+        yangPluginConfig.setCodeGenDir(DIR);
+        utilManager.translateToJava(yangPluginConfig);
+        compileCode(COMP);
+        //deleteDirectory(DIR);
+    }
+
+}
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGeneratorTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGeneratorTest.java
index a6fdf76..6a31ba0 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGeneratorTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGeneratorTest.java
@@ -203,7 +203,7 @@
         String method = getConstructor(testAttr, GENERATE_SERVICE_AND_MANAGER
         );
         assertThat(true, is(method.contains(
-                THIS + PERIOD + ATTRIBUTE_NAME + SPACE + EQUAL + SPACE +
+                ATTRIBUTE_NAME + SPACE + EQUAL + SPACE +
                         BUILDER_LOWER_CASE + OBJECT + PERIOD +
                         GET_METHOD_PREFIX + CLASS_NAME + OPEN_PARENTHESIS +
                         CLOSE_PARENTHESIS + SEMI_COLON)));
diff --git a/plugin/maven/src/test/resources/choiceAugment/all.yang b/plugin/maven/src/test/resources/choiceAugment/all.yang
deleted file mode 100644
index 4c08537..0000000
--- a/plugin/maven/src/test/resources/choiceAugment/all.yang
+++ /dev/null
@@ -1,128 +0,0 @@
-module ietf-inet {
-
-  namespace "yang:all";
-  prefix "inet";
-  yang-version 1;
-
-  choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-           }
-       }
-   }
-
-
-   container c {
-       choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-                 }
-             }
-         }
-   }
-
-   list l {
-   config false;
-choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-                 }
-             }
-         }
-   }
-
-
-   grouping g {
-    choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-                 }
-             }
-         }
-   }
-
-   notification n {
-    choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-                 }
-             }
-         }
-    }
-    rpc r {
-        input {
-           choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-                 }
-             }
-         }
-       }
-      output {
-        choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-                 }
-             }
-         }
-        }
-     }
-
-     augment /name {
-        choice name {
-             case a {
-                 leaf udp {
-                     type empty;
-                 }
-             }
-             case b {
-                 leaf tcp {
-                    type empty;
-                 }
-             }
-         }
-     }
-
-}
\ No newline at end of file
diff --git a/plugin/maven/src/test/resources/choiceTranslator/all.yang b/plugin/maven/src/test/resources/choiceTranslator/all.yang
new file mode 100644
index 0000000..be2fd07
--- /dev/null
+++ b/plugin/maven/src/test/resources/choiceTranslator/all.yang
@@ -0,0 +1,157 @@
+module all {
+
+  namespace "yang:all";
+  prefix "all";
+  yang-version 1;
+
+  choice name {
+             case a {
+                 leaf udp {
+                     type empty;
+                 }
+             }
+             case b {
+                 leaf tcp {
+                    type empty;
+           }
+       }
+   }
+
+
+   container c {
+       choice name {
+             case a {
+                 leaf udp {
+                     type empty;
+                 }
+             }
+             case b {
+                 leaf tcp {
+                    type empty;
+                 }
+             }
+         }
+   }
+
+   list l {
+   config false;
+choice name {
+             case a {
+                 leaf udp {
+                     type empty;
+                 }
+             }
+             case b {
+                 leaf tcp {
+                    type empty;
+                 }
+             }
+         }
+   }
+
+
+   grouping g {
+    choice name {
+             case a {
+                 leaf udp {
+                     type empty;
+                 }
+             }
+             case b {
+                 leaf tcp {
+                    type empty;
+                 }
+             }
+         }
+   }
+    rpc r {
+        input {
+           choice name {
+             case a {
+                 leaf udp {
+                     type empty;
+                 }
+             }
+             case b {
+                 leaf tcp {
+                    type empty;
+                 }
+             }
+         }
+       }
+      output {
+        choice name {
+             case a {
+                 leaf udp {
+                     type empty;
+                 }
+             }
+             case b {
+                 leaf tcp {
+                    type empty;
+                 }
+             }
+         }
+        }
+     }
+
+     augment /name {
+        choice name {
+             case a {
+                 leaf udp {
+                     type empty;
+                 }
+                 container cont1 {
+                     container cont2 {
+                     choice name {
+                                  case a {
+                                      leaf udp {
+                                          type empty;
+                                      }
+                                      container cont1 {
+                                          container cont2 {
+                                               leaf udp1 {
+                                                  type empty;
+                                                   }
+                                           }
+                                          leaf udp2 {
+                                              type empty;
+                                          }
+                                      }
+                                  }
+                                  case b {
+                                      leaf tcp3 {
+                                         type empty;
+                                      }
+                                  }
+                              }
+                          leaf udp4 {
+                             type empty;
+                              }
+                      }
+                     leaf udp5 {
+                         type empty;
+                     }
+                 }
+             }
+             case b {
+                 leaf tcp2 {
+                    type empty;
+                 }
+             }
+         }
+         choice name1 {
+                      case a {
+                          leaf udp {
+                              type empty;
+                          }
+                      }
+                      case b {
+                          leaf tcp {
+                             type empty;
+                          }
+                      }
+                  }
+     }
+
+}
\ No newline at end of file
diff --git a/plugin/maven/src/test/resources/grouping/grouping.yang b/plugin/maven/src/test/resources/grouping/grouping.yang
new file mode 100644
index 0000000..518150f
--- /dev/null
+++ b/plugin/maven/src/test/resources/grouping/grouping.yang
@@ -0,0 +1,58 @@
+module grouping {
+
+  namespace "yang:grouping";
+  prefix "grouping";
+  yang-version 1;
+  revision 2016-10-08;
+
+  grouping link-details {
+      leaf link-id {
+          type union {
+              type int32;
+              type uint16;
+              type enumeration {
+                   enum one;
+                   enum two;
+                   enum five {
+                      value 5;
+                   }
+                   enum six-square {
+                      value 36;
+                   }
+              }
+          }
+      }
+      typedef group {
+          type bits {
+              bit disable-nagle {
+                  position 0;
+                           }
+              bit auto-sense-speed {
+                  position 1;
+              }
+              bit Mb-only {
+                  position 2;
+              }
+          }
+      }
+      container link {
+          leaf port {
+            type int32;
+          }
+  
+          leaf-list port-id {
+              type string;
+          }
+          list areas {
+             key "name1";
+             leaf name1 {
+              type string;
+             }
+          }
+      }
+  }
+
+  container cont2 {
+       uses link-details;
+  }
+}
diff --git a/plugin/maven/src/test/resources/pstcodegen/test.yang b/plugin/maven/src/test/resources/pstcodegen/test.yang
new file mode 100644
index 0000000..93e1476
--- /dev/null
+++ b/plugin/maven/src/test/resources/pstcodegen/test.yang
@@ -0,0 +1,83 @@
+module test {
+    namespace "test:test";
+    prefix test;
+
+    container cont1 {
+        leaf leaf1 {
+            type int32;
+        }
+        leaf-list leaf-list1 {
+            type int32;
+        }
+        list list1 {
+            key "name";
+            leaf name {
+                type string;
+            }
+        }
+        container cont2 {
+            leaf leaf2 {
+                type int32;
+            }
+        }
+    }
+    leaf leaf2 {
+        type int32;
+    }
+    leaf-list leaf-list2 {
+        type int32;
+    }
+    list list2 {
+        key "name";
+        leaf name {
+            type string;
+        }
+    }
+    choice choice1 {
+         case case1 {
+             leaf leaf3 {
+                 type int32;
+             }
+             leaf-list leaf-list3 {
+                 type int32;
+             }
+             list list3 {
+                 key "name";
+                 leaf name {
+                     type string;
+                 }
+             }
+         }
+    }
+    grouping group1 {
+        container cont1 {
+            leaf leaf1 {
+                type int32;
+            }
+            leaf-list leaf-list1 {
+                type int32;
+            }
+            list list1 {
+                key "name";
+                leaf name {
+                    type string;
+                }
+            }
+            container cont2 {
+                leaf leaf2 {
+                    type int32;
+                }
+            }
+        }
+    }
+    rpc rpc1 {
+        input {
+            uses group1;
+        }
+    }
+    augment /cont1/list1 {
+        leaf leaf2 {
+            type int64;
+        }
+    }
+}
\ No newline at end of file