[ONOS-5232] bits enum class generation modifications and code refactoring.

Change-Id: I67fb31c586802e9cf682aa6e707475ad8fdc096f
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
index cfe507b..de75bbf 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaQualifiedTypeInfoTranslator.java
@@ -16,28 +16,21 @@
 
 package org.onosproject.yangutils.translator.tojava;
 
-import java.io.Serializable;
-import java.util.Objects;
-
+import com.google.common.base.MoreObjects;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
-import org.onosproject.yangutils.translator.tojava.javamodel
-        .AttributesJavaDataType;
-import org.onosproject.yangutils.translator.tojava.javamodel
-        .JavaLeafInfoContainer;
+import org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType;
+import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
 import org.onosproject.yangutils.utils.io.YangToJavaNamingConflictUtil;
 
-import com.google.common.base.MoreObjects;
+import java.io.Serializable;
+import java.util.Objects;
 
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BINARY;
+import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.getJavaImportClass;
+import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.getJavaImportPackage;
 import static org.onosproject.yangutils.utils.UtilConstants.BASE64;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype
-        .YangDataTypes.BINARY;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BITS;
-import static org.onosproject.yangutils.translator.tojava.javamodel
-        .AttributesJavaDataType.getJavaImportClass;
-import static org.onosproject.yangutils.translator.tojava.javamodel
-        .AttributesJavaDataType.getJavaImportPackage;
 import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
 
 /**
@@ -47,6 +40,7 @@
         extends JavaQualifiedTypeInfo
         implements Comparable<JavaQualifiedTypeInfoTranslator>, Serializable {
     private static final long serialVersionUID = 806201634L;
+    private boolean isQualified;
 
     /**
      * Creates a java qualified type info object.
@@ -276,4 +270,22 @@
     public int compareTo(JavaQualifiedTypeInfoTranslator other) {
         return getClassInfo().compareTo(other.getClassInfo());
     }
+
+    /**
+     * Returns true if import is qualified.
+     *
+     * @return true if import is qualified
+     */
+    public boolean isQualified() {
+        return isQualified;
+    }
+
+    /**
+     * Sets true if import is qualified.
+     *
+     * @param qualified true if import is qualified
+     */
+    public void setQualified(boolean qualified) {
+        isQualified = qualified;
+    }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java
index 7f15bc3..5f6b3bb 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaBeanFragmentFiles.java
@@ -114,4 +114,5 @@
         closeFile(constructorImplTempFileHandle, true);
         super.freeTemporaryResources(isErrorOccurred);
     }
+
 }
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 0e1c132..4b8ca9c 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,6 +20,7 @@
 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;
@@ -32,7 +33,6 @@
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.javamodel.JavaLeafInfoContainer;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGroupingTranslator;
-import org.onosproject.yangutils.translator.tojava.utils.BitsJavaInfoHandler;
 import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
@@ -68,6 +68,7 @@
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
 import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedInfoOfFromString;
 import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.generateBitsFile;
 import static org.onosproject.yangutils.translator.tojava.javamodel.AttributesJavaDataType.updateJavaFileInfo;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.generateEnumAttributeString;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefinition;
@@ -91,7 +92,9 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterString;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethod;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.parseBuilderInterfaceBuildMethodString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getChoiceChildNodes;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getImportString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getNodesImports;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOverRideString;
 import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeaf;
 import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeafList;
@@ -105,6 +108,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST_IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENT_MAP_TYPE;
 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.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
@@ -124,6 +128,7 @@
 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;
+import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
 import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
@@ -266,11 +271,20 @@
     private static final String BUILDER_CLASS_FILE_NAME_SUFFIX = BUILDER;
 
     /**
-     *
+     * if type is binary.
      */
     private boolean isBinary;
 
     /**
+     * Current attributes YANG node
+     */
+    private YangNode attrNode;
+
+    /**
+     * Sub tree filtering requires child class imports for type cast.
+     */
+    private final List<JavaQualifiedTypeInfoTranslator> subTreeImports = new ArrayList<>();
+    /**
      * Information about the java files being generated.
      */
     private JavaFileInfoTranslator javaFileInfo;
@@ -413,11 +427,6 @@
     private boolean isAttributePresent;
 
     /**
-     * List of bits attributes.
-     */
-    private List<BitsJavaInfoHandler> bitsHandler = new ArrayList<>();
-
-    /**
      * Creates an instance of temp JAVA fragment files.
      */
     TempJavaFragmentFiles() {
@@ -598,6 +607,14 @@
             throws IOException {
         TempJavaBeanFragmentFiles tempFiles =
                 getBeanFiles((JavaCodeGeneratorInfo) parent);
+        if (curNode instanceof YangChoice) {
+            tempFiles.setAttrNode(curNode);
+            for (JavaQualifiedTypeInfoTranslator info : getNodesImports(
+                    getChoiceChildNodes((YangChoice) curNode), config))
+                tempFiles.addToSubTreeImports(info);
+        } else {
+            tempFiles.setAttrNode(null);
+        }
         JavaAttributeInfo attr =
                 getCurNodeAsAttributeInTarget(curNode, parent, isList,
                                               tempFiles);
@@ -656,6 +673,11 @@
             }
             qualified = parentImportData.addImportInfo(typeInfo, className,
                                                        fileInfo.getPackage());
+            if (!qualified && !(curNode instanceof YangChoice)) {
+                addChildDefaultClassImportForSubTreeFilter(typeInfo.getPkgInfo(),
+                                                           typeInfo.getClassInfo(),
+                                                           tempFiles);
+            }
         }
         boolean collectionSet = false;
         if (curNode instanceof YangList) {
@@ -694,6 +716,16 @@
                                           qualified, listNode);
     }
 
+    private static void addChildDefaultClassImportForSubTreeFilter(
+            String pkg, String className, TempJavaFragmentFiles tempFile) {
+        className = DEFAULT_CAPS + getCapitalCase(className);
+        JavaQualifiedTypeInfoTranslator info = new
+                JavaQualifiedTypeInfoTranslator();
+        info.setClassInfo(className);
+        info.setPkgInfo(pkg);
+        tempFile.subTreeImports.add(info);
+    }
+
     /**
      * Returns java attribute for leaf.
      *
@@ -706,7 +738,7 @@
     private static JavaAttributeInfo
     getJavaAttributeOfLeaf(TempJavaFragmentFiles tempFiles,
                            JavaLeafInfoContainer container,
-                           YangPluginConfig config, boolean leafList) {
+                           YangPluginConfig config, boolean leafList) throws IOException {
         if (leafList) {
             tempFiles.getJavaImportData().setIfListImported(true);
             return getAttributeOfLeafInfoContainer(tempFiles, container, config,
@@ -729,7 +761,7 @@
     getAttributeOfLeafInfoContainer(TempJavaFragmentFiles tempFiles,
                                     JavaLeafInfoContainer container,
                                     YangPluginConfig config,
-                                    boolean listAttribute) {
+                                    boolean listAttribute) throws IOException {
         container.setConflictResolveConfig(config.getConflictResolver());
         container.updateJavaQualifiedInfo();
         addImportForLeafInfo(tempFiles, container);
@@ -739,7 +771,16 @@
                 container.getDataType(),
                 tempFiles.getIsQualifiedAccessOrAddToImportList(
                         container.getJavaQualifiedInfo()), listAttribute);
-        if (container.getDataType().getDataType() == YangDataTypes.BITS) {
+        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) {
             addBitsHandler(attr, container.getDataType(), tempFiles);
         }
         return attr;
@@ -753,10 +794,9 @@
      * @param tempFiles temp fragment file
      */
     static void addBitsHandler(JavaAttributeInfo attr, YangType type,
-                               TempJavaFragmentFiles tempFiles) {
-        BitsJavaInfoHandler handler
-                = new BitsJavaInfoHandler(attr, type);
-        tempFiles.getBitsHandler().add(handler);
+                               TempJavaFragmentFiles tempFiles)
+            throws IOException {
+        generateBitsFile(attr, type, tempFiles.getJavaFileInfo(), tempFiles);
     }
 
     /**
@@ -1012,7 +1052,7 @@
     private void addSubtreeFilteringForChildNode(JavaAttributeInfo attr)
             throws IOException {
         appendToFile(getSubtreeFilteringForChildNodeTempFileHandle,
-                     getSubtreeFilteringForNode(attr) + NEW_LINE);
+                     getSubtreeFilteringForNode(attr, attrNode) + NEW_LINE);
     }
 
     /**
@@ -1049,8 +1089,7 @@
             throws IOException {
         appendToFile(setterInterfaceTempFileHandle,
                      getSetterString(attr, getGeneratedJavaClassName(),
-                                     getGeneratedJavaFiles()) +
-                             NEW_LINE);
+                                     getGeneratedJavaFiles()) + NEW_LINE);
     }
 
     /**
@@ -1227,14 +1266,13 @@
      *
      * @param attr           type attribute info
      * @param fromStringAttr from string attribute info
-     * @param genClassName   generated class name
      * @throws IOException when fails to append to temporary file
      */
     void addFromStringMethod(JavaAttributeInfo attr,
-                             JavaAttributeInfo fromStringAttr, String genClassName)
+                             JavaAttributeInfo fromStringAttr)
             throws IOException {
         appendToFile(fromStringImplTempFileHandle,
-                     getFromStringMethod(attr, fromStringAttr, genClassName) + NEW_LINE);
+                     getFromStringMethod(attr, fromStringAttr) + NEW_LINE);
     }
 
     /**
@@ -1526,6 +1564,23 @@
     }
 
     /**
+     * Adds sub tree filtering to temp files.
+     *
+     * @param config YANG plugin config
+     * @throws IOException IO exception
+     */
+    protected void addIsSubTreeFilteredFlag(YangPluginConfig config)
+            throws IOException {
+        JavaQualifiedTypeInfoTranslator typeInfo =
+                new JavaQualifiedTypeInfoTranslator();
+        typeInfo.setClassInfo(BOOLEAN_DATA_TYPE);
+        typeInfo.setPkgInfo(null);
+        JavaAttributeInfo attributeInfo =
+                getAttributeInfoForTheData(typeInfo, SUBTREE_FILTERED, null, false, false);
+        addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
+    }
+
+    /**
      * Adds value leaf flag to temp files.
      *
      * @param config YANG plugin config
@@ -1556,9 +1611,17 @@
             throws IOException {
         isAttributePresent = true;
         String attrName = newAttrInfo.getAttributeName();
+        //Boolean flag for operation type attr info generation control.
         boolean required = !attrName.equals(VALUE_LEAF) &&
                 !attrName.equals(SELECT_LEAF) &&
                 !attrName.equals(YANG_AUGMENTED_INFO_MAP);
+        //Boolean flag for subtree for nodes info generation control.
+        boolean subTreeForChild =
+                tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK) &&
+                        newAttrInfo.getAttributeType() == null &&
+                        !attrName.contains(OPERATION_TYPE_ATTRIBUTE) &&
+                        required && !attrName.equals(SUBTREE_FILTERED);
+        ;
         if (tempFlagSet(ATTRIBUTES_MASK)) {
             addAttribute(newAttrInfo);
         }
@@ -1591,9 +1654,7 @@
             addAddToListInterface(newAttrInfo);
         }
         YangType attrType = newAttrInfo.getAttributeType();
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK) &&
-                attrType == null && !attrName
-                .contains(OPERATION_TYPE_ATTRIBUTE) && required) {
+        if (subTreeForChild) {
             addSubtreeFilteringForChildNode(newAttrInfo);
         }
         if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK) &&
@@ -1627,8 +1688,7 @@
                                 typeInfo, newAttrInfo.getAttributeName(),
                                 attrType, getIsQualifiedAccessOrAddToImportList(
                                         typeInfo), false);
-                addFromStringMethod(newAttrInfo, fromStringAttributeInfo,
-                                    getGeneratedJavaClassName());
+                addFromStringMethod(newAttrInfo, fromStringAttributeInfo);
             }
         }
     }
@@ -1716,7 +1776,10 @@
             }
         }
 
-        if (!curNode.isOpTypeReq() && curNode instanceof YangCase) {
+        if (curNode.isOpTypeReq()) {
+            addSubTreeImportStrings(imports);
+        }
+        if (curNode instanceof YangCase) {
             removeCaseParentImport(curNode, imports);
         }
 
@@ -2030,15 +2093,6 @@
     }
 
     /**
-     * Returns list of bits attributes.
-     *
-     * @return list of bits attributes
-     */
-    public List<BitsJavaInfoHandler> getBitsHandler() {
-        return bitsHandler;
-    }
-
-    /**
      * Sets true if binary type is there for leaf/leaf-list.
      *
      * @param binary true if binary type is there for leaf/leaf-list
@@ -2056,4 +2110,37 @@
         return isBinary;
     }
 
+    /**
+     * Sets attribute's node.
+     *
+     * @param attrNode attribute's node
+     */
+    public void setAttrNode(YangNode attrNode) {
+        this.attrNode = attrNode;
+    }
+
+    /**
+     * Adds info to sub tree import list.
+     *
+     * @param info import info
+     */
+    public void addToSubTreeImports(JavaQualifiedTypeInfoTranslator
+                                            info) {
+        boolean isAdded = false;
+        for (JavaQualifiedTypeInfoTranslator imports : subTreeImports) {
+            if (imports.getClassInfo().equals(info.getClassInfo())) {
+                isAdded = true;
+            }
+        }
+        if (!isAdded) {
+            subTreeImports.add(info);
+        }
+    }
+
+    private void addSubTreeImportStrings(List<String> imports) {
+        for (JavaQualifiedTypeInfoTranslator impt : subTreeImports) {
+            imports.add(getImportString(impt.getPkgInfo(), impt.getClassInfo()));
+        }
+        sortImports(imports);
+    }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
index 474594d..0cb63e1 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaServiceFragmentFiles.java
@@ -40,6 +40,9 @@
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getRpcServiceMethod;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
+import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
+import static org.onosproject.yangutils.utils.UtilConstants.INPUT;
+import static org.onosproject.yangutils.utils.UtilConstants.OUTPUT;
 import static org.onosproject.yangutils.utils.UtilConstants.Operation.ADD;
 import static org.onosproject.yangutils.utils.UtilConstants.RPC_INPUT_VAR_NAME;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
@@ -47,6 +50,7 @@
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.generateJavaDocForRpc;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
+import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
 
 /**
@@ -148,11 +152,18 @@
      */
     private void addRpcString(JavaAttributeInfo inAttr, JavaAttributeInfo outAttr,
                               String rpcName) throws IOException {
-        String rpcInput = inAttr == null ? null :
-                getCapitalCase(inAttr.getAttributeName());
-        String rpcOutput = outAttr == null ? VOID :
-                getCapitalCase(outAttr.getAttributeName());
-        String rpcIn = rpcInput == null ? EMPTY_STRING : RPC_INPUT_VAR_NAME;
+        String rpcInput = null;
+        String rpcOutput = VOID;
+        String rpcIn = EMPTY_STRING;
+        if (inAttr != null) {
+            rpcInput = getCapitalCase(inAttr.getAttributeName());
+        }
+        if (outAttr != null) {
+            rpcOutput = getCapitalCase(outAttr.getAttributeName());
+        }
+        if (rpcInput != null) {
+            rpcIn = RPC_INPUT_VAR_NAME;
+        }
         appendToFile(rpcInterfaceTempFileHandle,
                      generateJavaDocForRpc(rpcName, rpcIn, rpcOutput) +
                              getRpcServiceMethod(rpcName, rpcInput, rpcOutput));
@@ -180,14 +191,24 @@
      * @param childNode  child data model node(input / output) for which the java code generation
      *                   is being handled
      * @param parentNode parent node (module / sub-module) in which the child node is an attribute
+     * @param rpcName    rpc name
      * @return AttributeInfo attribute details required to add in temporary
      * files
      */
     public JavaAttributeInfo getChildNodeAsAttributeInParentService(
-            YangNode childNode, YangNode parentNode) {
+            YangNode childNode, YangNode parentNode, String rpcName) {
 
-        String childNodeName = ((JavaFileInfoContainer) childNode)
-                .getJavaFileInfo().getJavaName();
+        JavaFileInfoTranslator fileInfo = ((JavaFileInfoContainer) childNode)
+                .getJavaFileInfo();
+        String childNodeName = fileInfo.getJavaName();
+        if (childNodeName == null) {
+            if (childNode instanceof YangInput) {
+                childNodeName = rpcName + HYPHEN + INPUT;
+            } else {
+                childNodeName = rpcName + HYPHEN + OUTPUT;
+            }
+            childNodeName = getCamelCase(childNodeName, null);
+        }
         /*
          * Get the import info corresponding to the attribute for import in
          * generated java files or qualified access
@@ -237,30 +258,41 @@
         JavaAttributeInfo out = null;
         YangNode rpcChild;
         YangRpc rpc;
+        String rpcName;
         YangInput input;
+
         for (YangAugment info : module.getAugmentList()) {
             input = (YangInput) info.getAugmentedNode();
 
             if (input != null) {
                 rpc = (YangRpc) input.getParent();
-                rpcChild = rpc.getChild();
-                while (rpcChild != null) {
-                    if (rpcChild instanceof YangInput) {
-                        in = getChildNodeAsAttributeInParentService(
-                                rpcChild, (YangNode) module);
+                if (!validateForIntraFile(module, (RpcNotificationContainer) rpc
+                        .getParent())) {
+                    rpcChild = rpc.getChild();
+
+                    rpcName = getCamelCase(rpc.getName(), null);
+                    while (rpcChild != null) {
+                        if (rpcChild instanceof YangInput) {
+                            in = getChildNodeAsAttributeInParentService(
+                                    rpcChild, (YangNode) module, rpcName);
+                        }
+                        if (rpcChild instanceof YangOutput) {
+                            out = getChildNodeAsAttributeInParentService(
+                                    rpcChild, (YangNode) module, rpcName);
+                        }
+                        rpcChild = rpcChild.getNextSibling();
                     }
-                    if (rpcChild instanceof YangOutput) {
-                        out = getChildNodeAsAttributeInParentService(
-                                rpcChild, (YangNode) module);
-                    }
-                    rpcChild = rpcChild.getChild();
+                    addJavaSnippetInfoToApplicableTempFiles(in, out, rpcName);
                 }
-                addJavaSnippetInfoToApplicableTempFiles(in, out, rpc
-                        .getJavaClassNameOrBuiltInType());
             }
         }
     }
 
+    private boolean validateForIntraFile(RpcNotificationContainer parent,
+                                         RpcNotificationContainer curModule) {
+        return parent.getPrefix().equals(curModule.getPrefix());
+    }
+
     /**
      * Removes all temporary file handles.
      *
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
index 431cf19..b0145a8 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
@@ -474,7 +474,7 @@
                                                                                newAttrInfo.getAttributeType(),
                                                                                getIsQualifiedAccessOrAddToImportList(qualifiedInfoOfFromString), false);
 
-        addFromStringMethod(newAttrInfo, fromStringAttributeInfo, getGeneratedJavaClassName());
+        addFromStringMethod(newAttrInfo, fromStringAttributeInfo);
     }
 
     /**
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 0a433ee..ab1c8f4 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
@@ -19,16 +19,21 @@
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.datamodel.YangBit;
+import org.onosproject.yangutils.datamodel.YangBits;
 import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
+import org.onosproject.yangutils.datamodel.YangEnum;
+import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangGrouping;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
 import org.onosproject.yangutils.datamodel.YangSchemaNode;
 import org.onosproject.yangutils.datamodel.YangTranslatorOperatorNode;
+import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangTypeHolder;
-import org.onosproject.yangutils.datamodel.utils.DataModelUtils;
+import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugmentTranslator;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaEnumerationTranslator;
@@ -37,19 +42,21 @@
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaOutputTranslator;
 import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModuleTranslator;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
+import org.slf4j.Logger;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.isRpcChildNodePresent;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeInfoInParentTempFile;
-import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateInterfaceFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
-import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.methodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_NODE;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_PARENT_NODE;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorErrorType.INVALID_TRANSLATION_NODE;
@@ -57,7 +64,7 @@
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsg;
 import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getErrorMsgForCodeGenerator;
 import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED;
-import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
+import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
 import static org.onosproject.yangutils.utils.UtilConstants.INPUT_KEYWORD;
 import static org.onosproject.yangutils.utils.UtilConstants.OUTPUT_KEYWORD;
@@ -69,12 +76,15 @@
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.trimAtLast;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.validateLineLength;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Represents utility class for YANG java model.
  */
 public final class YangJavaModelUtils {
 
+    private static final Logger LOG = getLogger(YangJavaModelUtils.class);
+
     // No instantiation.
     private YangJavaModelUtils() {
     }
@@ -207,7 +217,8 @@
     private static void createTempFragmentFile(JavaCodeGeneratorInfo info)
             throws IOException {
         info.setTempJavaCodeFragmentFiles(
-                new TempJavaCodeFragmentFiles(info.getJavaFileInfo()));
+                new TempJavaCodeFragmentFiles(info.getJavaFileInfo()
+                ));
     }
 
     /**
@@ -226,21 +237,15 @@
         if (info instanceof RpcNotificationContainer) {
             getBeanFiles(info).setRootNode(true);
             /*
-             * Module / sub module node code generation.
+             * event classes code generation.
              */
-            if (info instanceof YangJavaModuleTranslator) {
-                if (!((YangJavaModuleTranslator) info).getNotificationNodes()
-                        .isEmpty()) {
-                    updateNotificationNodeInfo(info, config);
-                }
-            } else if (info instanceof YangJavaSubModuleTranslator) {
-                if (!((YangJavaSubModuleTranslator) info).getNotificationNodes()
-                        .isEmpty()) {
-                    updateNotificationNodeInfo(info, config);
-                }
-            }
+            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
                     .getListOfLeaf().isEmpty();
@@ -321,21 +326,11 @@
     private static void updateNotificationNodeInfo(JavaCodeGeneratorInfo info,
                                                    YangPluginConfig config)
             throws IOException {
-        TempJavaCodeFragmentFiles translator =
-                info.getTempJavaCodeFragmentFiles();
-        if (info instanceof YangJavaModuleTranslator) {
-            for (YangNode notification : ((YangJavaModuleTranslator) info)
-                    .getNotificationNodes()) {
-                translator.getEventFragmentFiles()
-                        .addJavaSnippetOfEvent(notification, config);
-            }
-        }
-        if (info instanceof YangJavaSubModuleTranslator) {
-            for (YangNode notification : ((YangJavaSubModuleTranslator) info)
-                    .getNotificationNodes()) {
-                translator.getEventFragmentFiles()
-                        .addJavaSnippetOfEvent(notification, config);
-            }
+        TempJavaCodeFragmentFiles tempFile = info.getTempJavaCodeFragmentFiles();
+        for (YangNode notification :
+                ((RpcNotificationContainer) info).getNotificationNodes()) {
+            tempFile.getEventFragmentFiles()
+                    .addJavaSnippetOfEvent(notification, config);
         }
     }
 
@@ -463,9 +458,8 @@
      * @param config plugin configuration
      * @return cases parent's qualified info
      */
-    public static JavaQualifiedTypeInfoTranslator
-    getQualifierInfoForCasesParent(YangNode parent,
-                                   YangPluginConfig config) {
+    private static JavaQualifiedTypeInfoTranslator getQualifierInfoForCasesParent(
+            YangNode parent, YangPluginConfig config) {
         String parentName;
         String parentPkg;
         JavaFileInfoTranslator parentInfo;
@@ -550,7 +544,7 @@
             throw new TranslatorException(getErrorMsg(INVALID_NODE, curNode));
         }
 
-        YangNode parentNode = DataModelUtils.getParentNodeInGenCode(curNode);
+        YangNode parentNode = getParentNodeInGenCode(curNode);
         if (!(parentNode instanceof JavaFileInfoContainer)) {
             throw new TranslatorException(getErrorMsg(INVALID_PARENT_NODE,
                                                       curNode));
@@ -635,6 +629,14 @@
                                          YangPluginConfig config) {
 
         List<String> clsInfo = new ArrayList<>();
+        String add = null;
+        if (node instanceof YangCase) {
+            YangNode parent = node.getParent();
+            if (parent instanceof YangAugment) {
+                add = getCamelCase(((YangAugment) parent)
+                                           .getAugmentedNode().getName(), null);
+            }
+        }
         while (node.getParent() != null) {
             if (node instanceof YangJavaAugmentTranslator) {
                 clsInfo.add(getAugmentClassName((YangAugment) node,
@@ -661,9 +663,13 @@
                                       subModule.getRevision(),
                                       config.getConflictResolver()));
         }
-        pkg.append(EMPTY_STRING);
+        if (add != null) {
+            clsInfo.add(add);
+        }
+        clsInfo.add(getCamelCase(node.getName(), config.getConflictResolver()));
+
         int size = clsInfo.size();
-        for (int i = size - 1; i >= 0; i--) {
+        for (int i = size - 1; i > 0; i--) {
             pkg.append(PERIOD).append(clsInfo.get(i));
         }
         return pkg.toString().toLowerCase();
@@ -681,14 +687,15 @@
         YangNodeIdentifier identifier =
                 augment.getTargetNode().get(augment.getTargetNode().size() - 1)
                         .getNodeIdentifier();
-        String name = getCapitalCase(getCamelCase(identifier.getName(),
-                                                  config.getConflictResolver()));
+        String prefix = identifier.getPrefix();
+        String idName = identifier.getName();
+        StringBuilder name = new StringBuilder(AUGMENTED).append(HYPHEN);
         if (identifier.getPrefix() != null) {
-            return getCapitalCase(getCamelCase(AUGMENTED + HYPHEN + identifier
-                                                       .getPrefix(),
-                                               config.getConflictResolver())) + name;
+            name.append(prefix).append(HYPHEN);
         }
-        return AUGMENTED + name;
+        name.append(idName);
+        return getCapitalCase(getCamelCase(name.toString(),
+                                           config.getConflictResolver()));
     }
 
     /**
@@ -709,6 +716,92 @@
         }
     }
 
+    private static void createAndAddEnum(String name, int value,
+                                         YangEnumeration enumeration) {
+        YangEnum yangEnum = new YangEnum();
+        yangEnum.setNamedValue(name);
+        yangEnum.setValue(value);
+        try {
+            enumeration.addEnumInfo(yangEnum);
+        } catch (DataModelException e) {
+            LOG.error("failed to add enum in bits enum class " + e);
+        }
+    }
+
+    /**
+     * Returns bits type enum file.
+     *
+     * @param attr     attribute
+     * @param type     data type
+     * @param fileInfo file info
+     * @param tempFile temp java fragment files
+     * @throws IOException when fails to do IO operations
+     */
+    static void generateBitsFile(
+            JavaAttributeInfo attr, YangType type,
+            JavaFileInfoTranslator fileInfo, TempJavaFragmentFiles tempFile) throws IOException {
+        String className = attr.getAttributeName();
+        JavaFileInfoTranslator attrInfo = new JavaFileInfoTranslator();
+        attrInfo.setJavaName(className);
+        attrInfo.setPackage((fileInfo.getPackage() + "." + fileInfo.getJavaName()
+                            ).toLowerCase());
+        attrInfo.setBaseCodeGenPath(fileInfo.getBaseCodeGenPath());
+        attrInfo.setGeneratedFileTypes(GENERATE_ENUM_CLASS);
+        attrInfo.setPackageFilePath(fileInfo.getPackageFilePath() + File
+                .separator + fileInfo.getJavaName().toLowerCase());
+        attrInfo.setPluginConfig(fileInfo.getPluginConfig());
+        TempJavaCodeFragmentFiles codeFile = new TempJavaCodeFragmentFiles(
+                attrInfo);
+        YangJavaEnumerationTranslator enumeration = new YangJavaEnumerationTranslator() {
+            @Override
+            public String getJavaPackage() {
+                return attr.getImportInfo().getPkgInfo();
+            }
+
+            @Override
+            public String getJavaClassNameOrBuiltInType() {
+                return className;
+            }
+
+            @Override
+            public String getJavaAttributeName() {
+                return className;
+            }
+        };
+
+        enumeration.setName(getCapitalCase(className));
+        enumeration.setJavaFileInfo(attrInfo);
+        enumeration.setTempJavaCodeFragmentFiles(codeFile);
+        YangBits yangBits = (YangBits) type.getDataTypeExtendedInfo();
+        Integer key;
+        YangBit bit;
+        String bitName;
+        for (Map.Entry<Integer, YangBit> entry : yangBits.getBitPositionMap()
+                .entrySet()) {
+            key = entry.getKey();
+            bit = entry.getValue();
+            if (bit != null) {
+                bitName = bit.getBitName();
+                createAndAddEnum(bitName, key, enumeration);
+            }
+        }
+
+        codeFile.getEnumTempFiles()
+                .addEnumAttributeToTempFiles(enumeration, fileInfo.getPluginConfig());
+        codeFile.getEnumTempFiles().setEnumClass(false);
+        codeFile.generateJavaFile(GENERATE_ENUM_CLASS, enumeration);
+
+        //Add to import list.
+        JavaQualifiedTypeInfoTranslator info = new
+                JavaQualifiedTypeInfoTranslator();
+        info.setClassInfo(getCapitalCase(attrInfo.getJavaName()));
+        info.setPkgInfo(attrInfo.getPackage());
+        if (tempFile instanceof TempJavaTypeFragmentFiles) {
+            tempFile.getJavaImportData().addImportInfo(info, fileInfo
+                    .getJavaName(), fileInfo.getPackage());
+        }
+    }
+
     /**
      * Generates interface file for those yang file which contains only any
      * of these grouping, typedef and identity.
@@ -733,6 +826,6 @@
         //generate java code for interface file.
         validateLineLength(generateInterfaceFile(interFace, null, rootNode,
                                                  false));
-        insertDataIntoJavaFile(interFace, methodClose(FOUR_SPACE));
+        insertDataIntoJavaFile(interFace, CLOSE_CURLY_BRACKET);
     }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
index 668b1e9..74e1931 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModuleTranslator.java
@@ -27,9 +27,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.List;
 
-import static java.util.Collections.unmodifiableList;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
@@ -60,11 +58,6 @@
     private transient TempJavaCodeFragmentFiles tempFileHandle;
 
     /**
-     * List of notifications nodes.
-     */
-    private final transient List<YangNode> notificationNodes;
-
-    /**
      * Creates a YANG node of module type.
      */
     public YangJavaModuleTranslator() {
@@ -194,15 +187,6 @@
     }
 
     /**
-     * Returns notifications node list.
-     *
-     * @return notification nodes
-     */
-    public List<YangNode> getNotificationNodes() {
-        return unmodifiableList(notificationNodes);
-    }
-
-    /**
      * Adds to notification node list.
      *
      * @param curNode notification node
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpcTranslator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpcTranslator.java
index f3b4416..d0e1f03 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpcTranslator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpcTranslator.java
@@ -146,11 +146,13 @@
             if (yangNode instanceof YangInput) {
                 javaAttributeInfoOfInput = tempJavaFragmentFiles
                         .getChildNodeAsAttributeInParentService(yangNode,
-                                                                getParent());
+                                                                getParent(),
+                                                                getJavaClassNameOrBuiltInType());
             } else if (yangNode instanceof YangOutput) {
                 javaAttributeInfoOfOutput = tempJavaFragmentFiles
                         .getChildNodeAsAttributeInParentService(yangNode,
-                                                                getParent());
+                                                                getParent(),
+                                                                getJavaClassNameOrBuiltInType());
             } else {
                 throw new TranslatorException(getErrorMsg(INVALID_CHILD_NODE,
                                                           this));
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModuleTranslator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
index 62f2962..c63f215 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
@@ -28,9 +28,7 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.List;
 
-import static java.util.Collections.unmodifiableList;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
@@ -60,11 +58,6 @@
     private transient TempJavaCodeFragmentFiles tempFileHandle;
 
     /**
-     * List of notifications nodes.
-     */
-    private final transient List<YangNode> notificationNodes;
-
-    /**
      * Creates YANG java sub module object.
      */
     public YangJavaSubModuleTranslator() {
@@ -128,7 +121,7 @@
      * @return the name space string of the module.
      */
     public String getNameSpaceFromModule() {
-        return ((YangModule) (getBelongsTo().getModuleNode())).getModuleNamespace();
+        return ((YangModule) getBelongsTo().getModuleNode()).getModuleNamespace();
     }
 
     /**
@@ -206,15 +199,6 @@
     }
 
     /**
-     * Returns notifications node list.
-     *
-     * @return notification nodes
-     */
-    public List<YangNode> getNotificationNodes() {
-        return unmodifiableList(notificationNodes);
-    }
-
-    /**
      * Adds to notification node list.
      *
      * @param curNode notification node
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/BitsJavaInfoHandler.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/BitsJavaInfoHandler.java
deleted file mode 100644
index b0ce250..0000000
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/BitsJavaInfoHandler.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.yangutils.translator.tojava.utils;
-
-import org.onosproject.yangutils.datamodel.YangBit;
-import org.onosproject.yangutils.datamodel.YangBits;
-import org.onosproject.yangutils.datamodel.YangEnum;
-import org.onosproject.yangutils.datamodel.YangEnumeration;
-import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.datamodel.YangType;
-import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
-import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
-import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
-import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaEnumerationTranslator;
-
-import java.io.IOException;
-import java.util.Map;
-
-import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
-import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
-
-/**
- * Represents bits YANG type info.
- */
-public class BitsJavaInfoHandler {
-
-    private JavaAttributeInfo attr;
-    private YangType<?> yangType;
-
-    /**
-     * Creates an instance of bits java info handler.
-     *
-     * @param attr     java attribute
-     * @param yangType YANG type
-     */
-    public BitsJavaInfoHandler(JavaAttributeInfo attr, YangType<?> yangType) {
-        this.attr = attr;
-        this.yangType = yangType;
-    }
-
-    /**
-     * Returns bits type enum file.
-     *
-     * @param attr    attribute
-     * @param type    data type
-     * @param curNode current node
-     * @throws IOException when fails to do IO operations
-     */
-    static void generateBitsFile(JavaAttributeInfo attr, YangType type,
-                                 YangNode curNode) throws IOException {
-        JavaFileInfoTranslator fileInfo = ((JavaFileInfoContainer) curNode)
-                .getJavaFileInfo();
-        String className = fileInfo.getJavaName() +
-                getCapitalCase(attr.getAttributeName());
-        JavaFileInfoTranslator attrInfo = new JavaFileInfoTranslator();
-        attrInfo.setJavaName(className);
-        attrInfo.setPackage(fileInfo.getPackage());
-        attrInfo.setBaseCodeGenPath(fileInfo.getBaseCodeGenPath());
-        attrInfo.setGeneratedFileTypes(GENERATE_ENUM_CLASS);
-        attrInfo.setPackageFilePath(fileInfo.getPackageFilePath());
-        attrInfo.setPluginConfig(fileInfo.getPluginConfig());
-        TempJavaCodeFragmentFiles codeFile = new TempJavaCodeFragmentFiles(attrInfo);
-        YangJavaEnumerationTranslator enumeration = new YangJavaEnumerationTranslator() {
-            @Override
-            public String getJavaPackage() {
-                return attr.getImportInfo().getPkgInfo();
-            }
-
-            @Override
-            public String getJavaClassNameOrBuiltInType() {
-                return className;
-            }
-
-            @Override
-            public String getJavaAttributeName() {
-                return className;
-            }
-        };
-
-        enumeration.setName(className);
-        enumeration.setJavaFileInfo(attrInfo);
-        enumeration.setTempJavaCodeFragmentFiles(codeFile);
-        YangBits yangBits = (YangBits) type.getDataTypeExtendedInfo();
-        Integer key;
-        YangBit bit;
-        String bitName;
-        for (Map.Entry<Integer, YangBit> entry : yangBits.getBitPositionMap()
-                .entrySet()) {
-            key = entry.getKey();
-            bit = entry.getValue();
-            if (bit != null) {
-                bitName = bit.getBitName();
-                createAndAddEnum(bitName, key, enumeration);
-            }
-        }
-
-        codeFile.getEnumTempFiles()
-                .addEnumAttributeToTempFiles(enumeration, fileInfo.getPluginConfig());
-        codeFile.getEnumTempFiles().setEnumClass(false);
-        codeFile.generateJavaFile(GENERATE_ENUM_CLASS, enumeration);
-    }
-
-    private static void createAndAddEnum(String name, int value,
-                                         YangEnumeration enumeration) {
-        YangEnum yangEnum = new YangEnum();
-        yangEnum.setNamedValue(name);
-        yangEnum.setValue(value);
-        try {
-            enumeration.addEnumInfo(yangEnum);
-        } catch (DataModelException e) {
-            e.printStackTrace();
-        }
-    }
-
-    /**
-     * Returns java attribute for bits.
-     *
-     * @return java attribute for bits
-     */
-    public JavaAttributeInfo getAttr() {
-        return attr;
-    }
-
-    /**
-     * Returns YANG type for bits.
-     *
-     * @return yang type for bits
-     */
-    public YangType<?> getYangType() {
-        return yangType;
-    }
-}
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
index 96db5c3..4cdf2e3 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
@@ -27,13 +27,11 @@
 import java.util.List;
 
 import static java.util.Collections.sort;
-import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getEnumJavaAttribute;
-import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.brackets;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getDefaultDefinition;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getImportString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOpenCloseParaWithValue;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.signatureClose;
-import static org.onosproject.yangutils.utils.UtilConstants.ARRAY_LIST;
 import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
 import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
 import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
@@ -168,7 +166,7 @@
             attrDef.append(attrType);
 
             // Add ending definition.
-            addAttrEndDef(annotation, attrDef, attrName);
+            addAttrEndDef(attrDef, attrName);
         }
         return attrDef.toString();
     }
@@ -207,21 +205,12 @@
     /**
      * Adds ending attribute definition.
      *
-     * @param annotation compiler annotation
-     * @param attrDef    JAVA attribute definition
-     * @param attrName   name of attribute
+     * @param attrDef  JAVA attribute definition
+     * @param attrName name of attribute
      */
-    private static void addAttrEndDef(YangCompilerAnnotation annotation,
-                                      StringBuilder attrDef, String attrName) {
-        if (annotation != null &&
-                annotation.getYangAppDataStructure() != null) {
-            attrDef.append(DIAMOND_CLOSE_BRACKET).append(SPACE)
-                    .append(attrName).append(signatureClose());
-        } else {
-            attrDef.append(DIAMOND_CLOSE_BRACKET).append(SPACE).append(attrName)
-                    .append(SPACE).append(EQUAL).append(SPACE).append(NEW)
-                    .append(SPACE).append(ARRAY_LIST).append(signatureClose());
-        }
+    private static void addAttrEndDef(StringBuilder attrDef, String attrName) {
+        attrDef.append(DIAMOND_CLOSE_BRACKET).append(SPACE)
+                .append(attrName).append(signatureClose());
     }
 
     /**
@@ -234,9 +223,8 @@
     public static String generateEnumAttributeString(String name, int value) {
         String enumName = getEnumJavaAttribute(name);
         return enumJavaDocForInnerClass(name) + EIGHT_SPACE_INDENTATION +
-                enumName.toUpperCase() + brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                                  value + EMPTY_STRING, null) +
-                COMMA + NEW_LINE;
+                enumName.toUpperCase() + getOpenCloseParaWithValue(
+                value + EMPTY_STRING) + COMMA + NEW_LINE;
     }
 
     /**
@@ -251,8 +239,8 @@
         String enumName = getEnumJavaAttribute(name);
         String str = value + COMMA + SPACE + QUOTES + name + QUOTES;
         return getJavaDoc(ENUM_ATTRIBUTE, name, false, null) +
-                FOUR_SPACE_INDENTATION + enumName.toUpperCase() + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, str, null) + COMMA + NEW_LINE;
+                FOUR_SPACE_INDENTATION + enumName.toUpperCase() +
+                getOpenCloseParaWithValue(str) + COMMA + NEW_LINE;
     }
 
     /**
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 2033d2d..ed14647 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,8 +17,8 @@
 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.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
@@ -27,7 +27,6 @@
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.YangUnion;
-import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfo;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
@@ -83,9 +82,7 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
 import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.getCurNodeAsAttributeInTarget;
-import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getQualifierInfoForCasesParent;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.isGetSetOfRootNodeRequired;
-import static org.onosproject.yangutils.translator.tojava.utils.BitsJavaInfoHandler.generateBitsFile;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getEnumsValueAttribute;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.getEventEnumTypeStart;
@@ -96,6 +93,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.getAddAugmentInfoMethodImpl;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAugmentsDataMethodForService;
@@ -125,7 +123,6 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.isLeafValueSetInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.isSelectLeafSetInterface;
-import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.processSubtreeFilteringInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.setSelectLeafSetInterface;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getInterfaceLeafIdEnumMethods;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIsSelectLeafSet;
@@ -233,6 +230,7 @@
             insertDataIntoJavaFile(file, getOperationTypeEnum());
         }
         List<String> methods = new ArrayList<>();
+
         if (attrPresent) {
             // Add getter methods to interface file.
             try {
@@ -260,18 +258,6 @@
                 !(curNode instanceof YangChoice)) {
             methods.add(getYangAugmentInfoInterface());
         }
-        if (curNode.isOpTypeReq()) {
-            if (curNode instanceof YangCase) {
-                YangNode caseParent = curNode.getParent();
-                JavaQualifiedTypeInfo qualifiedTypeInfo =
-                        getQualifierInfoForCasesParent(caseParent,
-                                                       fileInfo.getPluginConfig());
-                methods.add(processSubtreeFilteringInterface(
-                        qualifiedTypeInfo.getClassInfo()));
-            } else {
-                methods.add(processSubtreeFilteringInterface(className));
-            }
-        }
 
         if (leavesPresent) {
             methods.add(isLeafValueSetInterface());
@@ -449,6 +435,9 @@
         methods.add(((TempJavaCodeFragmentFilesContainer) curNode)
                             .getTempJavaCodeFragmentFiles()
                             .addBuildMethodImpl());
+        if (curNode instanceof YangAugment) {
+            methods.add(generateBuildMethodInAugmentClass(className));
+        }
         methods.add(addDefaultConstructor(curNode, PUBLIC, BUILDER));
 
         //Add methods in builder class.
@@ -491,9 +480,11 @@
 
         String className = getCapitalCase(fileInfo.getJavaName());
         String opParamClassName = className;
+        String name = DEFAULT_CAPS + className;
         String path;
         if (curNode instanceof RpcNotificationContainer) {
             opParamClassName = className + OP_PARAM;
+            name = opParamClassName;
             rootNode = true;
             path = fileInfo.getPluginConfig().getCodeGenDir() +
                     fileInfo.getPackageFilePath();
@@ -530,10 +521,10 @@
                     // add is filter content match.
                     augmentableSubTreeFiltering = getAugmentableSubTreeFiltering();
                 }
-                methods.add(getProcessSubtreeFilteringStart(curNode, config) +
+                methods.add(getProcessSubtreeFilteringStart(curNode) +
                                     getProcessSubtreeFunctionBody(curNode) +
                                     augmentableSubTreeFiltering +
-                                    getProcessSubTreeFilteringEnd());
+                                    getProcessSubTreeFilteringEnd(name, curNode));
 
                 if (curNode instanceof YangLeavesHolder) {
                     if (((YangLeavesHolder) curNode).getListOfLeaf() != null &&
@@ -630,11 +621,6 @@
             methods.add(getToStringMethodOpen() + getDataFromTempFileHandle(
                     TO_STRING_IMPL_MASK, getBeanFiles(curNode), path) +
                                 getToStringMethodClose());
-
-            for (BitsJavaInfoHandler handler : getBeanFiles(curNode)
-                    .getBitsHandler()) {
-                generateBitsFile(handler.getAttr(), handler.getYangType(), curNode);
-            }
         } catch (IOException e) {
             throw new IOException(getErrorMsg(className, IMPL_CLASS));
         }
@@ -707,7 +693,7 @@
                                                       getTypeFiles(curNode), path)));
 
             // To string method.
-            addTypedefToString(curNode, methods, path);
+            addTypedefToString(curNode, methods);
 
             JavaCodeGeneratorInfo javaGenInfo = (JavaCodeGeneratorInfo) curNode;
 
@@ -748,25 +734,17 @@
      *
      * @param curNode current node
      * @param methods list of methods string
-     * @param path    file path
      * @throws IOException a violation in IO rule
      */
     private static void addTypedefToString(YangNode curNode,
-                                           List<String> methods, String path)
+                                           List<String> methods)
             throws IOException {
         //To string method.
 
         List<YangType<?>> types = ((YangTypeDef) curNode).getTypeList();
         YangType type = types.get(0);
-        String className = ((JavaFileInfoContainer) curNode).getJavaFileInfo()
-                .getJavaName();
         methods.add(getToStringForType(getCamelCase(type.getDataTypeName(),
-                                                    null), type, getCapitalCase(className)));
-        for (BitsJavaInfoHandler handler : getTypeFiles(curNode)
-                .getBitsHandler()) {
-            generateBitsFile(handler.getAttr(), handler.getYangType(), curNode);
-        }
-
+                                                    null), type));
     }
 
     /**
@@ -876,12 +854,7 @@
 
             //To string method.
             methods.add(getUnionToStringMethod(
-                    ((YangUnion) curNode).getTypeList(), getCapitalCase(className)));
-
-            for (BitsJavaInfoHandler handler : getTypeFiles(curNode)
-                    .getBitsHandler()) {
-                generateBitsFile(handler.getAttr(), handler.getYangType(), curNode);
-            }
+                    ((YangUnion) curNode).getTypeList()));
 
             //From string method.
             methods.add(getFromStringMethodSignature(className) +
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
index 818351d..d69f348 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -16,12 +16,12 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
+import org.onosproject.yangutils.datamodel.InvalidOpTypeHolder;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
-import org.onosproject.yangutils.datamodel.YangNotification;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
@@ -670,7 +670,7 @@
         }
 
         YangNode node = targets.get(0).getResolvedNode();
-        if (node instanceof YangNotification) {
+        if (node instanceof InvalidOpTypeHolder) {
             return;
         }
 
@@ -829,4 +829,5 @@
         }
         return attributeType;
     }
+
 }
\ No newline at end of file
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 77bf0f2..5fc99c0 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
@@ -16,13 +16,13 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
+import org.onosproject.yangutils.datamodel.InvalidOpTypeHolder;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
 import org.onosproject.yangutils.datamodel.YangEnum;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangNode;
-import org.onosproject.yangutils.datamodel.YangNotification;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
@@ -37,7 +37,6 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET;
-import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.EIGHT_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWELVE_SPACE;
@@ -60,11 +59,13 @@
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getForLoopString;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getGreaterThanCondition;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIfConditionBegin;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getLeafFlagSetString;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getLesserThanCondition;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getListAttribute;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getNewInstance;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getNewLineAndSpace;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOmitNullValueString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOpenCloseParaWithValue;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOverRideString;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getParseFromStringMethod;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getPatternQuoteString;
@@ -75,7 +76,6 @@
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getStringBuilderAttr;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getToStringCall;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getTrySubString;
-import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getValueLeafSetString;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.ifAndAndCondition;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.ifConditionForIntInTypeDefConstructor;
 import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.ifEqualEqualCondition;
@@ -99,6 +99,7 @@
 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.CASE;
 import static org.onosproject.yangutils.utils.UtilConstants.CLASS;
 import static org.onosproject.yangutils.utils.UtilConstants.CLASS_STRING;
@@ -176,6 +177,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.STATIC;
 import static org.onosproject.yangutils.utils.UtilConstants.STRING_BUILDER_VAR;
 import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE;
+import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
 import static org.onosproject.yangutils.utils.UtilConstants.SUFFIX_S;
 import static org.onosproject.yangutils.utils.UtilConstants.SWITCH;
 import static org.onosproject.yangutils.utils.UtilConstants.THIS;
@@ -187,6 +189,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.VALIDATE_RANGE;
 import static org.onosproject.yangutils.utils.UtilConstants.VALUE;
+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.VOID;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO;
@@ -469,7 +472,8 @@
                                        PUBLIC, name, getCapitalCase(className) +
                                                BUILDER, type, CLASS_TYPE));
         if (!isTypeNull && !isList) {
-            builder.append(getValueLeafSetString(name));
+            builder.append(getLeafFlagSetString(name, VALUE_LEAF, EIGHT_SPACE_INDENTATION,
+                                                SET_METHOD_PREFIX)).append(signatureClose());
         } else {
             builder.append(EMPTY_STRING);
         }
@@ -681,7 +685,10 @@
      */
     public static String getRpcServiceMethod(String rpcName, String input,
                                              String output) {
-        String inputVal = input == null ? null : RPC_INPUT_VAR_NAME;
+        String inputVal = null;
+        if (input != null) {
+            inputVal = RPC_INPUT_VAR_NAME;
+        }
         return methodSignature(rpcName, EMPTY_STRING, null,
                                inputVal, output, input, INTERFACE_TYPE) +
                 NEW_LINE;
@@ -790,15 +797,14 @@
      * @param attr     attribute info
      * @param fromAttr attribute info for the from string wrapper
      *                 type
-     * @param name     class name
      * @return from string method's body string
      */
     public static String getFromStringMethod(JavaAttributeInfo attr,
-                                             JavaAttributeInfo fromAttr, String name) {
+                                             JavaAttributeInfo fromAttr) {
 
         return EIGHT_SPACE_INDENTATION + getTrySubString() +
                 getNewLineAndSpace(TWELVE_SPACE_INDENTATION) +
-                getParsedSubString(attr, fromAttr, name) +
+                getParsedSubString(attr, fromAttr) +
                 getReturnOfSubString() + EIGHT_SPACE_INDENTATION +
                 getCatchSubString() +
                 getNewLineAndSpace(EIGHT_SPACE_INDENTATION) +
@@ -809,11 +815,10 @@
      * Returns sub string with parsed statement for union's from string method.
      *
      * @param attr attribute info
-     * @param name class name
      * @return sub string with parsed statement for union's from string method
      */
     private static String getParsedSubString(JavaAttributeInfo attr,
-                                             JavaAttributeInfo fromStringAttr, String name) {
+                                             JavaAttributeInfo fromStringAttr) {
 
         String targetDataType = getReturnType(attr);
         YangDataTypes types = fromStringAttr.getAttributeType()
@@ -822,10 +827,10 @@
         switch (types) {
             case BITS:
                 return targetDataType + SPACE + TMP_VAL + SPACE + EQUAL +
-                        SPACE + getCapitalCase(name) + getCapitalCase(attr.getAttributeName()) +
+                        SPACE + getCapitalCase(attr.getAttributeName()) +
                         PERIOD + FROM_STRING_METHOD_NAME +
-                        brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                 FROM_STRING_PARAM_NAME, null) + signatureClose();
+                        getOpenCloseParaWithValue(FROM_STRING_PARAM_NAME) +
+                        signatureClose();
             case BINARY:
                 return method.append(targetDataType).append(SPACE).append(TMP_VAL)
                         .append(SPACE).append(EQUAL).append(SPACE).append(
@@ -835,8 +840,8 @@
                 return targetDataType + SPACE + TMP_VAL + SPACE + EQUAL +
                         SPACE + getParseFromStringMethod(
                         targetDataType, fromStringAttr.getAttributeType()) +
-                        brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                 FROM_STRING_PARAM_NAME, null) + signatureClose();
+                        getOpenCloseParaWithValue(FROM_STRING_PARAM_NAME) +
+                        signatureClose();
         }
     }
 
@@ -850,8 +855,7 @@
         StringBuilder builder = new StringBuilder();
         return builder.append(BASE64).append(PERIOD)
                 .append(GET_DECODER).append(OPEN_CLOSE_BRACKET_STRING).append(PERIOD)
-                .append(DECODE).append(brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                                var, null)).toString();
+                .append(DECODE).append(getOpenCloseParaWithValue(var)).toString();
     }
 
     /**
@@ -865,8 +869,7 @@
         return builder.append(BASE64).append(PERIOD)
                 .append(GET_ENCODER).append(OPEN_CLOSE_BRACKET_STRING)
                 .append(PERIOD).append(ENCODE_TO_STRING)
-                .append(brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, var, null))
-                .toString();
+                .append(getOpenCloseParaWithValue(var)).toString();
     }
 
     /**
@@ -1099,8 +1102,8 @@
         if (genType == GENERATE_UNION_CLASS) {
             builder.append(EIGHT_SPACE_INDENTATION).append(SET_VALUE_PARA)
                     .append(PERIOD).append(SET_METHOD_PREFIX).append(
-                    brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, count + EMPTY_STRING,
-                             null)).append(signatureClose());
+                    getOpenCloseParaWithValue(count + EMPTY_STRING))
+                    .append(signatureClose());
         }
         builder.append(methodBody(SETTER, name, null, EIGHT_SPACE_INDENTATION,
                                   EMPTY_STRING, null, false, null))
@@ -1125,8 +1128,8 @@
                                 null, type, CLASS_TYPE))
                 .append(EIGHT_SPACE_INDENTATION).append(SET_VALUE_PARA)
                 .append(PERIOD).append(SET_METHOD_PREFIX).append(
-                        brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, count + EMPTY_STRING,
-                                 null)).append(signatureClose())
+                        getOpenCloseParaWithValue(count + EMPTY_STRING))
+                .append(signatureClose())
                 .append(ifConditionForIntInTypeDefConstructor(validatorType,
                                                               addInt, attr1))
                 .append(methodBody(SETTER, attr1, null,
@@ -1252,8 +1255,8 @@
                 OF_METHOD, name + SPACE + FOR,
                 false, null));
         //Switch statement.
-        String sw = EIGHT_SPACE_INDENTATION + SWITCH + SPACE + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, VALUE, null) +
+        String sw = EIGHT_SPACE_INDENTATION + SWITCH + SPACE +
+                getOpenCloseParaWithValue(VALUE) +
                 methodSignatureClose(CLASS_TYPE);
         String str;
         switch (type) {
@@ -1336,7 +1339,7 @@
         YangNode first = targets.get(0).getResolvedNode();
         //If target path is for notification then no need to generate get/set
         // for that augment in service class.
-        if (first instanceof YangNotification) {
+        if (first instanceof InvalidOpTypeHolder) {
             return EMPTY_STRING;
         }
         YangNode augmentedNode;
@@ -1420,15 +1423,13 @@
                     .append(ifAndAndCondition(
                             //Add == condition
                             ifEqualEqualCondition(
-                                    brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                             MIN_RANGE, null), ONE),
+                                    getOpenCloseParaWithValue(MIN_RANGE), ONE),
                             var))
                     //Add compareTo string.
                     .append(getCompareToString())
                     //Add == condition.
                     .append(ifEqualEqualCondition(
-                            brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                     MAX_RANGE, null), ONE))
+                            getOpenCloseParaWithValue(MAX_RANGE), ONE))
                     .append(signatureClose());
         } else {
             builder.append(getReturnString(VALUE, EIGHT_SPACE_INDENTATION))
@@ -1523,33 +1524,6 @@
     }
 
     /**
-     * Returns is filter content match interface.
-     *
-     * @param name name of node
-     * @return is filter content match interface
-     */
-    static String processSubtreeFilteringInterface(String name) {
-        String method = "   /**\n" +
-                "     * Checks if the passed " + name +
-                " maps the content match query condition.\n" +
-                "     *\n" +
-                "     * @param " + getSmallCase(name) + SPACE +
-                getSmallCase(name) + SPACE + "being passed to check" +
-                " for" +
-                " content match\n" +
-                "     * @param isSelectAllSchemaChild is select all schema child\n" +
-                "     * @return match result\n" +
-                "     */\n";
-        LinkedHashMap<String, String> map = new LinkedHashMap<>();
-        map.put(getSmallCase(name), name);
-        map.put(SELECT_ALL_CHILD, BOOLEAN_DATA_TYPE);
-
-        return method + multiAttrMethodSignature(PROCESS_SUBTREE_FILTERING,
-                                                 EMPTY_STRING, EMPTY_STRING,
-                                                 name, map, INTERFACE_TYPE);
-    }
-
-    /**
      * Returns is value set interface.
      *
      * @return is value set interface
@@ -1650,18 +1624,16 @@
                 .append(SQUARE_BRACKETS).append(SPACE).append(BIT_NAMES_VAR)
                 .append(SPACE).append(EQUAL).append(SPACE).append(FROM_STRING_PARAM_NAME)
                 .append(PERIOD).append(TRIM_STRING).append(OPEN_CLOSE_BRACKET_STRING)
-                .append(PERIOD).append(SPLIT_STRING).append(brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, getPatternQuoteString(SPACE),
-                null)).append(signatureClose()).append(getForLoopString(
-                EIGHT_SPACE_INDENTATION, STRING_DATA_TYPE, BIT_NAME_VAR,
-                BIT_NAMES_VAR));
+                .append(PERIOD).append(SPLIT_STRING).append(getOpenCloseParaWithValue(
+                getPatternQuoteString(SPACE))).append(signatureClose()).append(
+                getForLoopString(EIGHT_SPACE_INDENTATION, STRING_DATA_TYPE, BIT_NAME_VAR,
+                                 BIT_NAMES_VAR));
 
         String small = getSmallCase(bitClassName);
-        sBuild.append(TWELVE_SPACE_INDENTATION).append(bitClassName).append
-                (SPACE).append(small).append(SPACE).append(EQUAL).append
-                (SPACE).append(bitClassName).append(PERIOD).append(OF).append
-                (brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, BIT_NAME_VAR, null))
-                .append(signatureClose());
+        sBuild.append(TWELVE_SPACE_INDENTATION).append(bitClassName).append(
+                SPACE).append(small).append(SPACE).append(EQUAL).append(
+                SPACE).append(bitClassName).append(PERIOD).append(OF).append(
+                getOpenCloseParaWithValue(BIT_NAME_VAR)).append(signatureClose());
         String condition = small + SPACE + NOT + EQUAL + SPACE + NULL;
         sBuild.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION, condition))
                 .append(TWELVE_SPACE_INDENTATION)
@@ -1680,17 +1652,15 @@
     /**
      * Returns to string method for typedef.
      *
-     * @param attr      attribute name
-     * @param className class name
+     * @param attr attribute name
      * @return to string method for typedef
      */
-    static String getToStringForType(String attr, YangType type,
-                                     String className) {
+    static String getToStringForType(String attr, YangType type) {
         StringBuilder builder = new StringBuilder(getOverRideString())
                 .append(methodSignature(TO_STRING_METHOD, null, PUBLIC, null,
                                         STRING_DATA_TYPE, null, CLASS_TYPE));
         builder.append(getReturnString(
-                getToStringForSpecialType(className, type, attr), EIGHT_SPACE_INDENTATION))
+                getToStringForSpecialType(type, attr), EIGHT_SPACE_INDENTATION))
                 .append(signatureClose()).append(methodClose(FOUR_SPACE));
         return builder.toString();
     }
@@ -1698,12 +1668,10 @@
     /**
      * Returns to string method body for type class.
      *
-     * @param className class name
-     * @param type      type of attribute
-     * @param name      @return to string method body for typedef class
+     * @param type type of attribute
+     * @param name @return to string method body for typedef class
      */
-    private static String getToStringForSpecialType(String className, YangType type,
-                                                    String name) {
+    private static String getToStringForSpecialType(YangType type, String name) {
         switch (type.getDataType()) {
             case INT8:
             case INT16:
@@ -1712,16 +1680,15 @@
             case UINT8:
             case UINT16:
             case UINT32:
-                return STRING_DATA_TYPE + PERIOD + VALUE + OF_CAPS + brackets(
-                        OPEN_CLOSE_BRACKET_WITH_VALUE, name, null);
+                return STRING_DATA_TYPE + PERIOD + VALUE + OF_CAPS +
+                        getOpenCloseParaWithValue(name);
 
             case BINARY:
                 return getToStringCall(getToStringForBinary(name));
 
             case BITS:
-                return className + getCapitalCase(name) + PERIOD +
-                        TO_STRING_METHOD + brackets(
-                        OPEN_CLOSE_BRACKET_WITH_VALUE, name, null);
+                return getCapitalCase(name) + PERIOD +
+                        TO_STRING_METHOD + getOpenCloseParaWithValue(name);
 
             case BOOLEAN:
             case EMPTY:
@@ -1733,7 +1700,7 @@
                 YangType<?> rt = lri.isInGrouping() ? null : lri
                         .getEffectiveDataType();
                 return rt == null ? getToStringCall(name) :
-                        getToStringForSpecialType(className, rt, name);
+                        getToStringForSpecialType(rt, name);
 
             case ENUMERATION:
             case INSTANCE_IDENTIFIER:
@@ -1753,10 +1720,9 @@
      * Returns union class's to string method.
      *
      * @param types list of types
-     * @param name  class name
      * @return union class's to string method
      */
-    static String getUnionToStringMethod(List<YangType<?>> types, String name) {
+    static String getUnionToStringMethod(List<YangType<?>> types) {
 
         StringBuilder builder = new StringBuilder(getOverRideString());
         builder.append(methodSignature(TO_STRING_METHOD, null, PUBLIC, null,
@@ -1765,7 +1731,7 @@
             builder.append(getIfConditionBegin(
                     EIGHT_SPACE_INDENTATION, getSetValueParaCondition(
                             types.indexOf(type)))).append(getReturnString(
-                    getToStringForSpecialType(name, type,
+                    getToStringForSpecialType(type,
                                               getCamelCase(type.getDataTypeName(), null)),
                     TWELVE_SPACE_INDENTATION))
                     .append(signatureClose()).append(methodClose(EIGHT_SPACE));
@@ -1843,4 +1809,52 @@
                 .append(signatureClose()).append(methodClose(FOUR_SPACE));
         return builder.toString();
     }
+
+    /**
+     * Returns is filter content match interface.
+     *
+     * @param name name of node
+     * @return is filter content match interface
+     */
+    static String processSubtreeFilteringInterface(String name) {
+        String method = "   /**\n" +
+                "     * Checks if the passed " + name +
+                " maps the content match query condition.\n" +
+                "     *\n" +
+                "     * @param " + getSmallCase(name) + SPACE +
+                getSmallCase(name) + SPACE + "being passed to check" +
+                " for" +
+                " content match\n" +
+                "     * @param isSelectAllSchemaChild is select all schema child\n" +
+                "     * @return match result\n" +
+                "     */\n";
+        LinkedHashMap<String, String> map = new LinkedHashMap<>();
+        map.put(getSmallCase(name), name);
+        map.put(SELECT_ALL_CHILD, BOOLEAN_DATA_TYPE);
+
+        return method + multiAttrMethodSignature(PROCESS_SUBTREE_FILTERING,
+                                                 EMPTY_STRING, EMPTY_STRING,
+                                                 name, map, INTERFACE_TYPE);
+    }
+
+    /**
+     * Returns build method for augment class.
+     *
+     * @param name class name
+     * @return build method for augment class
+     */
+    static String generateBuildMethodInAugmentClass(String name) {
+        StringBuilder builder = new StringBuilder(getJavaDoc(BUILD_METHOD,
+                                                             name, false, null));
+        String def = DEFAULT_CAPS + name;
+        builder.append(methodSignature(BUILD_FOR_FILTER, null, PUBLIC, null,
+                                       name, null, CLASS_TYPE))
+                .append(EIGHT_SPACE_INDENTATION).append(SUBTREE_FILTERED)
+                .append(SPACE).append(EQUAL).append(SPACE).append(TRUE)
+                .append(signatureClose()).append(methodBody(
+                MethodBodyTypes.BUILD, def, null, EIGHT_SPACE_INDENTATION,
+                null, null, false, null)).append(methodClose(FOUR_SPACE));
+        return builder.toString();
+    }
+
 }
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 9dfbf80..dfe2826 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
@@ -16,32 +16,30 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
+import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
+import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
+import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BOOLEAN;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DECIMAL64;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.EMPTY;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT16;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT64;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT8;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT16;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT32;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT64;
-import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT8;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE;
 import static org.onosproject.yangutils.translator.tojava.utils.BracketType.OPEN_CLOSE_BRACKET_WITH_VALUE_AND_RETURN_TYPE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getIfConditionForAddToListMethod;
+import static org.onosproject.yangutils.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getQualifiedInfo;
 import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.AND;
 import static org.onosproject.yangutils.utils.UtilConstants.APPEND;
+import static org.onosproject.yangutils.utils.UtilConstants.APP_INSTANCE;
 import static org.onosproject.yangutils.utils.UtilConstants.AT;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL;
 import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
@@ -68,6 +66,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.ELSE;
 import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
+import static org.onosproject.yangutils.utils.UtilConstants.EQUALS_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION;
 import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION_VAR;
 import static org.onosproject.yangutils.utils.UtilConstants.EXTEND;
@@ -85,6 +84,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.INTEGER_WRAPPER;
 import static org.onosproject.yangutils.utils.UtilConstants.INT_MAX_RANGE;
 import static org.onosproject.yangutils.utils.UtilConstants.INT_MIN_RANGE;
+import static org.onosproject.yangutils.utils.UtilConstants.LEAF_IDENTIFIER;
 import static org.onosproject.yangutils.utils.UtilConstants.LIST;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG;
 import static org.onosproject.yangutils.utils.UtilConstants.LONG_MAX_RANGE;
@@ -212,8 +212,8 @@
     static String getNewInstance(String returnType, String varName,
                                  String space, String value) {
         return space + returnType + SPACE + varName + SPACE + EQUAL + SPACE +
-                NEW + SPACE + returnType + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, value, null) + signatureClose();
+                NEW + SPACE + returnType + getOpenCloseParaWithValue(value) +
+                signatureClose();
     }
 
     /**
@@ -258,14 +258,16 @@
                 return TWENTY_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
                         NEW_LINE;
             case TWENTY_EIGHT_SPACE:
-                return FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                        NEW_LINE;
+                return TWENTY_SPACE_INDENTATION + EIGHT_SPACE_INDENTATION +
+                        CLOSE_CURLY_BRACKET + NEW_LINE;
             case TWENTY_FOUR_SPACE:
+                return TWENTY_SPACE_INDENTATION + FOUR_SPACE_INDENTATION +
+                        CLOSE_CURLY_BRACKET + NEW_LINE;
+            case FOUR_SPACE:
                 return FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
                         NEW_LINE;
             default:
-                return FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                        NEW_LINE;
+                return CLOSE_CURLY_BRACKET + NEW_LINE;
         }
     }
 
@@ -306,9 +308,8 @@
                 return builder.toString();
             case BUILD:
                 return getReturnString(
-                        NEW + SPACE + paraName + brackets(
-                                OPEN_CLOSE_BRACKET_WITH_VALUE, THIS, null) +
-                                signatureClose(), space);
+                        NEW + SPACE + paraName + getOpenCloseParaWithValue(
+                                THIS) + signatureClose(), space);
             case CONSTRUCTOR:
                 return space + THIS + PERIOD + paraName + SPACE +
                         EQUAL + SPACE + BUILDER_LOWER_CASE + OBJECT + PERIOD +
@@ -321,8 +322,7 @@
                 return space + getIfConditionForAddToListMethod(paraName) +
                         space + paraName +
                         brackets(OPEN_CLOSE_BRACKET, null, null) + PERIOD +
-                        ADD_STRING +
-                        brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, VALUE, null) +
+                        ADD_STRING + getOpenCloseParaWithValue(VALUE) +
                         signatureClose() + getReturnString(
                         THIS + signatureClose(), space);
             case AUGMENTED_MAP_ADD:
@@ -332,10 +332,8 @@
                         CLOSE_PARENTHESIS + signatureClose();
             case AUGMENTED_MAP_GET_VALUE:
                 return getReturnString(
-                        YANG_AUGMENTED_INFO_MAP + PERIOD + GET +
-                                brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, CLASS +
-                                        OBJECT_STRING, null) + signatureClose(),
-                        space);
+                        YANG_AUGMENTED_INFO_MAP + PERIOD + GET + getOpenCloseParaWithValue(
+                                CLASS + OBJECT_STRING) + signatureClose(), space);
             case AUGMENTED_MAP_GETTER:
                 return getReturnString(YANG_AUGMENTED_INFO_MAP +
                                                signatureClose(), space);
@@ -351,9 +349,8 @@
                 return builder.toString();
             case OF_METHOD:
                 return getReturnString(
-                        NEW + SPACE + paraName + brackets(
-                                OPEN_CLOSE_BRACKET_WITH_VALUE, VALUE, null)
-                                + signatureClose(), space);
+                        NEW + SPACE + paraName + getOpenCloseParaWithValue(
+                                VALUE) + signatureClose(), space);
             case TO_STRING:
                 return getToStringMethodsAddString(space, paraName) + paraName +
                         CLOSE_PARENTHESIS;
@@ -384,6 +381,17 @@
         return SEMI_COLON + NEW_LINE;
     }
 
+
+    /**
+     * Returns value assignment.
+     *
+     * @return value assignment
+     */
+    static String valueAssign(String param, String value, String indentation) {
+        return indentation + param + SPACE + EQUAL + SPACE + value +
+                signatureClose();
+    }
+
     /**
      * Returns method signature close for method class type.
      *
@@ -801,8 +809,7 @@
      */
     static String getReturnOfSubString() {
         return getReturnString(OF, TWELVE_SPACE_INDENTATION) +
-                brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, TMP_VAL, null) +
-                signatureClose();
+                getOpenCloseParaWithValue(TMP_VAL) + signatureClose();
     }
 
     /**
@@ -861,32 +868,11 @@
      * @return if condition's signature
      */
     static String getIfConditionBegin(String indentation, String condition) {
-        return indentation + IF + SPACE + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, condition, EMPTY_STRING) +
+        return indentation + IF + SPACE + getOpenCloseParaWithValue(condition) +
                 methodSignatureClose(CLASS_TYPE);
     }
 
     /**
-     * Returns whether the data type is of primitive data type.
-     *
-     * @param dataType data type to be checked
-     * @return true, if data type can have primitive data type, false otherwise
-     */
-    static boolean isPrimitiveDataType(YangDataTypes dataType) {
-        return dataType == INT8 ||
-                dataType == INT16 ||
-                dataType == INT32 ||
-                dataType == INT64 ||
-                dataType == UINT8 ||
-                dataType == UINT16 ||
-                dataType == UINT32 ||
-                dataType == UINT64 ||
-                dataType == DECIMAL64 ||
-                dataType == BOOLEAN ||
-                dataType == EMPTY;
-    }
-
-    /**
      * Returns list string.
      *
      * @return list string
@@ -907,12 +893,16 @@
     /**
      * Returns value leaf flag setter.
      *
-     * @param name name of leaf
+     * @param name        name of leaf
+     * @param flag        flag to set values
+     * @param indentation indentation
+     * @param prefix      prefix of method
      * @return value leaf flag setter
      */
-    static String getValueLeafSetString(String name) {
-        return "        valueLeafFlags.set(LeafIdentifier." +
-                name.toUpperCase() + ".getLeafIndex());\n";
+    static String getLeafFlagSetString(String name, String flag, String indentation, String prefix) {
+        return indentation + flag + PERIOD + prefix +
+                getOpenCloseParaWithValue(LEAF_IDENTIFIER + PERIOD + name
+                        .toUpperCase() + ".getLeafIndex()");
     }
 
     /*Provides string to return for type.*/
@@ -1115,7 +1105,7 @@
         builder.append(STRING_BUILDER).append(SPACE).append(STRING_BUILDER_VAR)
                 .append(SPACE).append(EQUAL).append(SPACE).append(NEW)
                 .append(SPACE).append(STRING_BUILDER).append(
-                brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, getQuotedString(init), null))
+                getOpenCloseParaWithValue(getQuotedString(init)))
                 .append(signatureClose());
         return builder.toString();
     }
@@ -1149,8 +1139,8 @@
      * @return pattern quote string
      */
     static String getPatternQuoteString(String type) {
-        return PATTERN + PERIOD + QUOTE_STRING + brackets(
-                OPEN_CLOSE_BRACKET_WITH_VALUE, getQuotedString(type), null);
+        return PATTERN + PERIOD + QUOTE_STRING + getOpenCloseParaWithValue(
+                getQuotedString(type));
     }
 
     /**
@@ -1190,8 +1180,8 @@
      * @return get string
      */
     static String getSetValueParaCondition(int count) {
-        return SET_VALUE_PARA + PERIOD + GET + brackets(OPEN_CLOSE_BRACKET_WITH_VALUE,
-                                                        count + EMPTY_STRING, null);
+        return SET_VALUE_PARA + PERIOD + GET + getOpenCloseParaWithValue(
+                count + EMPTY_STRING);
     }
 
     /**
@@ -1205,8 +1195,8 @@
         StringBuilder attr = new StringBuilder(EIGHT_SPACE_INDENTATION);
         String[] array = {NEW_LINE};
         attr.append(MORE_OBJ_ATTR).append(GOOGLE_MORE_OBJECT_METHOD_STATIC_STRING)
-                .append(brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, cls, null))
-                .append(NEW_LINE).append(FOUR_SPACE_INDENTATION).append(trimAtLast(
+                .append(getOpenCloseParaWithValue(cls)).append(NEW_LINE)
+                .append(FOUR_SPACE_INDENTATION).append(trimAtLast(
                 getOmitNullValueString(), array)).append(signatureClose());
         return attr.toString();
     }
@@ -1221,4 +1211,101 @@
         return name + PERIOD +
                 TO_STRING_METHOD + OPEN_CLOSE_BRACKET_STRING;
     }
+
+    /**
+     * Returns value in brackets.
+     *
+     * @param name value
+     * @return value in brackets
+     */
+    static String getOpenCloseParaWithValue(String name) {
+        return brackets(OPEN_CLOSE_BRACKET_WITH_VALUE, name, null);
+    }
+
+    /**
+     * Returns equals comparision.
+     *
+     * @param para1 param
+     * @param para2 param
+     * @return equals comparision
+     */
+    static String getTwoParaEqualsString(String para1, String para2) {
+        return para1 + PERIOD + EQUALS_STRING + getOpenCloseParaWithValue(para2);
+    }
+
+    /**
+     * Returns equal equal condition.
+     *
+     * @param para param
+     * @param val  value
+     * @return equal equal condition
+     */
+    static String getEqualEqualString(String para, String val) {
+        return para + SPACE + EQUAL + EQUAL + SPACE + val;
+    }
+
+    /**
+     * Returns app instance method call.
+     *
+     * @param name attr name
+     * @return app instance method call
+     */
+    static String getAppInstanceAttrString(String name) {
+        return APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING;
+    }
+
+    /**
+     * Returns qualified name.
+     *
+     * @param pkg package
+     * @param cls class info
+     * @return qualified name
+     */
+    static String getQualifiedString(String pkg, String cls) {
+        return pkg + PERIOD + cls;
+    }
+
+    /**
+     * Returns import list for node list.
+     *
+     * @param nodes  node list
+     * @param config plugin config
+     * @return import list
+     */
+    public static List<JavaQualifiedTypeInfoTranslator> getNodesImports(List<YangNode> nodes,
+                                                                        YangPluginConfig config) {
+        List<JavaQualifiedTypeInfoTranslator> imports = new ArrayList<>();
+        for (YangNode node : nodes) {
+            JavaQualifiedTypeInfoTranslator qInfo = getQualifiedInfo(node,
+                                                                     config);
+            imports.add(qInfo);
+        }
+        return imports;
+    }
+
+    /**
+     * Returns list of child node for choice.
+     *
+     * @param choice choice node
+     * @return list of child nodes
+     */
+    public static List<YangNode> getChoiceChildNodes(YangChoice choice) {
+        List<YangNode> childs = new ArrayList<>();
+        YangNode child = choice.getChild();
+        while (child != null) {
+            childs.add(child);
+            child = child.getNextSibling();
+        }
+
+        List<YangAugment> augments = choice.getAugmentedInfoList();
+        YangNode augmentCase;
+        for (YangAugment augment : augments) {
+            augmentCase = augment.getChild();
+            while (augmentCase != null) {
+                childs.add(augmentCase);
+                augmentCase = augmentCase.getNextSibling();
+            }
+        }
+        return childs;
+    }
 }
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 952334c..c815027 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
@@ -16,106 +16,113 @@
 
 package org.onosproject.yangutils.translator.tojava.utils;
 
+import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangAugment;
-import org.onosproject.yangutils.datamodel.YangCase;
 import org.onosproject.yangutils.datamodel.YangChoice;
 import org.onosproject.yangutils.datamodel.YangLeafRef;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
+import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
+import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getNodesPackage;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.EIGHT_SPACE;
+import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.SIXTEEN_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWELVE_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWENTY_FOUR_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWENTY_SPACE;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getAppInstanceAttrString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getChoiceChildNodes;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getCollectionIteratorForLoopBegin;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getElseIfConditionBegin;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getEqualEqualString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIfConditionBegin;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getLeafFlagSetString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOpenCloseParaWithValue;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getReturnString;
+import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getTwoParaEqualsString;
 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.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.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.CATCH;
+import static org.onosproject.yangutils.utils.UtilConstants.BUILD_FOR_FILTER;
+import static org.onosproject.yangutils.utils.UtilConstants.CHOICE_STF_METHOD_NAME;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
-import static org.onosproject.yangutils.utils.UtilConstants.COLON;
 import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
-import static org.onosproject.yangutils.utils.UtilConstants.CONTINUE;
+import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
 import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.ELSE;
+import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
 import static org.onosproject.yangutils.utils.UtilConstants.EQUALS_STRING;
-import static org.onosproject.yangutils.utils.UtilConstants.EXCEPTION_VAR;
 import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
-import static org.onosproject.yangutils.utils.UtilConstants.FOR;
 import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_CLASS;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_LEAF_INDEX;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_METHOD;
-import static org.onosproject.yangutils.utils.UtilConstants.GET_METHOD_PREFIX;
+import static org.onosproject.yangutils.utils.UtilConstants.GET;
 import static org.onosproject.yangutils.utils.UtilConstants.IF;
-import static org.onosproject.yangutils.utils.UtilConstants.ILLEGAL_ACCESS_EXCEPTION;
-import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE;
-import static org.onosproject.yangutils.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION;
-import static org.onosproject.yangutils.utils.UtilConstants.INVOKE;
+import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE_OF;
 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;
 import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yangutils.utils.UtilConstants.NOT;
-import static org.onosproject.yangutils.utils.UtilConstants.NO_SUCH_METHOD_EXCEPTION;
 import static org.onosproject.yangutils.utils.UtilConstants.NULL;
-import static org.onosproject.yangutils.utils.UtilConstants.OBJECT;
-import static org.onosproject.yangutils.utils.UtilConstants.OBJECT_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CLOSE_BRACKET_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
+import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
 import static org.onosproject.yangutils.utils.UtilConstants.OR_OPERATION;
 import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
+import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_CHILD_NODE_STF_PARAM;
 import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_SUBTREE_FILTERING;
 import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
-import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
 import static org.onosproject.yangutils.utils.UtilConstants.RETURN;
+import static org.onosproject.yangutils.utils.UtilConstants.SELECT_ALL_CHILD_SCHEMA_PARAM;
 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.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_FILTERING_RESULT_BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.THIRTY_TWO_SPACE_INDENTATION;
-import static org.onosproject.yangutils.utils.UtilConstants.THIS;
 import static org.onosproject.yangutils.utils.UtilConstants.TO;
 import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
-import static org.onosproject.yangutils.utils.UtilConstants.TRY;
 import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_EIGHT_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_FOUR_SPACE_INDENTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_SPACE_INDENTATION;
-import static org.onosproject.yangutils.utils.UtilConstants.VALUE;
 import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_LOWER_CASE;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
-import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_OP_PARAM_INFO;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
-import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getSmallCase;
 
 /**
  * Represents generator for subtree filtering methods of generated files
@@ -143,43 +150,45 @@
         String attributeName = javaAttributeInfo.getAttributeName();
         attrQualifiedType = getIfFilterContentMatchMethodImpl(attributeName,
                                                               type);
-        return EIGHT_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS
-                + VALUE_LEAF +
-                PERIOD + GET_METHOD_PREFIX + OPEN_PARENTHESIS +
-                LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase() +
-                PERIOD + GET_LEAF_INDEX + CLOSE_PARENTHESIS +
-                CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS +
-                attrQualifiedType + CLOSE_PARENTHESIS + SPACE +
-                OPEN_CURLY_BRACKET + NEW_LINE + SIXTEEN_SPACE_INDENTATION +
-                RETURN + SPACE + FALSE + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE +
-                ELSE + SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + attributeName +
-                OPEN_PARENTHESIS + APP_INSTANCE + PERIOD + attributeName +
-                OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
+        /* if (valueLeafFlags.get(LeafIdentifier.LEAF.getLeafIndex())) {
+         * if (appInstance.leaf() != leaf()) {
+         * return false;
+         * } else {
+         * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
+         * }
+         * } else if (selectLeafFlags.get(LeafIdentifier.LEAF.getLeafIndex()) ||
+         * isSelectAllSchemaChild) {
+         * isAnySelectOrContainmentNode = true;
+         * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
+         * }*/
+        return getIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
+                attributeName, VALUE_LEAF, EMPTY_STRING, GET)) +
+                getIfConditionBegin(TWELVE_SPACE_INDENTATION, attrQualifiedType) +
+                getReturnString(FALSE, SIXTEEN_SPACE_INDENTATION) +
+                signatureClose() +
+                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE + ELSE +
+                SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
+                getSubTreeBuilderCallString(SIXTEEN_SPACE_INDENTATION, attributeName,
+                                            TWELVE_SPACE) +
                 EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE + ELSE +
-                SPACE + IF + SPACE + OPEN_PARENTHESIS +
-                SELECT_LEAF +
-                PERIOD + GET_METHOD_PREFIX + OPEN_PARENTHESIS +
-                LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase() +
-                PERIOD + GET_LEAF_INDEX + CLOSE_PARENTHESIS + SPACE +
-                OR_OPERATION + SPACE + IS_SELECT_ALL_SCHEMA_CHILD_FLAG +
-                CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE +
-                TWELVE_SPACE_INDENTATION +
-                IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG + SPACE + EQUAL +
-                SPACE + TRUE + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
-                PERIOD + attributeName + OPEN_PARENTHESIS + APP_INSTANCE +
-                PERIOD + attributeName + OPEN_CLOSE_BRACKET_STRING +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+                getIfConditionBegin(SPACE, 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) +
+                getSubTreeBuilderCallString(TWELVE_SPACE_INDENTATION, attributeName,
+                                            EIGHT_SPACE);
     }
 
-    private static String getAttrTypeForFilterContentMatchWhenPrimitiveDataType(
+    private static String getSubTreeBuilderCallString(String indent, String
+            name, IndentationType type) {
+        return indent + SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + name +
+                getOpenCloseParaWithValue(APP_INSTANCE + PERIOD + name +
+                                                  OPEN_CLOSE_BRACKET_STRING) +
+                signatureClose() + methodClose(type);
+    }
+
+    private static String getAttrTypeForFcmWhenPrimitiveDataType(
             String attributeName) {
         return/* TODO: Need to check if we can expose the value leaf flag in
          interface.
@@ -194,56 +203,41 @@
                         CLOSE_PARENTHESIS;
     }
 
-    private static String
-    getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-            String attributeName) {
-        return APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS +
-                CLOSE_PARENTHESIS + SPACE + EQUAL + EQUAL + SPACE + NULL +
+    private static String attrTypeForFcmWhenNonPrimitiveDataTypes(String name) {
+        /*
+         * appInstance.name() == null || name().equals(appInstance.name())
+         */
+        return getEqualEqualString(StringGenerator.getAppInstanceAttrString(name), NULL) +
                 SPACE + OR_OPERATION + SPACE + NOT + OPEN_PARENTHESIS +
-                attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
-                PERIOD + EQUALS_STRING + OPEN_PARENTHESIS + APP_INSTANCE +
-                PERIOD + attributeName + OPEN_PARENTHESIS +
-                CLOSE_PARENTHESIS + CLOSE_PARENTHESIS + CLOSE_PARENTHESIS;
+                getTwoParaEqualsString(name + OPEN_CLOSE_BRACKET_STRING,
+                                       StringGenerator.getAppInstanceAttrString(name))
+                + CLOSE_PARENTHESIS;
     }
 
     private static String getIfFilterContentMatchMethodImpl(
-            String attributeName,
-            YangType dataType) {
+            String name, YangType dataType) {
         String attrQualifiedType;
-
-        if (StringGenerator.isPrimitiveDataType(dataType.getDataType())) {
-            attrQualifiedType =
-                    getAttrTypeForFilterContentMatchWhenPrimitiveDataType(
-                            attributeName);
+        if (dataType.getDataType().isPrimitiveDataType()) {
+            attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
         } else if (dataType.getDataType() == LEAFREF) {
 
             // When leafref in grouping.
             if (((YangLeafRef) dataType.getDataTypeExtendedInfo())
                     .isInGrouping()) {
-                attrQualifiedType =
-                        getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-                                attributeName);
+                attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
             } else {
-
                 YangType type = ((YangLeafRef) dataType.getDataTypeExtendedInfo())
                         .getEffectiveDataType();
-
-                if (StringGenerator.isPrimitiveDataType(type.getDataType())) {
-                    attrQualifiedType =
-                            getAttrTypeForFilterContentMatchWhenPrimitiveDataType(
-                                    attributeName);
+                if (type.getDataType().isPrimitiveDataType()) {
+                    attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
                 } else {
-                    attrQualifiedType =
-                            getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-                                    attributeName);
+                    attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(
+                            name);
                 }
             }
         } else {
-            attrQualifiedType =
-                    getAttrTypeForFilterContentMatchWhenNonPrimitiveDataTypes(
-                            attributeName);
+            attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
         }
-
         return attrQualifiedType;
     }
 
@@ -255,7 +249,7 @@
      */
     public static String getSubtreeFilteringForLeafList(
             JavaAttributeInfo javaAttributeInfo) {
-        return getSubtreeFilteringForList(javaAttributeInfo, true);
+        return getSubtreeFilteringForList(javaAttributeInfo, true, null);
     }
 
     /**
@@ -273,63 +267,47 @@
             throws IOException {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
         String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
-        }
 
-        String processSubtreeFilteringMethod =
-                FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
-                        SPACE + "processChildNodesSubTreeFiltering" +
-                        OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
-                        SPACE + builderNamePrefix + BUILDER + SPACE +
-                        "subTreeFilteringResultBuilder" + COMMA + NEW_LINE +
-                        TWELVE_SPACE_INDENTATION + "Boolean " +
-                        "isAnySelectOrContainmentNode, " + "boolean " +
-                        "isSelectAllSchemaChild" + CLOSE_PARENTHESIS +
-                        SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
+        Map<String, String> param = new HashMap<>();
+        param.put(PROCESS_CHILD_NODE_STF_PARAM, BOOLEAN_DATA_TYPE);
+        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);
 
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
 
-        processSubtreeFilteringMethod +=
+        String method = FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
+                SPACE + PROCESS_CHILD_NODE_STF_PARAM +
+                OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
+                SPACE + builderNamePrefix + BUILDER + SPACE +
+                STF_BUILDER_PARAM + COMMA +
+                " Boolean " +
+                "isAnySelectOrContainmentNode, " + "boolean " +
+                SELECT_ALL_CHILD_SCHEMA_PARAM + CLOSE_PARENTHESIS +
+                SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
+
+        method +=
                 getDataFromTempFileHandle(FILTER_CONTENT_MATCH_FOR_NODES_MASK,
                                           ((TempJavaCodeFragmentFilesContainer) curNode)
                                                   .getTempJavaCodeFragmentFiles()
                                                   .getBeanTempFiles(), path);
 
-        processSubtreeFilteringMethod +=
+        method +=
                 EIGHT_SPACE_INDENTATION + RETURN + SPACE + TRUE + SEMI_COLON +
                         NEW_LINE + FOUR_SPACE_INDENTATION +
                         CLOSE_CURLY_BRACKET + NEW_LINE + NEW_LINE;
+        YangNode child = curNode.getChild();
+        while (child != null) {
+            if (child instanceof YangChoice) {
+                method += getChoiceInstanceForPstMethod(child, name);
+            }
+            child = child.getNextSibling();
+        }
 
-        return processSubtreeFilteringMethod;
+        return method;
     }
 
     /**
@@ -347,51 +325,20 @@
             throws IOException {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
-        String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
-        }
 
         String processSubtreeFilteringMethod =
                 FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
                         SPACE + "processLeafListSubTreeFiltering" +
-                        OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
+                        OPEN_PARENTHESIS + name + SPACE + APP_INSTANCE + COMMA +
                         SPACE + builderNamePrefix + BUILDER + SPACE +
-                        "subTreeFilteringResultBuilder" + COMMA + NEW_LINE +
-                        TWELVE_SPACE_INDENTATION + "Boolean " +
+                        "subTreeFilteringResultBuilder" + COMMA +
+                        " Boolean " +
                         "isAnySelectOrContainmentNode, " + "boolean " +
                         "isSelectAllSchemaChild" + CLOSE_PARENTHESIS +
                         SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
 
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
-
         processSubtreeFilteringMethod += getDataFromTempFileHandle(
                 FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK,
                 ((TempJavaCodeFragmentFilesContainer) curNode)
@@ -420,51 +367,20 @@
             throws IOException {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
-        String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
-        }
 
         String processSubtreeFilteringMethod =
                 FOUR_SPACE_INDENTATION + PRIVATE + SPACE + BOOLEAN_DATA_TYPE +
                         SPACE + "processLeafSubtreeFiltering" +
-                        OPEN_PARENTHESIS + name + SPACE + instance + COMMA +
+                        OPEN_PARENTHESIS + name + SPACE + APP_INSTANCE + COMMA +
                         SPACE + builderNamePrefix + BUILDER + SPACE +
-                        "subTreeFilteringResultBuilder" + COMMA + NEW_LINE
-                        + TWELVE_SPACE_INDENTATION + "Boolean " +
+                        "subTreeFilteringResultBuilder" + COMMA +
+                        " Boolean " +
                         "isAnySelectOrContainmentNode, " + "boolean " +
                         "isSelectAllSchemaChild" + CLOSE_PARENTHESIS +
                         SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
 
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
-
         processSubtreeFilteringMethod +=
                 getDataFromTempFileHandle(FILTER_CONTENT_MATCH_FOR_LEAF_MASK,
                                           ((TempJavaCodeFragmentFilesContainer) curNode)
@@ -482,40 +398,34 @@
     /**
      * Returns is filter content match for leaf.
      *
-     * @param curNode      current node
-     * @param pluginConfig plugin configurations
+     * @param curNode current node
      * @return is filter content match for leaf
      */
-    static String getProcessSubtreeFilteringStart(YangNode curNode,
-                                                  YangPluginConfig
-                                                          pluginConfig) {
+    static String getProcessSubtreeFilteringStart(YangNode curNode) {
         JavaFileInfoTranslator javaFileInfo =
                 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfoTranslator parentInfo;
-
         String instance = APP_INSTANCE;
         String name = getCapitalCase(javaFileInfo.getJavaName());
         String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        if (curNode instanceof YangCase) {
-            instance = INSTANCE;
-            YangNode parent = curNode.getParent();
-            if (parent instanceof YangChoice) {
-                parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
-                name = getCapitalCase(parentInfo.getJavaName());
-            } else if (parent instanceof YangAugment) {
-                parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
-                        .getAugmentedNode()).getJavaFileInfo();
-                if (parentInfo != null) {
-                    name = getCapitalCase(parentInfo.getJavaName());
-                } else {
-                    name = getCapitalCase(getCamelCase(
-                            ((YangAugment) parent).getAugmentedNode().getName(),
-                            pluginConfig.getConflictResolver()));
-                }
-            }
+        if (curNode instanceof RpcNotificationContainer) {
+            name = getCapitalCase(javaFileInfo.getJavaName()) + OP_PARAM;
+        } else {
+            name = DEFAULT_CAPS + name;
         }
+        String javadoc = "   /**\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" +
+                "     * @return match result\n" +
+                "     */\n";
+
         String processSubtreeFilteringMethod =
-                StringGenerator.getOverRideString() + FOUR_SPACE_INDENTATION +
+                javadoc + FOUR_SPACE_INDENTATION +
                         PUBLIC + SPACE + name + SPACE +
                         PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + name +
                         SPACE + instance + COMMA + SPACE + BOOLEAN_DATA_TYPE +
@@ -529,17 +439,6 @@
                         NEW_LINE + EIGHT_SPACE_INDENTATION + "Boolean" + SPACE +
                         IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG + SPACE +
                         EQUAL + SPACE + FALSE + SEMI_COLON + NEW_LINE;
-
-        if (curNode instanceof YangCase) {
-            String caseName = getCapitalCase(javaFileInfo.getJavaName());
-            processSubtreeFilteringMethod =
-                    processSubtreeFilteringMethod + EIGHT_SPACE_INDENTATION +
-                            caseName + SPACE + APP_INSTANCE + SPACE +
-                            EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                            CLOSE_PARENTHESIS + SPACE + instance +
-                            SEMI_COLON + NEW_LINE;
-        }
-
         return processSubtreeFilteringMethod;
     }
 
@@ -557,11 +456,10 @@
             if (((YangLeavesHolder) curNode).getListOfLeaf() != null
                     &&
                     !((YangLeavesHolder) curNode).getListOfLeaf().isEmpty()) {
-                method += StringGenerator
-                        .getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
+                method +=
+                        getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
                                 "processLeafSubtreeFiltering(appInstance, " +
-                                "subTreeFilteringResultBuilder," + NEW_LINE +
-                                TWELVE_SPACE_INDENTATION +
+                                "subTreeFilteringResultBuilder, " +
                                 "isAnySelectOrContainmentNode, " +
                                 "isSelectAllSchemaChild)");
 
@@ -577,11 +475,10 @@
                     &&
                     !((YangLeavesHolder) curNode).getListOfLeafList()
                             .isEmpty()) {
-                method += StringGenerator
-                        .getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
+                method +=
+                        getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
                                 "processLeafListSubTreeFiltering(appInstance," +
-                                " subTreeFilteringResultBuilder," + NEW_LINE
-                                + TWELVE_SPACE_INDENTATION +
+                                " subTreeFilteringResultBuilder, " +
                                 "isAnySelectOrContainmentNode, " +
                                 "isSelectAllSchemaChild)");
 
@@ -594,11 +491,10 @@
 
         if (curNode.getChild() != null) {
 
-            method += StringGenerator
-                    .getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
+            method +=
+                    getIfConditionBegin(EIGHT_SPACE_INDENTATION, NOT +
                             "processChildNodesSubTreeFiltering(appInstance, " +
-                            "subTreeFilteringResultBuilder," + NEW_LINE +
-                            TWELVE_SPACE_INDENTATION +
+                            "subTreeFilteringResultBuilder, " +
                             "isAnySelectOrContainmentNode, " +
                             "isSelectAllSchemaChild)");
 
@@ -615,29 +511,32 @@
      * Returns is filter content match for node.
      *
      * @param attr attribute info
+     * @param node YANG node
      * @return is filter content match for node
      */
-    public static String getSubtreeFilteringForNode(JavaAttributeInfo attr) {
+    public static String getSubtreeFilteringForNode(JavaAttributeInfo attr,
+                                                    YangNode node) {
         boolean isList = attr.isListAttr();
         if (isList) {
-            return getSubtreeFilteringForList(attr, false);
+            return getSubtreeFilteringForList(attr, false, node);
         } else {
-            return getSubtreeFilteringForChildNode(attr);
+            return getSubtreeFilteringForChildNode(attr, node);
         }
     }
 
     /**
      * Returns is filter content match close.
      *
+     * @param name    name of class
+     * @param curNode current node
      * @return is filter content match close
      */
-    static String getProcessSubTreeFilteringEnd() {
-        String method = StringGenerator
-                .getIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                     NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG +
-                                             SPACE + AND_OPERATION + SPACE +
-                                             NOT +
-                                             IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG);
+    static String getProcessSubTreeFilteringEnd(String name, YangNode curNode) {
+        String method = getIfConditionBegin(EIGHT_SPACE_INDENTATION,
+                                            NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG +
+                                                    SPACE + AND_OPERATION + SPACE +
+                                                    NOT +
+                                                    IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG);
 
         method += TWELVE_SPACE_INDENTATION + RETURN + SPACE +
                 PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + APP_INSTANCE +
@@ -645,9 +544,13 @@
                 NEW_LINE;
 
         method += methodClose(EIGHT_SPACE);
-
-        method += EIGHT_SPACE_INDENTATION + RETURN + SPACE +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + BUILD +
+        String build = BUILD;
+        if (curNode instanceof YangAugment) {
+            build = BUILD_FOR_FILTER;
+        }
+        method += EIGHT_SPACE_INDENTATION + RETURN + SPACE + getOpenCloseParaWithValue(
+                name) + SPACE +
+                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + build +
                 OPEN_CLOSE_BRACKET_STRING + SEMI_COLON + NEW_LINE +
                 FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
 
@@ -658,21 +561,37 @@
      * Returns filter content match for child nodes.
      *
      * @param javaAttributeInfo attribute to be added
+     * @param node              YANG node
      * @return filter content match for child nodes
      */
     private static String getSubtreeFilteringForChildNode(
-            JavaAttributeInfo javaAttributeInfo) {
+            JavaAttributeInfo javaAttributeInfo, YangNode node) {
         String name = javaAttributeInfo.getAttributeName();
-        name = getSmallCase(name);
-        String type = javaAttributeInfo.getImportInfo().getClassInfo();
+        String clsInfo = javaAttributeInfo.getImportInfo()
+                .getClassInfo();
+        String type = DEFAULT_CAPS + javaAttributeInfo.getImportInfo()
+                .getClassInfo();
         if (javaAttributeInfo.isQualifiedName()) {
             type = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
                     type;
+            clsInfo = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
+                    clsInfo;
         }
+        String classCast = getOpenCloseParaWithValue(type) + SPACE;
+        String cast = getOpenCloseParaWithValue(classCast + name);
+        String resultString = cast +
+                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
+                + classCast +
+                APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
+                + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
+                NEW_LINE;
 
-        String method = StringGenerator
-                .getIfConditionBegin(EIGHT_SPACE_INDENTATION, name + "()  != " +
-                        "null");
+        if (node != null && node instanceof YangChoice) {
+            resultString = getReturnStringInCaseOfChoice(node);
+        }
+        String method =
+                getIfConditionBegin(EIGHT_SPACE_INDENTATION, name + "() != " +
+                        "null  || isSelectAllSchemaChild");
 
         method += TWELVE_SPACE_INDENTATION +
                 IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG + SPACE + EQUAL + SPACE +
@@ -684,11 +603,24 @@
                 + EQUAL + SPACE + NULL + CLOSE_PARENTHESIS + SPACE +
                 OPEN_CURLY_BRACKET + NEW_LINE;
 
-        method += SIXTEEN_SPACE_INDENTATION + type + SPACE + "result = " +
-                name + PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
-                APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
-                + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
-                NEW_LINE;
+        method += SIXTEEN_SPACE_INDENTATION + clsInfo + SPACE + "result" +
+                SEMI_COLON + NEW_LINE;
+
+        method +=
+                getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                    "isSelectAllSchemaChild");
+
+        method += TWENTY_SPACE_INDENTATION + "result" + SPACE + EQUAL + SPACE +
+                APP_INSTANCE + PERIOD + name + OPEN_PARENTHESIS +
+                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE;
+
+        method += SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + SPACE +
+                ELSE + SPACE +
+                OPEN_CURLY_BRACKET + NEW_LINE;
+
+        method += TWENTY_SPACE_INDENTATION + "result = " + resultString;
+
+        method += SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
 
         method += SIXTEEN_SPACE_INDENTATION + "if (result != null) {" +
                 NEW_LINE;
@@ -712,32 +644,48 @@
      *
      * @param javaAttributeInfo attribute information
      * @param isLeafList        if for leaf list
+     * @param node              YANG node
      * @return filter content match for list types
      */
     private static String getSubtreeFilteringForList(
-            JavaAttributeInfo javaAttributeInfo, boolean isLeafList) {
+            JavaAttributeInfo javaAttributeInfo, boolean isLeafList,
+            YangNode node) {
         String capitalCaseName =
                 getCapitalCase(javaAttributeInfo.getAttributeName());
         String name = javaAttributeInfo.getAttributeName();
-        String type = javaAttributeInfo.getImportInfo().getClassInfo();
+        String type = javaAttributeInfo.getImportInfo()
+                .getClassInfo();
+        String clsInfo = DEFAULT_CAPS + type;
         if (javaAttributeInfo.isQualifiedName()) {
             type = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
                     type;
+            clsInfo = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
+                    clsInfo;
+        }
+
+        String classCast = getOpenCloseParaWithValue(clsInfo) + SPACE;
+        String cast = getOpenCloseParaWithValue(classCast + name);
+        String resultString = cast + PERIOD +
+                PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + classCast +
+                name + "2" + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
+                NEW_LINE;
+
+        if (node != null && node instanceof YangChoice) {
+            resultString = getReturnStringInCaseOfChoice(node);
         }
 
         /*
          * If select all schema child
          */
-        String method = StringGenerator
-                .getIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                     IS_SELECT_ALL_SCHEMA_CHILD_FLAG);
+        String method =
+                getIfConditionBegin(EIGHT_SPACE_INDENTATION,
+                                    IS_SELECT_ALL_SCHEMA_CHILD_FLAG);
 
-        method = method + StringGenerator
-                .getCollectionIteratorForLoopBegin(TWELVE_SPACE_INDENTATION,
-                                                   type + SPACE + name,
-                                                   APP_INSTANCE + PERIOD +
-                                                           name +
-                                                           OPEN_CLOSE_BRACKET_STRING);
+        method = method + getCollectionIteratorForLoopBegin(TWELVE_SPACE_INDENTATION,
+                                                            type + SPACE + name,
+                                                            APP_INSTANCE + PERIOD +
+                                                                    name +
+                                                                    OPEN_CLOSE_BRACKET_STRING);
 
         method = method + SIXTEEN_SPACE_INDENTATION +
                 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
@@ -747,11 +695,10 @@
         method += methodClose(TWELVE_SPACE); // Close collection Iteration loop
 
         //If need to explicitly participate in query
-        method += StringGenerator
-                .getElseIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                         name + OPEN_CLOSE_BRACKET_STRING +
-                                                 SPACE + NOT + EQUAL +
-                                                 SPACE + NULL);
+        method += getElseIfConditionBegin(EIGHT_SPACE_INDENTATION,
+                                          name + OPEN_CLOSE_BRACKET_STRING +
+                                                  SPACE + NOT + EQUAL +
+                                                  SPACE + NULL);
 
         if (!isLeafList) {
             method += TWELVE_SPACE_INDENTATION +
@@ -760,24 +707,24 @@
         }
 
         //If there is any parameter in the query condition
-        method += StringGenerator
-                .getIfConditionBegin(TWELVE_SPACE_INDENTATION, NOT + name +
+        method +=
+                getIfConditionBegin(TWELVE_SPACE_INDENTATION, NOT + name +
                         OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY);
 
         if (isLeafList) {
             /*
              * If there is no app instance to perform content match
              */
-            method += StringGenerator
-                    .getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                         APP_INSTANCE + PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 SPACE + EQUAL + EQUAL + SPACE +
-                                                 NULL + SPACE + OR_OPERATION
-                                                 + SPACE + APP_INSTANCE +
-                                                 PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 PERIOD + IS_EMPTY);
+            method +=
+                    getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                        APP_INSTANCE + PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                SPACE + EQUAL + EQUAL + SPACE +
+                                                NULL + SPACE + OR_OPERATION
+                                                + SPACE + APP_INSTANCE +
+                                                PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                PERIOD + IS_EMPTY);
 
             method += TWENTY_SPACE_INDENTATION + RETURN + SPACE + FALSE +
                     SEMI_COLON + NEW_LINE;
@@ -785,7 +732,7 @@
             method += methodClose(SIXTEEN_SPACE);
 
             // for instance iterator
-            method += StringGenerator.getCollectionIteratorForLoopBegin(
+            method += getCollectionIteratorForLoopBegin(
                     SIXTEEN_SPACE_INDENTATION, type + SPACE + name,
                     name + OPEN_CLOSE_BRACKET_STRING);
 
@@ -794,20 +741,20 @@
                     NEW_LINE;
 
             // for app instance iterator
-            method += StringGenerator
-                    .getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
-                                                       type + SPACE + name +
-                                                               "2",
-                                                       APP_INSTANCE + PERIOD +
-                                                               name +
-                                                               OPEN_CLOSE_BRACKET_STRING);
+            method +=
+                    getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
+                                                      type + SPACE + name +
+                                                              "2",
+                                                      APP_INSTANCE + PERIOD +
+                                                              name +
+                                                              OPEN_CLOSE_BRACKET_STRING);
 
             //the content match leaf list attribute value matches
-            method += StringGenerator
-                    .getIfConditionBegin(TWENTY_FOUR_SPACE_INDENTATION,
-                                         name + PERIOD + EQUALS_STRING
-                                                 + OPEN_PARENTHESIS + name +
-                                                 "2" + CLOSE_PARENTHESIS);
+            method +=
+                    getIfConditionBegin(TWENTY_FOUR_SPACE_INDENTATION,
+                                        name + PERIOD + EQUALS_STRING
+                                                + OPEN_PARENTHESIS + name +
+                                                "2" + CLOSE_PARENTHESIS);
 
             method += TWENTY_EIGHT_SPACE_INDENTATION + "flag" + SPACE + EQUAL +
                     SPACE + TRUE + SEMI_COLON + NEW_LINE;
@@ -826,8 +773,8 @@
             method += methodClose(TWENTY_SPACE);
 
             //if the content match failed
-            method += StringGenerator
-                    .getIfConditionBegin(TWENTY_SPACE_INDENTATION, "!flag");
+            method +=
+                    getIfConditionBegin(TWENTY_SPACE_INDENTATION, "!flag");
 
             method += TWENTY_FOUR_SPACE_INDENTATION + RETURN + SPACE + FALSE +
                     SEMI_COLON + NEW_LINE;
@@ -839,37 +786,34 @@
         } else {
 
             /*if there is any app instance entry*/
-            method += StringGenerator
-                    .getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                         APP_INSTANCE + PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 SPACE + NOT + EQUAL + SPACE +
-                                                 NULL + SPACE + AND_OPERATION +
-                                                 SPACE + NOT + APP_INSTANCE +
-                                                 PERIOD + name +
-                                                 OPEN_CLOSE_BRACKET_STRING +
-                                                 PERIOD + IS_EMPTY);
+            method +=
+                    getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                        APP_INSTANCE + PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                SPACE + NOT + EQUAL + SPACE +
+                                                NULL + SPACE + AND_OPERATION +
+                                                SPACE + NOT + APP_INSTANCE +
+                                                PERIOD + name +
+                                                OPEN_CLOSE_BRACKET_STRING +
+                                                PERIOD + IS_EMPTY);
 
             /*
              * loop all the query condition instance(s)
              */
-            method += StringGenerator
-                    .getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
-                                                       type + SPACE + name,
-                                                       name +
-                                                               OPEN_CLOSE_BRACKET_STRING);
+            method +=
+                    getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
+                                                      type + SPACE + name,
+                                                      name +
+                                                              OPEN_CLOSE_BRACKET_STRING);
 
             //loop all the app instance(s)
-            method += StringGenerator.getCollectionIteratorForLoopBegin(
+            method += getCollectionIteratorForLoopBegin(
                     TWENTY_FOUR_SPACE_INDENTATION, type + SPACE + name + "2",
                     APP_INSTANCE + PERIOD + name +
                             OPEN_CLOSE_BRACKET_STRING);
 
             method += TWENTY_EIGHT_SPACE_INDENTATION + type + SPACE +
-                    "result = " + name + PERIOD +
-                    PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS + name + "2" +
-                    COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
-                    NEW_LINE;
+                    "result = " + resultString;
 
             method += TWENTY_EIGHT_SPACE_INDENTATION + "if (result != null) {" +
                     NEW_LINE;
@@ -900,23 +844,23 @@
                     EQUAL + SPACE + TRUE + SEMI_COLON + NEW_LINE;
         }
 
-        method += StringGenerator
-                .getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                     APP_INSTANCE + PERIOD + name
-                                             + OPEN_CLOSE_BRACKET_STRING +
-                                             SPACE + NOT + EQUAL + SPACE +
-                                             NULL + SPACE + AND_OPERATION +
-                                             SPACE + NOT + APP_INSTANCE +
-                                             PERIOD + name +
-                                             OPEN_CLOSE_BRACKET_STRING +
-                                             PERIOD + IS_EMPTY);
+        method +=
+                getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
+                                    APP_INSTANCE + PERIOD + name
+                                            + OPEN_CLOSE_BRACKET_STRING +
+                                            SPACE + NOT + EQUAL + SPACE +
+                                            NULL + SPACE + AND_OPERATION +
+                                            SPACE + NOT + APP_INSTANCE +
+                                            PERIOD + name +
+                                            OPEN_CLOSE_BRACKET_STRING +
+                                            PERIOD + IS_EMPTY);
 
-        method = method + StringGenerator
-                .getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
-                                                   type + SPACE + name,
-                                                   APP_INSTANCE + PERIOD +
-                                                           name +
-                                                           OPEN_CLOSE_BRACKET_STRING);
+        method = method +
+                getCollectionIteratorForLoopBegin(TWENTY_SPACE_INDENTATION,
+                                                  type + SPACE + name,
+                                                  APP_INSTANCE + PERIOD +
+                                                          name +
+                                                          OPEN_CLOSE_BRACKET_STRING);
 
         method = method + TWENTY_FOUR_SPACE_INDENTATION +
                 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING
@@ -938,55 +882,132 @@
 
     //Returns method string for op params augmented syntax
     static String getAugmentableSubTreeFiltering() {
-        return EIGHT_SPACE_INDENTATION + FOR + SPACE + OPEN_PARENTHESIS +
-                OBJECT_STRING + SPACE + YANG_AUGMENTED_INFO_LOWER_CASE +
-                SPACE + COLON + SPACE + THIS + PERIOD +
-                YANG_AUGMENTED_INFO_MAP +
-                OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD
-                + VALUE + "s" + OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
-                CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET +
-                NEW_LINE + TWELVE_SPACE_INDENTATION + OBJECT_STRING + SPACE +
-                getSmallCase(YANG_AUGMENTED_OP_PARAM_INFO) + SPACE + EQUAL +
-                SPACE + APP_INSTANCE + PERIOD +
-                YANG_AUGMENTED_INFO_LOWER_CASE + OPEN_PARENTHESIS +
-                YANG_AUGMENTED_INFO_LOWER_CASE + PERIOD +
-                GET_CLASS + CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + OBJECT + SPACE +
-                PROCESS_SUBTREE_FILTERING + SEMI_COLON
-                + NEW_LINE + TWELVE_SPACE_INDENTATION + TRY + SPACE +
-                OPEN_CURLY_BRACKET + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION +
-                "Class<?>[] interfaces = " + YANG_AUGMENTED_INFO_LOWER_CASE +
-                ".getClass().getInterfaces();" +
-                NEW_LINE + SIXTEEN_SPACE_INDENTATION +
-                PROCESS_SUBTREE_FILTERING + SPACE + EQUAL + SPACE +
-                YANG_AUGMENTED_INFO_LOWER_CASE + PERIOD + GET_CLASS +
-                NEW_LINE + TWENTY_SPACE_INDENTATION + PERIOD +
-                GET_METHOD + OPEN_PARENTHESIS + QUOTES +
-                PROCESS_SUBTREE_FILTERING + QUOTES + COMMA + SPACE +
-                "interfaces[0]" + CLOSE_PARENTHESIS + PERIOD + INVOKE +
-                OPEN_PARENTHESIS + YANG_AUGMENTED_INFO_LOWER_CASE +
-                COMMA + NEW_LINE + TWENTY_FOUR_SPACE_INDENTATION +
-                getSmallCase(YANG_AUGMENTED_OP_PARAM_INFO) +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS +
-                PROCESS_SUBTREE_FILTERING + SPACE + NOT + EQUAL + SPACE +
-                NULL + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET +
-                NEW_LINE + TWENTY_SPACE_INDENTATION +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + "add" +
-                YANG_AUGMENTED_INFO + OPEN_PARENTHESIS +
-                PROCESS_SUBTREE_FILTERING + COMMA + SPACE +
-                PROCESS_SUBTREE_FILTERING + PERIOD + GET_CLASS +
-                CLOSE_PARENTHESIS + SEMI_COLON + NEW_LINE +
-                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                NEW_LINE + TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET +
-                SPACE + CATCH + SPACE + OPEN_PARENTHESIS +
-                NO_SUCH_METHOD_EXCEPTION + " | " +
-                INVOCATION_TARGET_EXCEPTION + " | " + ILLEGAL_ACCESS_EXCEPTION +
-                SPACE + EXCEPTION_VAR + CLOSE_PARENTHESIS + SPACE +
-                OPEN_CURLY_BRACKET + NEW_LINE + SIXTEEN_SPACE_INDENTATION +
-                CONTINUE + SEMI_COLON + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
-                EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+        return "        for (Object augmentInfo : this.yangAugmentedInfoMap()" +
+                ".values()) {\n" +
+                "            Object appInstanceInfo = appInstance.yangAugmentedInfo(" +
+                "augmentInfo.getClass());\n" +
+                "            if (appInstanceInfo == null) {\n" +
+                "                subTreeFilteringResultBuilder.addYangAugmentedInfo(" +
+                "augmentInfo, augmentInfo.getClass());\n" +
+                "            } else {\n" +
+                "                Object processSubtreeFiltering;\n" +
+                "                try {\n" +
+                "                    Class<?> augmentedClass = augmentInfo" +
+                ".getClass();\n" +
+                "                    processSubtreeFiltering = augmentInfo.getClass()" +
+                ".getMethod(\"processSubtreeFiltering\", augmentedClass).invoke(" +
+                "augmentInfo, appInstanceInfo);\n" +
+                "                    if (processSubtreeFiltering != null) {\n" +
+                "                        subTreeFilteringResultBuilder" +
+                ".addYangAugmentedInfo(processSubtreeFiltering, processSubtreeFiltering.getClass());\n" +
+                "                    }\n" +
+                "                } catch (NoSuchMethodException |" +
+                " InvocationTargetException | IllegalAccessException e) {\n" +
+                "                    continue;\n" +
+                "                }\n" +
+                "            }\n" +
+                "        }\n";
     }
+
+    private static String getMethodBodyForChoicePstMethod(
+            YangNode node, YangPluginConfig config, YangNode choiceParent,
+            String choice) {
+        StringBuilder builder = new StringBuilder();
+        JavaCodeGeneratorInfo info = (JavaCodeGeneratorInfo) choiceParent;
+        JavaFileInfoTranslator pInfo = info.getJavaFileInfo();
+
+        JavaQualifiedTypeInfoTranslator qInfo = getQualifiedInfo(node, config);
+
+        String castVar = qInfo.getClassInfo();
+        boolean qualify = info.getTempJavaCodeFragmentFiles().getBeanTempFiles()
+                .getJavaImportData().addImportInfo(qInfo, pInfo.getJavaName(),
+                                                   pInfo.getPackage());
+        if (qualify) {
+            castVar = StringGenerator.getQualifiedString(qInfo.getPkgInfo(),
+                                                         qInfo.getClassInfo());
+        }
+        String classCast = getOpenCloseParaWithValue(castVar) + SPACE;
+        String cast = getOpenCloseParaWithValue(classCast + choice);
+        String retString = cast + PERIOD + PROCESS_SUBTREE_FILTERING +
+                getOpenCloseParaWithValue(classCast + getAppInstanceAttrString
+                        (choice) + COMMA + SPACE + FALSE);
+        String cond = choice + INSTANCE_OF + castVar;
+        builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond))
+                .append(getReturnString(retString, TWELVE_SPACE_INDENTATION))
+                .append(signatureClose()).append(methodClose(EIGHT_SPACE));
+        return builder.toString();
+    }
+
+    /**
+     * Returns choice instance for PST method.
+     *
+     * @param choice    choice node
+     * @param className class name
+     * @return choice instance for pst method
+     */
+    private static String getChoiceInstanceForPstMethod(YangNode choice,
+                                                        String className) {
+        /*
+         * private Choice1 getChoice1ResultOfProcessSubTree(Choice1 choice1, Test appInstance) {
+         *     if (choice1 instanceof DefaultCase1) {
+         *         return ((DefaultCase1) choice1).processSubtreeFiltering(
+         *          appInstance.choice1(), false);
+         * }
+         * return null;
+         * }
+         */
+
+        JavaFileInfoTranslator info = ((JavaFileInfoContainer) choice).getJavaFileInfo();
+        String name = info.getJavaName();
+        String caps = getCapitalCase(name);
+        StringBuilder builder = new StringBuilder();
+        String methodName = caps + CHOICE_STF_METHOD_NAME;
+        Map<String, String> param = new LinkedHashMap<>();
+        param.put(name, caps);
+        param.put(APP_INSTANCE, className);
+
+        builder.append(multiAttrMethodSignature(methodName, GET, PRIVATE, caps,
+                                                param, CLASS_TYPE));
+
+        for (YangNode cases : getChoiceChildNodes((YangChoice) choice)) {
+            builder.append(getMethodBodyForChoicePstMethod(cases, info.getPluginConfig(),
+                                                           choice.getParent(), name));
+        }
+        builder.append(getReturnString(NULL, FOUR_SPACE_INDENTATION))
+                .append(signatureClose()).append(methodClose(FOUR_SPACE));
+        return builder.toString();
+    }
+
+    private static String getReturnStringInCaseOfChoice(YangNode choice) {
+        JavaFileInfoTranslator info = ((JavaFileInfoContainer) choice)
+                .getJavaFileInfo();
+        String name = info.getJavaName();
+        String caps = getCapitalCase(name);
+        String methodName = caps + CHOICE_STF_METHOD_NAME;
+        return GET + methodName + getOpenCloseParaWithValue(
+                name + COMMA + SPACE + APP_INSTANCE) + signatureClose();
+    }
+
+    static JavaQualifiedTypeInfoTranslator getQualifiedInfo(
+            YangNode node, YangPluginConfig config) {
+        JavaFileInfoTranslator fileInfo = ((JavaCodeGeneratorInfo) node)
+                .getJavaFileInfo();
+        String name = fileInfo.getJavaName();
+        String pkg = fileInfo.getPackage();
+        if (config == null) {
+            config = new YangPluginConfig();
+        }
+        if (name == null) {
+            name = getCamelCase(node.getName(), config.getConflictResolver());
+            pkg = getNodesPackage(node, config);
+        }
+
+        name = DEFAULT_CAPS + getCapitalCase(name);
+        JavaQualifiedTypeInfoTranslator qInfo = new
+                JavaQualifiedTypeInfoTranslator();
+        qInfo.setClassInfo(name);
+        qInfo.setPkgInfo(pkg);
+        return qInfo;
+    }
+
 }
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 48ea81d..e660573 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -1139,6 +1139,11 @@
     public static final String BIT_SET = "BitSet";
 
     /**
+     * Flag for subtree filtering in augment.
+     */
+    public static final String SUBTREE_FILTERED = "isSubTreeFiltered";
+
+    /**
      * Augment map type.
      */
     public static final String AUGMENT_MAP_TYPE = "Map<Class<?>, Object>";
@@ -1411,6 +1416,11 @@
     public static final String BUILD = "build";
 
     /**
+     * Static attribute for build for filter in augment method syntax.
+     */
+    public static final String BUILD_FOR_FILTER = "buildForFilter";
+
+    /**
      * Static attribute for object.
      */
     public static final String OBJECT = "Object";
@@ -1868,6 +1878,13 @@
             "notification/grouping for path: ";
 
     /**
+     * Static attribute for error msg.
+     */
+    public static final String VERSION_ERROR = "Onos-yang-tools " +
+            "does not support maven version below \"3.3.9\" , your current " +
+            "version is ";
+
+    /**
      * Static attribute for in.
      */
     public static final String IN = " in ";
@@ -1877,6 +1894,34 @@
      */
     public static final String AT = " at ";
 
+    /**
+     * Static param for processChildNodesSubTreeFiltering.
+     */
+    public static final String PROCESS_CHILD_NODE_STF_PARAM =
+            "processChildNodesSubTreeFiltering";
+    /**
+     * Static param for subTreeFilteringResultBuilder.
+     */
+    public static final String STF_BUILDER_PARAM =
+            "subTreeFilteringResultBuilder";
+
+    /**
+     * Static param for isAnySelectOrContainmentNode.
+     */
+    public static final String SELECT_OR_CONTAINMENT_NODE_PARAM =
+            "isAnySelectOrContainmentNode";
+    /**
+     * Static param for isSelectAllSchemaChild.
+     */
+    public static final String SELECT_ALL_CHILD_SCHEMA_PARAM =
+            "isSelectAllSchemaChild";
+
+    /**
+     * Static param for ResultOfProcessSubTree.
+     */
+    public static final String CHOICE_STF_METHOD_NAME =
+            "ResultOfProcessSubTree";
+
     // No instantiation.
     private UtilConstants() {
     }
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/YangPluginConfig.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/YangPluginConfig.java
index e212832..86e4500 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/YangPluginConfig.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/YangPluginConfig.java
@@ -16,6 +16,16 @@
 
 package org.onosproject.yangutils.utils.io;
 
+import javax.tools.JavaCompiler;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.ToolProvider;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.onosproject.yangutils.utils.io.impl.YangFileScanner.getJavaFiles;
+
 /**
  * Representation of plugin configurations required for YANG utils.
  */
@@ -96,4 +106,31 @@
         return conflictResolver;
     }
 
+    /**
+     * Compiles the generated code for unit tests.
+     *
+     * @param dir1 directory path
+     * @throws IOException when generated code has compilation errors.
+     */
+    @SuppressWarnings("unchecked")
+    public static void compileCode(String dir1) throws IOException {
+        String classpath = System.getProperty("java.class.path");
+        List<String> optionList = new ArrayList<>();
+        optionList.addAll(Arrays.asList("-classpath", classpath));
+
+        List<String> files = getJavaFiles(dir1);
+        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+        StandardJavaFileManager manager = compiler.getStandardFileManager(null, null, null);
+        Iterable fileObjects = manager.getJavaFileObjectsFromStrings(files);
+        JavaCompiler.CompilationTask task = compiler.getTask(null, null,
+                                                             null, optionList, null,
+                                                             fileObjects);
+
+        boolean failOnError = !task.call();
+        manager.close();
+        if (failOnError) {
+            throw new IOException("Yang Error : compilation errors in " +
+                                          "generated code.");
+        }
+    }
 }
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
index 1e856bf..a03ebb4 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -34,6 +34,7 @@
 import java.util.Stack;
 import java.util.regex.Pattern;
 
+import static java.lang.Integer.parseInt;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
 import static org.onosproject.yangutils.utils.UtilConstants.COLON;
 import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
@@ -881,4 +882,19 @@
         }
         return isDeleted;
     }
+
+    /**
+     * Converts string to integer number for maven version.
+     *
+     * @param ver version
+     * @return int value of version
+     */
+    public static int getVersionValue(String ver) {
+        String[] array = ver.split(Pattern.quote(PERIOD));
+        StringBuilder builder = new StringBuilder();
+        for (String str : array) {
+            builder.append(str);
+        }
+        return parseInt(builder.toString());
+    }
 }