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());
+    }
 }
