diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/GeneratedTempFileType.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/GeneratedTempFileType.java
index ad410a1..cc0f4e3 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/GeneratedTempFileType.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/GeneratedTempFileType.java
@@ -137,21 +137,6 @@
     public static final int LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK = 1 << 22;
 
     /**
-     * Is filter content match for leaves class.
-     */
-    public static final int FILTER_CONTENT_MATCH_FOR_LEAF_MASK = 1 << 23;
-
-    /**
-     * Is filter content match for leaf lists class.
-     */
-    public static final int FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK = 1 << 24;
-
-    /**
-     * Is filter content match for nodes class.
-     */
-    public static final int FILTER_CONTENT_MATCH_FOR_NODES_MASK = 1 << 25;
-
-    /**
      * Edit config class content for class.
      */
     public static final int EDIT_CONTENT_MASK = 1 << 26;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
index 7b47f96..4657692 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
@@ -57,9 +57,6 @@
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.EDIT_CONTENT_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
@@ -98,22 +95,16 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.parseBuilderInterfaceBuildMethodString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getOverRideString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeaf;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForLeafList;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getSubtreeFilteringForNode;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorErrorType.INVALID_LEAF_HOLDER;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorErrorType.INVALID_NODE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorErrorType.INVALID_PARENT_NODE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorErrorType.MISSING_PARENT_NODE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getErrorMsg;
-import static org.onosproject.yang.compiler.utils.UtilConstants.AUGMENT_MAP_TYPE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BIT_SET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BOOLEAN_DATA_TYPE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BUILDER;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLOSE_CURLY_BRACKET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.COLLECTION_IMPORTS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_CAPS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
@@ -123,34 +114,29 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.FOUR_SPACE_INDENTATION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.GOOGLE_MORE_OBJECT_IMPORT_PKG;
-import static org.onosproject.yang.compiler.utils.UtilConstants.HASH_MAP;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INTERFACE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INVOCATION_TARGET_EXCEPTION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.JAVA_UTIL_PKG;
 import static org.onosproject.yang.compiler.utils.UtilConstants.KEYS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MAP;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT_PKG;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OPERATION_TYPE_ATTRIBUTE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OPERATION_TYPE_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PRIVATE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PROTECTED;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUESTION_MARK;
 import static org.onosproject.yang.compiler.utils.UtilConstants.REFLECT_IMPORTS;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SERVICE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SPACE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SUBTREE_FILTERED;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
-import static org.onosproject.yang.compiler.utils.io.impl.FileSystemUtil.*;
+import static org.onosproject.yang.compiler.utils.io.impl.FileSystemUtil.closeFile;
+import static org.onosproject.yang.compiler.utils.io.impl.FileSystemUtil.readAppendFile;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.ADD_TO_LIST;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
-import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.SETTER_METHOD;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.getJavaDoc;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getCamelCase;
@@ -159,9 +145,6 @@
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.insertDataIntoJavaFile;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.mergeJavaFiles;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.validateLineLength;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BIT_SET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.JAVA_UTIL_PKG;
-import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF;
 
 /**
  * Represents implementation of java code fragments temporary implementations.
@@ -406,21 +389,6 @@
     private File leafIdAttributeTempFileHandle;
 
     /**
-     * Temporary file handle for is content match method for leaf-list.
-     */
-    private File getSubtreeFilteringForListTempFileHandle;
-
-    /**
-     * Temporary file handle for is content match method for node.
-     */
-    private File getSubtreeFilteringForChildNodeTempFileHandle;
-
-    /**
-     * Temporary file handle for is content match method for leaf.
-     */
-    private File subtreeFilteringForLeafTempFileHandle;
-
-    /**
      * Temporary file handle for edit content file.
      */
     private File editContentTempFileHandle;
@@ -465,6 +433,7 @@
          */
         if (javaFlagSet(INTERFACE_MASK)) {
             addGeneratedTempFile(GETTER_FOR_INTERFACE_MASK |
+                                         SETTER_FOR_INTERFACE_MASK |
                                          ADD_TO_LIST_INTERFACE_MASK |
                                          LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK);
         }
@@ -492,10 +461,7 @@
             addGeneratedTempFile(
                     ATTRIBUTES_MASK | GETTER_FOR_CLASS_MASK |
                             HASH_CODE_IMPL_MASK | EQUALS_IMPL_MASK |
-                            TO_STRING_IMPL_MASK | ADD_TO_LIST_IMPL_MASK |
-                            FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK |
-                            FILTER_CONTENT_MATCH_FOR_LEAF_MASK |
-                            FILTER_CONTENT_MATCH_FOR_NODES_MASK);
+                            TO_STRING_IMPL_MASK | ADD_TO_LIST_IMPL_MASK);
         }
         /*
          * Initialize temp files to generate type class.
@@ -559,18 +525,6 @@
             leafIdAttributeTempFileHandle =
                     getTemporaryFileHandle(LEAF_IDENTIFIER_ATTRIBUTES_FILE_NAME);
         }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK)) {
-            subtreeFilteringForLeafTempFileHandle =
-                    getTemporaryFileHandle(FILTER_CONTENT_MATCH_LEAF_FILE_NAME);
-        }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK)) {
-            getSubtreeFilteringForListTempFileHandle =
-                    getTemporaryFileHandle(FILTER_CONTENT_MATCH_LEAF_LIST_FILE_NAME);
-        }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK)) {
-            getSubtreeFilteringForChildNodeTempFileHandle =
-                    getTemporaryFileHandle(FILTER_CONTENT_MATCH_NODE_FILE_NAME);
-        }
         if (tempFlagSet(EDIT_CONTENT_MASK)) {
             editContentTempFileHandle =
                     getTemporaryFileHandle(EDIT_CONTENT_FILE_NAME);
@@ -1065,43 +1019,6 @@
     }
 
     /**
-     * Adds is filter content match for leaf.
-     *
-     * @param attr java attribute
-     * @throws IOException when fails to do IO operations
-     */
-    private void addSubTreeFilteringForLeaf(JavaAttributeInfo attr)
-            throws IOException {
-        appendToFile(subtreeFilteringForLeafTempFileHandle,
-                     getSubtreeFilteringForLeaf(attr, attr.getAttributeType()) +
-                             NEW_LINE);
-    }
-
-    /**
-     * Adds is filter content match for leaf-list.
-     *
-     * @param attr java attribute
-     * @throws IOException when fails to do IO operations
-     */
-    private void addSubtreeFilteringForLeafList(JavaAttributeInfo attr)
-            throws IOException {
-        appendToFile(getSubtreeFilteringForListTempFileHandle,
-                     getSubtreeFilteringForLeafList(attr) + NEW_LINE);
-    }
-
-    /**
-     * Adds is filter content match for nodes.
-     *
-     * @param attr java attribute
-     * @throws IOException when fails to do IO operations
-     */
-    private void addSubtreeFilteringForChildNode(JavaAttributeInfo attr)
-            throws IOException {
-        appendToFile(getSubtreeFilteringForChildNodeTempFileHandle,
-                     getSubtreeFilteringForNode(attr, attrNode) + NEW_LINE);
-    }
-
-    /**
      * Adds attribute for class.
      *
      * @param attr attribute info
@@ -1149,10 +1066,6 @@
         String setter = getSetterForClass(attr, getGeneratedJavaClassName(),
                                           getGeneratedJavaFiles());
         String javadoc = getOverRideString();
-        if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
-            javadoc = getJavaDoc(SETTER_METHOD, attr.getAttributeName(),
-                                 false, null);
-        }
         appendToFile(setterImplTempFileHandle, javadoc + setter);
     }
 
@@ -1172,10 +1085,6 @@
         if (ds != null) {
             annotation = ds.name();
         }
-        if (attr.getAttributeName().equals(SUBTREE_FILTERED)) {
-            javadoc = getJavaDoc(GETTER_METHOD, attr.getAttributeName(),
-                                 false, annotation);
-        }
         if (javaFlagSet(BUILDER_CLASS_MASK)) {
             appendToFile(getterImplTempFileHandle, javadoc + getter);
         } else {
@@ -1559,42 +1468,6 @@
         }
     }
 
-    /**
-     * Adds operation type to temp files.
-     *
-     * @param curNode current YANG node
-     * @param config  YANG plugin config
-     * @throws IOException IO exception
-     */
-    protected void addOperationTypeToTempFiles(YangNode curNode,
-                                               YangPluginConfig config)
-            throws IOException {
-        JavaQualifiedTypeInfoTranslator typeInfo =
-                new JavaQualifiedTypeInfoTranslator();
-        typeInfo.setClassInfo(OPERATION_TYPE_CLASS);
-        JavaFileInfo curInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        JavaFileInfo info;
-        if (curNode instanceof RpcNotificationContainer) {
-            info = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        } else {
-            info = ((JavaFileInfoContainer) getModuleNode(curNode))
-                    .getJavaFileInfo();
-        }
-
-        typeInfo.setPkgInfo(info.getPackage().toLowerCase() + PERIOD +
-                                    getCapitalCase(info.getJavaName()));
-        String curNodeName = getCapitalCase(curInfo.getJavaName());
-        boolean isQualified = false;
-        if (!(curNode instanceof RpcNotificationContainer)) {
-            isQualified = javaImportData.addImportInfo(typeInfo, curNodeName,
-                                                       curInfo.getPackage());
-        }
-        JavaAttributeInfo attributeInfo =
-                getAttributeInfoForTheData(typeInfo, YANG + curNodeName +
-                        OPERATION_TYPE_ATTRIBUTE, null, isQualified, false);
-        addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
-    }
-
     private YangNode getModuleNode(YangNode curNode) {
         YangNode tempNode = curNode.getParent();
         while (!(tempNode instanceof RpcNotificationContainer)) {
@@ -1624,78 +1497,6 @@
         addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
     }
 
-    /**
-     * Adds value leaf flag to temp files.
-     *
-     * @param config YANG plugin config
-     * @throws IOException IO exception
-     */
-    protected void addSelectLeafFlag(YangPluginConfig config)
-            throws IOException {
-        JavaQualifiedTypeInfoTranslator typeInfo =
-                new JavaQualifiedTypeInfoTranslator();
-        typeInfo.setClassInfo(BIT_SET);
-        typeInfo.setPkgInfo(JAVA_UTIL_PKG);
-        JavaAttributeInfo attributeInfo =
-                getAttributeInfoForTheData(typeInfo, SELECT_LEAF, null, false, false);
-        addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
-    }
-
-    /**
-     * 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
-     * @param curNode current yang node
-     * @throws IOException IO exception
-     */
-    protected void addYangAugmentedMap(YangPluginConfig config, YangNode curNode)
-            throws IOException {
-        JavaFileInfoTranslator info = ((JavaCodeGeneratorInfo) curNode)
-                .getJavaFileInfo();
-        JavaQualifiedTypeInfoTranslator typeInfo =
-                new JavaQualifiedTypeInfoTranslator();
-        typeInfo.setClassInfo(AUGMENT_MAP_TYPE);
-        //Fix for add yangAugmentedInfo in equals/hashcode/and to string method.
-        typeInfo.setPkgInfo(null);
-        typeInfo.setForInterface(false);
-        JavaAttributeInfo attributeInfo =
-                getAttributeInfoForTheData(typeInfo, YANG_AUGMENTED_INFO_MAP,
-                                           null, false, false);
-        //MAP
-        addImportInfoOfNode(MAP, COLLECTION_IMPORTS,
-                            getCapitalCase(info.getJavaName()),
-                            info.getPackage(), true);
-        //HASH map
-        addImportInfoOfNode(HASH_MAP, COLLECTION_IMPORTS,
-                            getCapitalCase(info.getJavaName()),
-                            info.getPackage(), false);
-
-        if (curNode.isOpTypeReq()) {
-            //exception
-            addImportInfoOfNode(INVOCATION_TARGET_EXCEPTION, REFLECT_IMPORTS,
-                                getCapitalCase(info.getJavaName()),
-                                info.getPackage(), false);
-        }
-        addJavaSnippetInfoToApplicableTempFiles(attributeInfo, config);
-    }
-
     private JavaQualifiedTypeInfoTranslator addImportInfoOfNode(
             String cls, String pkg, String nodeName, String nodePkg,
             boolean isForInterface) {
@@ -1722,27 +1523,20 @@
         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);
-        ;
+        boolean required = !attrName.equals(VALUE_LEAF);
+
         if (tempFlagSet(ATTRIBUTES_MASK)) {
             addAttribute(newAttrInfo);
         }
-        if (tempFlagSet(GETTER_FOR_INTERFACE_MASK) &&
-                !attrName.equals(SUBTREE_FILTERED)) {
+
+        if (tempFlagSet(GETTER_FOR_INTERFACE_MASK)) {
             addGetterForInterface(newAttrInfo);
         }
-        if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required &&
-                !attrName.equals(SUBTREE_FILTERED)) {
+
+        if (tempFlagSet(SETTER_FOR_INTERFACE_MASK) && required) {
             addSetterForInterface(newAttrInfo);
         }
+
         if (tempFlagSet(SETTER_FOR_CLASS_MASK) && required) {
             addSetterImpl(newAttrInfo);
         }
@@ -1766,17 +1560,7 @@
             addAddToListInterface(newAttrInfo);
         }
         YangType attrType = newAttrInfo.getAttributeType();
-        if (subTreeForChild) {
-            addSubtreeFilteringForChildNode(newAttrInfo);
-        }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK) &&
-                !listAttr && attrType != null) {
-            addSubTreeFilteringForLeaf(newAttrInfo);
-        }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK) &&
-                listAttr && attrType != null) {
-            addSubtreeFilteringForLeafList(newAttrInfo);
-        }
+
         if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK) &&
                 !listAttr && attrType != null) {
             leafCount++;
@@ -1787,6 +1571,7 @@
             if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
                 addGetterImpl(newAttrInfo);
             }
+
             if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
                 JavaQualifiedTypeInfoTranslator typeInfo =
                         getQualifiedInfoOfFromString(newAttrInfo,
@@ -1847,10 +1632,15 @@
     public void generateJavaFile(int fileType, YangNode curNode)
             throws IOException {
 
-        if (curNode.isOpTypeReq()) {
-            addImportInfoOfNode(BIT_SET, JAVA_UTIL_PKG, getGeneratedJavaClassName(),
+        addImportInfoOfNode(MODEL_OBJECT, MODEL_OBJECT_PKG, getGeneratedJavaClassName(),
+                            getJavaFileInfo().getPackage(), false);
+
+        if (curNode instanceof RpcNotificationContainer) {
+            addImportInfoOfNode(MAP, JAVA_UTIL_PKG,
+                                getGeneratedJavaClassName(),
                                 getJavaFileInfo().getPackage(), false);
         }
+
         if (isAttributePresent) {
             //Object utils
             addImportInfoOfNode(JAVA_UTIL_OBJECTS_IMPORT_CLASS, JAVA_UTIL_PKG,
@@ -1905,6 +1695,18 @@
             removeCaseParentImport(curNode, imports);
         }
 
+        if ((fileType & DEFAULT_CLASS_MASK) != 0) {
+            //add model object to extend list
+            JavaQualifiedTypeInfoTranslator typeInfo = new
+                    JavaQualifiedTypeInfoTranslator();
+            typeInfo.setClassInfo(MODEL_OBJECT);
+            typeInfo.setForInterface(false);
+            typeInfo.setPkgInfo(MODEL_OBJECT_PKG);
+            typeInfo.setQualified(false);
+            getBeanFiles(curNode).getJavaExtendsListHolder()
+                    .addToExtendsList(typeInfo, curNode, getBeanFiles(curNode));
+        }
+
         if ((fileType & BUILDER_CLASS_MASK) != 0 ||
                 (fileType & DEFAULT_CLASS_MASK) != 0) {
 
@@ -1930,6 +1732,7 @@
                 mergeJavaFiles(builderClassJavaFileHandle,
                                implClassJavaFileHandle);
             }
+
             insertDataIntoJavaFile(implClassJavaFileHandle, CLOSE_CURLY_BRACKET);
             validateLineLength(implClassJavaFileHandle);
         }
@@ -1944,6 +1747,7 @@
                         getJavaFileHandle(getJavaClassName(
                                 KEY_CLASS_FILE_NAME_SUFFIX));
                 generateKeyClassFile(keyClassJavaFileHandle, curNode);
+
             }
         }
         //Close all the file handles.
@@ -2012,15 +1816,6 @@
         if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK)) {
             closeFile(leafIdAttributeTempFileHandle);
         }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_MASK)) {
-            closeFile(subtreeFilteringForLeafTempFileHandle);
-        }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK)) {
-            closeFile(getSubtreeFilteringForListTempFileHandle);
-        }
-        if (tempFlagSet(FILTER_CONTENT_MATCH_FOR_NODES_MASK)) {
-            closeFile(getSubtreeFilteringForChildNodeTempFileHandle);
-        }
         if (tempFlagSet(EDIT_CONTENT_MASK)) {
             closeFile(editContentTempFileHandle);
         }
@@ -2078,15 +1873,6 @@
     }
 
     /**
-     * Returns temp file for is content match.
-     *
-     * @return temp file for is content match
-     */
-    public File getSubtreeFilteringForLeafTempFileHandle() {
-        return subtreeFilteringForLeafTempFileHandle;
-    }
-
-    /**
      * Returns temp file for edit content file.
      *
      * @return temp file for edit content file
@@ -2096,24 +1882,6 @@
     }
 
     /**
-     * Returns temp file for is content match.
-     *
-     * @return temp file for is content match
-     */
-    public File getGetSubtreeFilteringForListTempFileHandle() {
-        return getSubtreeFilteringForListTempFileHandle;
-    }
-
-    /**
-     * Returns temp file for is content match.
-     *
-     * @return temp file for is content match
-     */
-    public File getGetSubtreeFilteringForChildNodeTempFileHandle() {
-        return getSubtreeFilteringForChildNodeTempFileHandle;
-    }
-
-    /**
      * Checks if a given flag is set in generated java files.
      * Returns true if ANY flag is set in a bitwise-ORed argument, e.g.
      * <pre>
@@ -2146,4 +1914,5 @@
     public void setAttrNode(YangNode attrNode) {
         this.attrNode = attrNode;
     }
+
 }
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
index 4cc70c2..d55d5ce 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
@@ -263,16 +263,6 @@
             if (isLeafPresent) {
                 bean.addValueLeafFlag(config, (YangNode) info);
             }
-            if (((YangNode) info).isOpTypeReq()) {
-                // Add operation type as an attribute.
-                bean.addOperationTypeToTempFiles((YangNode) info,
-                                                 config);
-                bean.addIsSubTreeFilteredFlag(config);
-                if (isLeafPresent) {
-                    //Add select leaf flag attribute to temp file.
-                    bean.addSelectLeafFlag(config);
-                }
-            }
         } else if (info instanceof YangTypeHolder) {
             /*
              * Typedef
@@ -429,9 +419,6 @@
 
         generateCodeOfNode(info, config);
         TempJavaBeanFragmentFiles tempFiles = getBeanFiles(info);
-        if (!(info instanceof YangChoice)) {
-            tempFiles.addYangAugmentedMap(config, (YangNode) info);
-        }
         if (info instanceof YangCase) {
             YangNode parent = ((YangCase) info).getParent();
             JavaQualifiedTypeInfoTranslator typeInfo =
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java
index 115d220..3613548 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java
@@ -71,6 +71,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.IMPLEMENTS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INTERFACE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LISTENER_SERVICE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CURLY_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
@@ -416,14 +417,30 @@
                             def.toString(), holder));
                     break;
                 case BUILDER_CLASS_MASK:
+                    boolean isModelObject = false;
+                    for (JavaQualifiedTypeInfoTranslator info : holder.getExtendsList()) {
+                        if (info.getClassInfo().equals(MODEL_OBJECT)) {
+                            isModelObject = true;
+                        }
+                    }
                     def.append(STATIC).append(SPACE).append(CLASS)
-                            .append(SPACE).append(yangName).append(BUILDER)
-                            .append(SPACE).append(EXTEND).append(SPACE);
-                    def = new StringBuilder(getDefinitionString(def.toString(),
-                                                                holder));
+                            .append(SPACE).append(yangName).append(BUILDER);
+                    if (!isModelObject) {
+                        def.append(SPACE).append(EXTEND).append(SPACE);
+                        def = new StringBuilder(getDefinitionString(def.toString(),
+                                                                    holder));
+                    }
                     def.append(SPACE).append(IMPLEMENTS).append(SPACE)
                             .append(yangName).append(PERIOD)
                             .append(yangName).append(BUILDER);
+//                    def.append(STATIC).append(SPACE).append(CLASS)
+//                            .append(SPACE).append(yangName).append(BUILDER)
+//                            .append(SPACE).append(EXTEND).append(SPACE);
+//                    def = new StringBuilder(getDefinitionString(def.toString(),
+//                                                                holder));
+//                    def.append(SPACE).append(IMPLEMENTS).append(SPACE)
+//                            .append(yangName).append(PERIOD)
+//                            .append(yangName).append(BUILDER);
                     break;
                 case DEFAULT_CLASS_MASK:
                     if (curNode instanceof RpcNotificationContainer) {
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java
index 810123c..9cb4cca 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaCodeSnippetGen.java
@@ -43,7 +43,6 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.ENUM;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EQUAL;
 import static org.onosproject.yang.compiler.utils.UtilConstants.FOUR_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.HASH_MAP;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INT_MAX_RANGE_ATTR;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INT_MIN_RANGE_ATTR;
@@ -55,14 +54,12 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CLOSE_BRACKET_STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CLOSE_DIAMOND_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PRIVATE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PUBLIC;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUEUE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUOTES;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SCHEMA_NAME;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SELECT_LEAF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SEMI_COLON;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SET_VALUE_PARA;
@@ -78,7 +75,6 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.ULONG_MAX_RANGE_ATTR;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ULONG_MIN_RANGE_ATTR;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.ENUM_ATTRIBUTE;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.enumJavaDocForInnerClass;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.getJavaDoc;
@@ -147,15 +143,10 @@
             attrDef.append(attrType).append(SPACE)
                     .append(attrName);
             //Initialize select leaf/value leaf/ augment map attribute.
-            if (attrName.equals(SELECT_LEAF) || attrName.equals(VALUE_LEAF)) {
+            if (attrName.equals(VALUE_LEAF)) {
                 attrDef.append(SPACE).append(EQUAL).append(SPACE).append(NEW)
                         .append(SPACE).append(BIT_SET)
                         .append(OPEN_CLOSE_BRACKET_STRING);
-            } else if (attrName.equals(YANG_AUGMENTED_INFO_MAP)) {
-                attrDef.append(SPACE).append(EQUAL).append(SPACE).append(NEW)
-                        .append(SPACE).append(HASH_MAP)
-                        .append(OPEN_CLOSE_DIAMOND_STRING)
-                        .append(OPEN_CLOSE_BRACKET_STRING);
             }
 
             attrDef.append(signatureClose());
@@ -405,38 +396,6 @@
     }
 
     /**
-     * Returns operation type enum.
-     *
-     * @return operation type enum
-     */
-    static String getOperationTypeEnum() {
-        return "    /**\n" +
-                "     * Specify the node specific operation in protocols " +
-                "like NETCONF.\n" +
-                "     * Applicable in protocol edit operation, not applicable" +
-                " in query operation\n" +
-                "     */\n" +
-                "    public static enum OnosYangOpType {\n" +
-                "        MERGE,\n" +
-                "        REPLACE,\n" +
-                "        CREATE,\n" +
-                "        DELETE,\n" +
-                "        REMOVE,\n" +
-                "        NONE\n" +
-                "    }\n";
-    }
-
-    /**
-     * Returns attribute in constructor for yang augmented info map.
-     *
-     * @return augment info map
-     */
-    static String getYangAugmentedMapObjectForConstruct() {
-        return "        this.yangAugmentedInfoMap = builderObject" +
-                ".yangAugmentedInfoMap();\n";
-    }
-
-    /**
      * Returns set value parameter for union class.
      *
      * @return set value parameter for union class.
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaExtendsListHolder.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaExtendsListHolder.java
index 2ae1905..ce22cda 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaExtendsListHolder.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaExtendsListHolder.java
@@ -74,13 +74,15 @@
      */
     public void addToExtendsList(JavaQualifiedTypeInfoTranslator info, YangNode node,
                                  TempJavaFragmentFiles tempJavaFragmentFiles) {
-        JavaFileInfoTranslator fileInfo = ((JavaFileInfoContainer) node).getJavaFileInfo();
+
+        JavaFileInfoTranslator fileInfo = ((JavaFileInfoContainer) node)
+                .getJavaFileInfo();
 
         JavaImportData importData = tempJavaFragmentFiles.getJavaImportData();
-        boolean qualified = importData.addImportInfo(info,
-                                                     getCapitalCase(fileInfo.getJavaName()), fileInfo.getPackage());
-
-            /*true means import should be added*/
+        boolean qualified = importData
+                .addImportInfo(info, getCapitalCase(fileInfo.getJavaName()),
+                               fileInfo.getPackage());
+        /*true means import should be added*/
         getExtendedClassStore().put(info, qualified);
 
         addToExtendsList(info);
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
index 546ed05..cfdba13 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
@@ -17,8 +17,6 @@
 package org.onosproject.yang.compiler.translator.tojava.utils;
 
 import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
-import org.onosproject.yang.compiler.datamodel.YangAugmentableNode;
-import org.onosproject.yang.compiler.datamodel.YangChoice;
 import org.onosproject.yang.compiler.datamodel.YangEnumeration;
 import org.onosproject.yang.compiler.datamodel.YangLeavesHolder;
 import org.onosproject.yang.compiler.datamodel.YangNode;
@@ -88,16 +86,15 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaCodeSnippetGen.getEnumsValueAttribute;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaCodeSnippetGen.getEventEnumTypeStart;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaCodeSnippetGen.getJavaAttributeDefinition;
-import static org.onosproject.yang.compiler.translator.tojava.utils.JavaCodeSnippetGen.getOperationTypeEnum;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaCodeSnippetGen.getSetValueParaForUnionClass;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.initiateJavaFileGeneration;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_INT_VALUE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.ENUM_METHOD_STRING_VALUE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.builderMethod;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.generateBuildMethodForSubTree;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodImpl;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAddAugmentInfoMethodInterface;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAddAugmentationString;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAugmentationString;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAugmentationsString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAugmentsDataMethodForService;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getBitSetEnumClassFromString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getBitSetEnumClassToString;
@@ -118,33 +115,20 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getHashCodeMethodOpen;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getInterfaceLeafIdEnumSignature;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getRangeValidatorMethodForUnion;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getRemoveAugmentationString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterForClass;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterForSelectLeaf;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringForEnumClass;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringForType;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getUnionToStringMethod;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoImpl;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangAugmentInfoInterface;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.isLeafValueSetInterface;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.isSelectLeafSetInterface;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.setSelectLeafSetInterface;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getInterfaceLeafIdEnumMethods;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getIsSelectLeafSet;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getIsValueLeafSet;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.methodClose;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.signatureClose;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getAugmentableSubTreeFiltering;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessChildNodeSubtreeFiltering;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessLeafListSubtreeFiltering;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessLeafSubtreeFiltering;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessSubTreeFilteringEnd;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessSubTreeForChoiceInterface;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessSubtreeFilteringStart;
-import static org.onosproject.yang.compiler.translator.tojava.utils.SubtreeFilteringMethodsGenerator.getProcessSubtreeFunctionBody;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.addDefaultConstructor;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getTypeFiles;
@@ -238,18 +222,8 @@
         initiateJavaFileGeneration(file, INTERFACE_MASK, imports, curNode,
                                    className);
 
-        // Generate ENUM interface
-        if (curNode instanceof RpcNotificationContainer) {
-            insertDataIntoJavaFile(file, getOperationTypeEnum());
-        }
         List<String> methods = new ArrayList<>();
 
-        //Add only for choice class
-        if (curNode instanceof YangChoice) {
-            insertDataIntoJavaFile(file, getProcessSubTreeForChoiceInterface(
-                    curNode));
-        }
-
         if (attrPresent) {
             // Add getter methods to interface file.
             try {
@@ -273,16 +247,8 @@
             }
         }
 
-        if (curNode instanceof YangAugmentableNode &&
-                !(curNode instanceof YangChoice)) {
-            methods.add(getYangAugmentInfoInterface());
-        }
-
         if (leavesPresent) {
             methods.add(isLeafValueSetInterface());
-            if (curNode.isOpTypeReq()) {
-                methods.add(isSelectLeafSetInterface());
-            }
         }
         for (String method : methods) {
             insertDataIntoJavaFile(file, method);
@@ -349,15 +315,6 @@
             }
         }
 
-        if (curNode instanceof YangAugmentableNode &&
-                !(curNode instanceof YangChoice)) {
-            methods.add(getAddAugmentInfoMethodInterface(className + BUILDER));
-            methods.add(getYangAugmentInfoInterface());
-        }
-
-        if (leavesPresent) {
-            methods.add(setSelectLeafSetInterface(className));
-        }
         //Add build method to builder interface file.
         methods.add(((TempJavaCodeFragmentFilesContainer) curNode)
                             .getTempJavaCodeFragmentFiles()
@@ -432,12 +389,6 @@
                         ADD_TO_LIST_IMPL_MASK, getBeanFiles(curNode), path));
 
                 insertDataIntoJavaFile(file, NEW_LINE);
-
-                //Add operation attribute methods.
-                if (leavesPresent && curNode.isOpTypeReq()) {
-                    insertDataIntoJavaFile(file, NEW_LINE);
-                    methods.add(getSetterForSelectLeaf(className));
-                }
             } catch (IOException e) {
                 throw new IOException(getErrorMsg(className, BUILDER_CLASS));
             }
@@ -445,18 +396,11 @@
             insertDataIntoJavaFile(file, NEW_LINE);
         }
 
-        if (curNode instanceof YangAugmentableNode) {
-            methods.add(getAddAugmentInfoMethodImpl(className + BUILDER));
-            methods.add(getYangAugmentInfoImpl());
-        }
-
         // Add default constructor and build method impl.
         methods.add(((TempJavaCodeFragmentFilesContainer) curNode)
                             .getTempJavaCodeFragmentFiles()
                             .addBuildMethodImpl());
-        if (curNode.isOpTypeReq()) {
-            methods.add(generateBuildMethodForSubTree(curNode));
-        }
+
         methods.add(addDefaultConstructor(curNode, PUBLIC, BUILDER));
 
         //Add methods in builder class.
@@ -618,9 +562,6 @@
             insertDataIntoJavaFile(file, NEW_LINE);
         }
 
-        if (curNode instanceof YangAugmentableNode) {
-            methods.add(getYangAugmentInfoImpl());
-        }
         try {
             //Constructor.
             String constructor = getConstructorStart(className, rootNode) +
@@ -628,35 +569,6 @@
                             CONSTRUCTOR_IMPL_MASK, getBeanFiles(curNode), path)
                     + methodClose(FOUR_SPACE);
             methods.add(constructor);
-            if (curNode.isOpTypeReq()) {
-                String augmentableSubTreeFiltering = EMPTY_STRING;
-                if (curNode instanceof YangAugmentableNode) {
-                    // add is filter content match.
-                    augmentableSubTreeFiltering = getAugmentableSubTreeFiltering();
-                }
-                methods.add(getProcessSubtreeFilteringStart(curNode) +
-                                    getProcessSubtreeFunctionBody(curNode) +
-                                    augmentableSubTreeFiltering +
-                                    getProcessSubTreeFilteringEnd(name));
-
-                if (curNode instanceof YangLeavesHolder) {
-                    if (((YangLeavesHolder) curNode).getListOfLeaf() != null &&
-                            !((YangLeavesHolder) curNode).getListOfLeaf().isEmpty()) {
-                        methods.add(getProcessLeafSubtreeFiltering(curNode,
-                                                                   path));
-                    }
-                    if (((YangLeavesHolder) curNode).getListOfLeafList() != null &&
-                            !((YangLeavesHolder) curNode).getListOfLeafList().isEmpty()) {
-                        methods.add(getProcessLeafListSubtreeFiltering(curNode,
-                                                                       path));
-                    }
-                }
-
-                if (curNode.getChild() != null) {
-                    methods.add(getProcessChildNodeSubtreeFiltering(curNode,
-                                                                    path));
-                }
-            }
         } catch (IOException e) {
             throw new IOException(getErrorMsg(className, IMPL_CLASS));
         }
@@ -666,10 +578,15 @@
         methods.add(builderMethod(className));
         if (leavesPresent) {
             methods.add(getIsValueLeafSet());
-            if (curNode.isOpTypeReq()) {
-                methods.add(getIsSelectLeafSet());
-            }
         }
+
+        if (curNode instanceof RpcNotificationContainer) {
+            methods.add(getAddAugmentationString());
+            methods.add(getRemoveAugmentationString());
+            methods.add(getAugmentationsString());
+            methods.add(getAugmentationString());
+        }
+
         // Add methods in impl class.
         for (String method : methods) {
             insertDataIntoJavaFile(file, method);
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java
index 81c7cb1..6c1ac6b 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -71,9 +71,6 @@
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_ATTRIBUTE_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_GETTER_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_SETTER_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FROM_STRING_IMPL_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.GETTER_FOR_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.GETTER_FOR_INTERFACE_MASK;
@@ -210,21 +207,6 @@
                     tempHandle.getAddToListImplTempFileHandle(),
                     path);
         }
-        if ((tempFiles & FILTER_CONTENT_MATCH_FOR_LEAF_MASK) != 0) {
-            return tempHandle.getTemporaryDataFromFileHandle(
-                    tempHandle.getSubtreeFilteringForLeafTempFileHandle(),
-                    path);
-        }
-        if ((tempFiles & FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK) != 0) {
-            return tempHandle.getTemporaryDataFromFileHandle(
-                    tempHandle.getGetSubtreeFilteringForListTempFileHandle(),
-                    path);
-        }
-        if ((tempFiles & FILTER_CONTENT_MATCH_FOR_NODES_MASK) != 0) {
-            return tempHandle.getTemporaryDataFromFileHandle(
-                    tempHandle.getGetSubtreeFilteringForChildNodeTempFileHandle(),
-                    path);
-        }
         if ((tempFiles & EDIT_CONTENT_MASK) != 0) {
             return tempHandle.getTemporaryDataFromFileHandle(
                     tempHandle.getEditContentTempFileHandle(),
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodBodyTypes.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodBodyTypes.java
index a5fcef3..2622809 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodBodyTypes.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodBodyTypes.java
@@ -48,15 +48,6 @@
     //add to list method body.
     ADD_TO_LIST,
 
-    //Augment map getter for full map.
-    AUGMENTED_MAP_GETTER,
-
-    //Augment map getter for value.
-    AUGMENTED_MAP_GET_VALUE,
-
-    //Augment map add
-    AUGMENTED_MAP_ADD,
-
     //Manager methods
     MANAGER_METHODS,
 
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
index 81e86a7..e25971f 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
@@ -17,7 +17,6 @@
 package org.onosproject.yang.compiler.translator.tojava.utils;
 
 import org.onosproject.yang.compiler.datamodel.InvalidOpTypeHolder;
-import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
 import org.onosproject.yang.compiler.datamodel.YangAppDataStructure;
 import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
 import org.onosproject.yang.compiler.datamodel.YangCompilerAnnotation;
@@ -52,8 +51,6 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getCurNodeName;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getSetOfNodeIdentifiers;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaIdentifierSyntax.getEnumJavaAttribute;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.AUGMENTED_MAP_ADD;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.AUGMENTED_MAP_GET_VALUE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.GETTER;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.MANAGER_METHODS;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodBodyTypes.SETTER;
@@ -96,10 +93,13 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.multiAttrMethodSignature;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.signatureClose;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ADD;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ADD_AUGMENTATION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ADD_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.AND;
 import static org.onosproject.yang.compiler.utils.UtilConstants.APPEND;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ARRAY_LIST_INIT;
+import static org.onosproject.yang.compiler.utils.UtilConstants.AUGMENTATION;
+import static org.onosproject.yang.compiler.utils.UtilConstants.AUGMENTATIONS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.AUGMENTED;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BASE64;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BIG_INTEGER;
@@ -109,7 +109,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.BUILD;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BUILDER;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BUILDER_LOWER_CASE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BUILD_FOR_FILTER;
+import static org.onosproject.yang.compiler.utils.UtilConstants.CAMEL_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CASE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS_STRING;
@@ -148,15 +148,17 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.INSTANCE_OF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.IS_EMPTY;
-import static org.onosproject.yang.compiler.utils.UtilConstants.IS_SELECT_LEAF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.KEYS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LEAF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LEAF_IDENTIFIER;
+import static org.onosproject.yang.compiler.utils.UtilConstants.LEFT_ANGULAR_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LINKED_HASH_MAP;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LINKED_HASH_SET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LONG;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MAP;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MAX_RANGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MIN_RANGE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEG_ONE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
@@ -178,19 +180,18 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PRIORITY_QUEUE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PRIVATE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PROCESS_SUBTREE_FILTERING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PROTECTED;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PUBLIC;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PUT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUESTION_MARK;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUOTES;
+import static org.onosproject.yang.compiler.utils.UtilConstants.REMOVE_AUGMENTATION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.RETURN;
+import static org.onosproject.yang.compiler.utils.UtilConstants.RIGHT_ANGULAR_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.RPC_INPUT_VAR_NAME;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SCHEMA_NAME;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SELECT_ALL_CHILD;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SEMI_COLON;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SET_METHOD_PREFIX;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SET_SELECT_LEAF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SET_VALUE_PARA;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SIXTEEN_SPACE_INDENTATION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SPACE;
@@ -199,9 +200,9 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.STATIC;
 import static org.onosproject.yang.compiler.utils.UtilConstants.STRING_BUILDER_VAR;
 import static org.onosproject.yang.compiler.utils.UtilConstants.STRING_DATA_TYPE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SUBTREE_FILTERED;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SUFFIX_S;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SWITCH;
+import static org.onosproject.yang.compiler.utils.UtilConstants.TEMPLATE_T;
 import static org.onosproject.yang.compiler.utils.UtilConstants.THIS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.TMP_VAL;
 import static org.onosproject.yang.compiler.utils.UtilConstants.TO_CAPS;
@@ -214,9 +215,8 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_CAPS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF_SET;
+import static org.onosproject.yang.compiler.utils.UtilConstants.VARIABLE_C;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VOID;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_AUGMENTED_INFO;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_AUGMENTED_INFO_LOWER_CASE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ZERO;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.BUILD_METHOD;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.CONSTRUCTOR;
@@ -227,9 +227,7 @@
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.OF_METHOD;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.SETTER_METHOD;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.TYPE_CONSTRUCTOR;
-import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.generateForAddAugmentation;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.generateForBuilderMethod;
-import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.generateForGetAugmentation;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.generateForGetMethodWithAttribute;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.generateForValidatorMethod;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.getJavaDoc;
@@ -371,6 +369,46 @@
     }
 
     /**
+     * Returns add augmentation method string.
+     *
+     * @return add augmentation string
+     */
+    public static String getAddAugmentationString() {
+        return getOverRideString() +
+                getAddAugmentation();
+    }
+
+    /**
+     * Returns remove augmentation method string.
+     *
+     * @return remove augmentation string
+     */
+    public static String getRemoveAugmentationString() {
+        return getOverRideString() +
+                getRemoveAugmentation();
+    }
+
+    /**
+     * Returns augmentations method string.
+     *
+     * @return augmentations string
+     */
+    public static String getAugmentationsString() {
+        return getOverRideString() +
+                getAugmentations();
+    }
+
+    /**
+     * Returns augmentation method string.
+     *
+     * @return augmentation string
+     */
+    public static String getAugmentationString() {
+        return getOverRideString() +
+                getAugmentation();
+    }
+
+    /**
      * Returns the getter method strings for class file.
      *
      * @param attr               attribute info
@@ -761,6 +799,62 @@
     }
 
     /**
+     * Returns the add augmentation strings for class file.
+     *
+     * @return add augmentation method for class
+     */
+    private static String getAddAugmentation() {
+        return methodSignature(ADD_AUGMENTATION, EMPTY_STRING, PUBLIC, OBJ,
+                               VOID, MODEL_OBJECT, CLASS_TYPE) +
+                methodClose(FOUR_SPACE);
+    }
+
+    /**
+     * Returns the remove augmentation strings for class file.
+     *
+     * @return remove augmentation method for class
+     */
+    private static String getRemoveAugmentation() {
+        return methodSignature(REMOVE_AUGMENTATION, EMPTY_STRING, PUBLIC,
+                               OBJ, VOID, MODEL_OBJECT, CLASS_TYPE) +
+                methodClose(FOUR_SPACE);
+    }
+
+    /**
+     * Returns the augmentations method for class file.
+     *
+     * @return augmentations method for class
+     */
+    private static String getAugmentations() {
+        String methodReturnType = MAP + LEFT_ANGULAR_BRACKET + CAMEL_CLASS +
+                LEFT_ANGULAR_BRACKET + QUESTION_MARK + SPACE + EXTEND +
+                SPACE + MODEL_OBJECT + RIGHT_ANGULAR_BRACKET + COMMA +
+                SPACE + MODEL_OBJECT + RIGHT_ANGULAR_BRACKET;
+        return methodSignature(AUGMENTATIONS, EMPTY_STRING, PUBLIC, null,
+                               methodReturnType, null, CLASS_TYPE) + NEW_LINE +
+                getReturnString(NULL, EIGHT_SPACE_INDENTATION) + SEMI_COLON +
+                NEW_LINE + methodClose(FOUR_SPACE);
+    }
+
+    /**
+     * Returns the augmentation strings for class file.
+     *
+     * @return augmentation method for class
+     */
+    private static String getAugmentation() {
+        String methodReturnType = LEFT_ANGULAR_BRACKET + TEMPLATE_T + SPACE +
+                EXTEND + SPACE + MODEL_OBJECT + RIGHT_ANGULAR_BRACKET + SPACE +
+                TEMPLATE_T;
+        String paraReturntype = CAMEL_CLASS + LEFT_ANGULAR_BRACKET + TEMPLATE_T +
+                RIGHT_ANGULAR_BRACKET;
+        return methodSignature(AUGMENTATION, EMPTY_STRING, PUBLIC, VARIABLE_C,
+                               methodReturnType,
+                               paraReturntype, CLASS_TYPE) + NEW_LINE +
+                getReturnString(NULL, EIGHT_SPACE_INDENTATION) + SEMI_COLON +
+                NEW_LINE + methodClose(FOUR_SPACE);
+    }
+
+    /**
      * Returns to string method's open strings.
      *
      * @return string method's open string
@@ -1185,72 +1279,6 @@
     }
 
     /**
-     * Returns interface of add augmentation.
-     *
-     * @param className class name
-     * @return interface of add augmentation
-     */
-    static String getAddAugmentInfoMethodInterface(String className) {
-        StringBuilder builder = new StringBuilder(generateForAddAugmentation(className));
-        LinkedHashMap<String, String> map = new LinkedHashMap<>();
-        map.put(VALUE, OBJECT_STRING);
-        map.put(CLASS + OBJECT_STRING, CLASS_STRING);
-        builder.append(multiAttrMethodSignature(ADD_STRING + YANG_AUGMENTED_INFO,
-                                                null, null, className, map,
-                                                INTERFACE_TYPE));
-        return builder.toString();
-    }
-
-    /**
-     * Returns implementation of add augmentation.
-     *
-     * @param className class name
-     * @return implementation of add augmentation
-     */
-    static String getAddAugmentInfoMethodImpl(String className) {
-        StringBuilder builder = new StringBuilder(getOverRideString());
-        LinkedHashMap<String, String> map = new LinkedHashMap<>();
-        map.put(VALUE, OBJECT_STRING);
-        map.put(CLASS + OBJECT_STRING, CLASS_STRING);
-        builder.append(multiAttrMethodSignature(ADD_STRING + YANG_AUGMENTED_INFO,
-                                                null, PUBLIC,
-                                                className, map, CLASS_TYPE))
-                .append(methodBody(AUGMENTED_MAP_ADD, null, null,
-                                   EIGHT_SPACE_INDENTATION, null, null, false, null))
-                .append(getReturnString(THIS, EIGHT_SPACE_INDENTATION))
-                .append(signatureClose())
-                .append(methodClose(FOUR_SPACE));
-        return builder.toString();
-    }
-
-    /**
-     * Returns interface of get YANG augment info.
-     *
-     * @return interface of get YANG augment info
-     */
-    static String getYangAugmentInfoInterface() {
-        return generateForGetAugmentation() +
-                methodSignature(YANG_AUGMENTED_INFO_LOWER_CASE, EMPTY_STRING,
-                                null, CLASS + OBJECT_STRING,
-                                OBJECT_STRING, CLASS_STRING, INTERFACE_TYPE);
-    }
-
-    /**
-     * Returns implementation of get YANG augment info.
-     *
-     * @return implementation of get YANG augment info
-     */
-    static String getYangAugmentInfoImpl() {
-        return getOverRideString() +
-                methodSignature(YANG_AUGMENTED_INFO_LOWER_CASE, EMPTY_STRING,
-                                PUBLIC, CLASS + OBJECT_STRING, OBJECT_STRING,
-                                CLASS_STRING, CLASS_TYPE) +
-                methodBody(AUGMENTED_MAP_GET_VALUE, null, null,
-                           EIGHT_SPACE_INDENTATION, null, null, false, null) +
-                methodClose(FOUR_SPACE);
-    }
-
-    /**
      * Returns enum's constructor.
      *
      * @param className enum's class name
@@ -1671,42 +1699,6 @@
     }
 
     /**
-     * Returns is select leaf set interface.
-     *
-     * @return is select leaf set interface
-     */
-    static String isSelectLeafSetInterface() {
-        String method = "\n    /**\n" +
-                "     * Checks if the leaf is set to be a selected leaf.\n" +
-                "     *\n" +
-                "     * @param leaf if leaf needs to be selected\n" +
-                "     * @return result of leaf value set in object\n" +
-                "     */\n";
-        return method + methodSignature(IS_SELECT_LEAF, EMPTY_STRING, null,
-                                        LEAF, BOOLEAN_DATA_TYPE, LEAF_IDENTIFIER,
-                                        INTERFACE_TYPE);
-    }
-
-    /**
-     * Returns set select leaf set interface.
-     *
-     * @param name node name
-     * @return set select leaf set interface
-     */
-    static String setSelectLeafSetInterface(String name) {
-        String method = "    /**\n" +
-                "     * Set a leaf to be selected.\n" +
-                "     *\n" +
-                "     * @param leaf leaf needs to be selected\n" +
-                "     * @return builder object for select leaf\n" +
-                "     */\n";
-        return method + methodSignature(SET_SELECT_LEAF, EMPTY_STRING,
-                                        null, LEAF, name +
-                                                BUILDER, LEAF_IDENTIFIER,
-                                        INTERFACE_TYPE) + NEW_LINE;
-    }
-
-    /**
      * Returns leaf identifier interface enum signature.
      *
      * @param name name of node
@@ -1721,22 +1713,6 @@
     }
 
     /**
-     * Returns setter for select leaf.
-     *
-     * @param name name of node
-     * @return setter for select leaf
-     */
-    static String getSetterForSelectLeaf(String name) {
-        return "\n" +
-                "    " + OVERRIDE + "\n" +
-                "    public " + name + BUILDER +
-                " selectLeaf(LeafIdentifier leaf) {\n" +
-                "        selectLeafFlags.set(leaf.getLeafIndex());\n" +
-                "        return this;\n" +
-                "    }\n";
-    }
-
-    /**
      * Generates fromString code for bits.
      *
      * @return generated fromString code for bits.
@@ -1966,57 +1942,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 build method for subtree filtering in class.
-     *
-     * @param node YANG node
-     * @return build method for subtree filtering in class
-     */
-    static String generateBuildMethodForSubTree(YangNode node) {
-        String name = getCapitalCase(node.getJavaClassNameOrBuiltInType());
-        StringBuilder builder = new StringBuilder(getJavaDoc(BUILD_METHOD,
-                                                             name, false, null));
-        String def = DEFAULT_CAPS + name;
-        if (node instanceof RpcNotificationContainer) {
-            def = name + OP_PARAM;
-        }
-        builder.append(methodSignature(BUILD_FOR_FILTER, null, PUBLIC, null,
-                                       name, null, CLASS_TYPE))
-                .append(EIGHT_SPACE_INDENTATION).append(SUBTREE_FILTERED)
-                .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();
-    }
-
-    /**
      * To string method for identity.
      *
      * @param name name of identity
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
index 2befdde..d381805 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
@@ -106,7 +106,6 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OBJECT;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OBJECT_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OMIT_NULL_VALUE_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CLOSE_BRACKET_STRING;
@@ -120,7 +119,6 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.PARSE_SHORT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PATTERN;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PUT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUEUE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUOTES;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUOTE_STRING;
@@ -151,7 +149,6 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.ULONG_MIN_RANGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALIDATE_RANGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_AUGMENTED_INFO_MAP;
 import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_UTILS_TODO;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ZERO;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getCamelCase;
@@ -348,18 +345,6 @@
                         signatureClose();
             case DEFAULT_CONSTRUCTOR:
                 return EMPTY_STRING;
-            case AUGMENTED_MAP_ADD:
-                return space + YANG_AUGMENTED_INFO_MAP +
-                        PERIOD + PUT + OPEN_PARENTHESIS + CLASS +
-                        OBJECT_STRING + COMMA + SPACE + VALUE +
-                        CLOSE_PARENTHESIS + signatureClose();
-            case AUGMENTED_MAP_GET_VALUE:
-                return getReturnString(
-                        YANG_AUGMENTED_INFO_MAP + PERIOD + GET + getOpenCloseParaWithValue(
-                                CLASS + OBJECT_STRING) + signatureClose(), space);
-            case AUGMENTED_MAP_GETTER:
-                return getReturnString(YANG_AUGMENTED_INFO_MAP +
-                                               signatureClose(), space);
             case MANAGER_METHODS:
                 body = space + YANG_UTILS_TODO + NEW_LINE;
                 builder.append(body);
@@ -649,53 +634,6 @@
     }
 
     /**
-     * Returns is select leaf set.
-     *
-     * @return is select leaf set
-     */
-    static String getIsSelectLeafSet() {
-        return "    @Override\n" +
-                "    public boolean isSelectLeaf(LeafIdentifier leaf) {\n" +
-                "        return selectLeafFlags.get(leaf.getLeafIndex());\n" +
-                "    }\n";
-    }
-
-    /**
-     * Returns getter methods for operation attributes.
-     *
-     * @return getter methods for operation attributes
-     */
-    static String getValueLeafGetters() {
-        return "\n" +
-                "    /**\n" +
-                "     * Returns the valueLeafFlags.\n" +
-                "     *\n" +
-                "     * @return value of valueLeafFlags\n" +
-                "     */\n" +
-                "    public BitSet getValueLeafFlags() {\n" +
-                "        return valueLeafFlags;\n" +
-                "    }\n" +
-                "\n";
-    }
-
-    /**
-     * Returns getter methods for operation attributes.
-     *
-     * @return getter methods for operation attributes
-     */
-    static String getSelectLeafGetters() {
-        return "    /**\n" +
-                "     * Returns the selectLeafFlags.\n" +
-                "     *\n" +
-                "     * @return value of selectLeafFlags\n" +
-                "     */\n" +
-                "    public BitSet getSelectLeafFlags() {\n" +
-                "        return selectLeafFlags;\n" +
-                "    }\n" +
-                "\n";
-    }
-
-    /**
      * Returns interface leaf identifier enum method.
      *
      * @return interface leaf identifier enum method
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
deleted file mode 100644
index 51f236d..0000000
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
+++ /dev/null
@@ -1,1238 +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.yang.compiler.translator.tojava.utils;
-
-import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
-import org.onosproject.yang.compiler.datamodel.YangAugment;
-import org.onosproject.yang.compiler.datamodel.YangCase;
-import org.onosproject.yang.compiler.datamodel.YangChoice;
-import org.onosproject.yang.compiler.datamodel.YangDataStructure;
-import org.onosproject.yang.compiler.datamodel.YangLeafRef;
-import org.onosproject.yang.compiler.datamodel.YangLeavesHolder;
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.YangType;
-import org.onosproject.yang.compiler.translator.exception.TranslatorException;
-import org.onosproject.yang.compiler.translator.tojava.JavaAttributeInfo;
-import org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorInfo;
-import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoTranslator;
-
-import java.io.IOException;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
-import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.EIGHT_SPACE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.FOUR_SPACE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.SIXTEEN_SPACE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.TWELVE_SPACE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.TWENTY_EIGHT_SPACE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.TWENTY_FOUR_SPACE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.TWENTY_SPACE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getAppInstanceAttrString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getElseIfConditionBegin;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getEqualEqualString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getForLoopString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getIfConditionBegin;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getLeafFlagSetString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getNewInstance;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getOpenCloseParaWithValue;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getReturnString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getTwoParaEqualsString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.methodClose;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.multiAttrMethodSignature;
-import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.signatureClose;
-import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getBeanFiles;
-import static org.onosproject.yang.compiler.utils.UtilConstants.ADD_STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.AND_OPERATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.APP_INSTANCE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BIT_SET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BOOLEAN_DATA_TYPE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BREAK;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BUILDER;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BUILDER_LOWER_CASE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.BUILD_FOR_FILTER;
-import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS_STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.CLOSE_CURLY_BRACKET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.CLOSE_PARENTHESIS;
-import static org.onosproject.yang.compiler.utils.UtilConstants.COMMA;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_CAPS;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_OPEN_BRACKET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.ELSE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.EMPTY_STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.ENTRY;
-import static org.onosproject.yang.compiler.utils.UtilConstants.ENTRY_SET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.EQUAL;
-import static org.onosproject.yang.compiler.utils.UtilConstants.EQUALS_STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.EXTEND;
-import static org.onosproject.yang.compiler.utils.UtilConstants.FALSE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.FLAG;
-import static org.onosproject.yang.compiler.utils.UtilConstants.GET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.GET_KEY;
-import static org.onosproject.yang.compiler.utils.UtilConstants.GET_VALUE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.INSTANCE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG;
-import static org.onosproject.yang.compiler.utils.UtilConstants.IS_EMPTY;
-import static org.onosproject.yang.compiler.utils.UtilConstants.IS_SELECT_ALL_SCHEMA_CHILD_FLAG;
-import static org.onosproject.yang.compiler.utils.UtilConstants.KEYS;
-import static org.onosproject.yang.compiler.utils.UtilConstants.LEAF_IDENTIFIER;
-import static org.onosproject.yang.compiler.utils.UtilConstants.MAP;
-import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.NOT;
-import static org.onosproject.yang.compiler.utils.UtilConstants.NULL;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CLOSE_BRACKET_STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CURLY_BRACKET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_PARENTHESIS;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
-import static org.onosproject.yang.compiler.utils.UtilConstants.OR_OPERATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PRIVATE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PROCESS_CHILD_NODE_STF_PARAM;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PROCESS_LEAF_LIST_STF_PARAM;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PROCESS_LEAF_STF_PARAM;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PROCESS_SUBTREE_FILTERING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.PUBLIC;
-import static org.onosproject.yang.compiler.utils.UtilConstants.QUESTION_MARK;
-import static org.onosproject.yang.compiler.utils.UtilConstants.RESULT;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SELECT_ALL_CHILD;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SELECT_ALL_CHILD_SCHEMA_PARAM;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SELECT_LEAF;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SELECT_OR_CONTAINMENT_NODE_PARAM;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SEMI_COLON;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SET_METHOD_PREFIX;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SIXTEEN_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SPACE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.STF_BUILDER_PARAM;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SUBTREE_FILTERED;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SUBTREE_FILTERING_RESULT_BUILDER;
-import static org.onosproject.yang.compiler.utils.UtilConstants.THIRTY_TWO_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TO;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TRUE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TWENTY_EIGHT_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TWENTY_FOUR_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TWENTY_SPACE_INDENTATION;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TWO;
-import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF;
-import static org.onosproject.yang.compiler.utils.UtilConstants.VALUE_LEAF_SET;
-import static org.onosproject.yang.compiler.utils.UtilConstants.ZERO;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getCamelCase;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getCapitalCase;
-
-/**
- * Represents generator for subtree filtering methods of generated files
- * based on the file type.
- */
-public final class SubtreeFilteringMethodsGenerator {
-
-    /**
-     * private to make it a util.
-     */
-    private SubtreeFilteringMethodsGenerator() {
-    }
-
-    /**
-     * Returns process sub tree for choice interface class.
-     *
-     * @param node choice node
-     * @return process sub tree for choice interface class
-     */
-    static String getProcessSubTreeForChoiceInterface(YangNode node) {
-        if (!(node instanceof YangChoice)) {
-            throw new TranslatorException("process sub tree for interface is " +
-                                                  "only allowed in choice " +
-                                                  "node.");
-        }
-        JavaFileInfoTranslator info = ((JavaCodeGeneratorInfo) node)
-                .getJavaFileInfo();
-
-        String name = info.getJavaName();
-        String returnType = getCapitalCase(name);
-
-        String javadoc = "\n   /**\n" +
-                "     * Applications need not to implement process subtree " +
-                "of " + name + "\n     * it will be overridden by " +
-                "corresponding case class.\n" +
-                "     *\n" +
-                "     * @param " + APP_INSTANCE + SPACE +
-                APP_INSTANCE + SPACE + "being passed to check" +
-                " for" +
-                " content match\n" +
-                "     * @param isSelectAllSchemaChild is select all schema child\n" +
-                "     * @return match result\n" +
-                "     */\n";
-        StringBuilder builder = new StringBuilder(javadoc);
-        Map<String, String> param = new LinkedHashMap<>();
-        param.put(APP_INSTANCE, returnType);
-        param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
-        builder.append(multiAttrMethodSignature(PROCESS_SUBTREE_FILTERING, null,
-                                                DEFAULT, returnType, param,
-                                                CLASS_TYPE))
-                .append(getReturnString(NULL, EIGHT_SPACE_INDENTATION))
-                .append(signatureClose()).append(methodClose(FOUR_SPACE));
-        return builder.toString();
-    }
-
-    /**
-     * Returns is filter content match for leaf.
-     *
-     * @param javaAttributeInfo java attribute
-     * @param type              data type
-     * @return is filter content match for leaf
-     */
-    public static String getSubtreeFilteringForLeaf(
-            JavaAttributeInfo javaAttributeInfo, YangType<?> type) {
-        String attrQualifiedType;
-        String attributeName = javaAttributeInfo.getAttributeName();
-        attrQualifiedType = getIfFilterContentMatchMethodImpl(attributeName,
-                                                              type);
-        /* 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());
-         * }*/
-
-/*        if (isSubTreeFiltered && !appInstance.isLeafValueSet(
-                LeafIdentifier.LEAF2)) {
-            subTreeFilteringResultBuilder.leaf2(leaf2());
-        } else {
-            return false;
-        }*/
-        String condition = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + NOT +
-                APP_INSTANCE + PERIOD + VALUE_LEAF_SET +
-                getOpenCloseParaWithValue(
-                        LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase());
-        return getIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
-                attributeName, VALUE_LEAF, EMPTY_STRING, GET)) +
-                getIfConditionBegin(TWELVE_SPACE_INDENTATION, attrQualifiedType) +
-                getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, condition) +
-                TWENTY_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
-                PERIOD + attributeName + getOpenCloseParaWithValue(
-                attributeName + OPEN_CLOSE_BRACKET_STRING) + signatureClose() +
-                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
-                OPEN_CURLY_BRACKET + NEW_LINE + getReturnString(
-                FALSE, TWENTY_SPACE_INDENTATION) + signatureClose() +
-                SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
-                TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
-                OPEN_CURLY_BRACKET + NEW_LINE +
-                getSubTreeBuilderCallString(SIXTEEN_SPACE_INDENTATION, attributeName,
-                                            TWELVE_SPACE) +
-                getElseIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
-                        attributeName, SELECT_LEAF, EMPTY_STRING, GET) + SPACE +
-                        OR_OPERATION + SPACE + IS_SELECT_ALL_SCHEMA_CHILD_FLAG) +
-                getSelectOrContainmentAssignString() +
-                getSubTreeBuilderCallString(TWELVE_SPACE_INDENTATION, attributeName,
-                                            EIGHT_SPACE);
-    }
-
-    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.
-                NOT + APP_INSTANCE + PERIOD + GET_VALUE_LEAF_FLAGS +
-                OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
-                GET_METHOD_PREFIX + OPEN_PARENTHESIS + LEAF_IDENTIFIER +
-                PERIOD + attributeName.toUpperCase() + PERIOD
-                + GET_LEAF_INDEX + OR_OPERATION +*/
-                APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS +
-                        CLOSE_PARENTHESIS + SPACE + NOT + EQUAL + SPACE +
-                        attributeName + OPEN_PARENTHESIS +
-                        CLOSE_PARENTHESIS;
-    }
-
-    private static String attrTypeForFcmWhenNonPrimitiveDataTypes(String name) {
-        /*
-         * appInstance.name() == null || name().equals(appInstance.name())
-         */
-        return getEqualEqualString(getAppInstanceAttrString(name), NULL) +
-                SPACE + OR_OPERATION + SPACE + NOT + OPEN_PARENTHESIS +
-                getTwoParaEqualsString(name + OPEN_CLOSE_BRACKET_STRING,
-                                       getAppInstanceAttrString(name))
-                + CLOSE_PARENTHESIS;
-    }
-
-    private static String getIfFilterContentMatchMethodImpl(
-            String name, YangType dataType) {
-        String attrQualifiedType;
-        if (dataType.getDataType().isPrimitiveDataType()) {
-            attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
-        } else if (dataType.getDataType() == LEAFREF) {
-
-            // When leafref in grouping.
-            if (((YangLeafRef) dataType.getDataTypeExtendedInfo())
-                    .isInGrouping()) {
-                attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
-            } else {
-                YangType type = ((YangLeafRef) dataType.getDataTypeExtendedInfo())
-                        .getEffectiveDataType();
-                if (type.getDataType().isPrimitiveDataType()) {
-                    attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
-                } else {
-                    attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(
-                            name);
-                }
-            }
-        } else {
-            attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
-        }
-        return attrQualifiedType;
-    }
-
-    /**
-     * Returns is filter content match for leaf.
-     *
-     * @param javaAttributeInfo java attribute
-     * @return is filter content match for leaf
-     */
-    public static String getSubtreeFilteringForLeafList(
-            JavaAttributeInfo javaAttributeInfo) {
-        return getSubtreeFilteringForList(javaAttributeInfo, true, null);
-    }
-
-    /**
-     * Returns is filter content match for child node.
-     *
-     * @param curNode current node
-     * @param path    path of temp file
-     * @return is filter content match for child node
-     */
-    static String getProcessChildNodeSubtreeFiltering(YangNode curNode, String path)
-            throws IOException {
-       /* Generate code will look like this.
-        private boolean processChildNodesSubTreeFiltering(Link
- appInstance, LinkBuilder subTreeFilteringResultBuilder,
-                Boolean isAnySelectOrContainmentNode, boolean isSelectAllSchemaChild) {
-            if (isSelectAllSchemaChild) {
-                for (Areas areas : appInstance.areas()) {
-                    subTreeFilteringResultBuilder.addToAreas(areas);
-                }
-            } else if (areas() != null) {
-                isAnySelectOrContainmentNode = true;
-                if (!areas().isEmpty()) {
-                    if (appInstance.areas() != null && !appInstance.areas().isEmpty()) {
-                        for (Areas areas : areas()) {
-                            for (Areas areas2 : appInstance.areas()) {
-                                Areas result = areas.processSubtreeFiltering(areas2, false);
-                                if (result != null) {
-                                    subTreeFilteringResultBuilder.addToAreas(result);
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    if (appInstance.areas() != null && !appInstance.areas().isEmpty()) {
-                        for (Areas areas : appInstance.areas()) {
-                            subTreeFilteringResultBuilder.addToAreas(areas);
-                        }
-                    }
-                }
-            }
-
-            return true;
-        }*/
-        return getProcessStfMethods(PROCESS_CHILD_NODE_STF_PARAM, curNode,
-                                    path, FILTER_CONTENT_MATCH_FOR_NODES_MASK);
-    }
-
-    /**
-     * Returns is filter content match for leaf list.
-     *
-     * @param curNode current node
-     * @param path    path of temp file
-     * @return is filter content match for leaf list
-     */
-    static String getProcessLeafListSubtreeFiltering(YangNode curNode, String path)
-            throws IOException {
-       /* Generate code will look like this.
-        private boolean processLeafListSubTreeFiltering(Link appInstance, LinkBuilder subTreeFilteringResultBuilder,
-                Boolean isAnySelectOrContainmentNode, boolean isSelectAllSchemaChild) {
-            if (isSelectAllSchemaChild) {
-                for (String portId : appInstance.portId()) {
-                    subTreeFilteringResultBuilder.addToPortId(portId);
-                }
-            } else if (portId() != null) {
-                if (!portId().isEmpty()) {
-                    if (appInstance.portId() == null || appInstance.portId().isEmpty()) {
-                        return false;
-                    }
-                    for (String portId : portId()) {
-                        boolean flag = false;
-                        for (String portId2 : appInstance.portId()) {
-                            if (portId.equals(portId2)) {
-                                flag = true;
-                                subTreeFilteringResultBuilder.addToPortId(portId2);
-                                break;
-                            }
-                        }
-                        if (!flag) {
-                            return false;
-                        }
-                    }
-                } else {
-                    isAnySelectOrContainmentNode = true;
-                    if (appInstance.portId() != null && !appInstance.portId().isEmpty()) {
-                        for (String portId : appInstance.portId()) {
-                            subTreeFilteringResultBuilder.addToPortId(portId);
-                        }
-                    }
-                }
-            }
-
-            return true;
-        }*/
-        return getProcessStfMethods(PROCESS_LEAF_LIST_STF_PARAM, curNode, path,
-                                    FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK);
-    }
-
-    /**
-     * Returns is filter content match for leaf.
-     *
-     * @param curNode current node
-     * @param path    path of temp file
-     * @return is filter content match for leaf
-     */
-    static String getProcessLeafSubtreeFiltering(YangNode curNode, String path)
-            throws IOException {
-     /* Generate code will look like this.
-      private boolean processLeafSubtreeFiltering(Link appInstance, LinkBuilder subTreeFilteringResultBuilder,
-                Boolean isAnySelectOrContainmentNode, boolean isSelectAllSchemaChild) {
-            if (valueLeafFlags.get(LeafIdentifier.PORT.getLeafIndex())) {
-                if (appInstance.port() != port()) {
-                    return false;
-                } else {
-                    subTreeFilteringResultBuilder.port(appInstance.port());
-                }
-            } else if (selectLeafFlags.get(LeafIdentifier.PORT.getLeafIndex()) || isSelectAllSchemaChild) {
-                isAnySelectOrContainmentNode = true;
-                subTreeFilteringResultBuilder.port(appInstance.port());
-            }
-
-            return true;
-        }*/
-        return getProcessStfMethods(PROCESS_LEAF_STF_PARAM, curNode, path,
-                                    FILTER_CONTENT_MATCH_FOR_LEAF_MASK);
-    }
-
-    /**
-     * Returns is filter content match for leaf.
-     *
-     * @param curNode current node
-     * @return is filter content match for leaf
-     */
-    static String getProcessSubtreeFilteringStart(YangNode curNode) {
-
-       /* Generate code will look like this.
-       public Link processSubtreeFiltering(Link appInstance, boolean isSelectAllSchemaChild) {
-            LinkBuilder subTreeFilteringResultBuilder = new LinkBuilder();
-            Boolean isAnySelectOrContainmentNode = false;
-        */
-        StringBuilder builder = new StringBuilder();
-        JavaFileInfoTranslator javaFileInfo =
-                ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        String instance = APP_INSTANCE;
-        String name = getCapitalCase(javaFileInfo.getJavaName());
-        String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        String caseName = getNameOfClassForIfCase(curNode);
-        String returnType;
-        if (curNode instanceof RpcNotificationContainer) {
-            returnType = name + OP_PARAM;
-        } else {
-            returnType = DEFAULT_CAPS + name;
-        }
-        if (caseName != null) {
-            instance = INSTANCE;
-            name = caseName;
-        }
-
-        String javadoc = "\n    /**\n" +
-                "     * Checks if the passed " + name + " maps the content " +
-                "match query condition.\n" +
-                "     *\n" +
-                "     * @param " + instance + SPACE + instance + SPACE +
-                "being passed to check for content match\n" +
-                "     * @param isSelectAllSchemaChild is select all schema " +
-                "child\n" +
-                "     * @return match result\n" +
-                "     */\n";
-        Map<String, String> param = new LinkedHashMap<>();
-        param.put(instance, name);
-        param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
-        builder.append(javadoc)
-                .append(multiAttrMethodSignature(PROCESS_SUBTREE_FILTERING, null,
-                                                 PUBLIC, returnType, param,
-                                                 CLASS_TYPE));
-
-        builder.append(getNewInstance(builderNamePrefix + BUILDER,
-                                      SUBTREE_FILTERING_RESULT_BUILDER,
-                                      EIGHT_SPACE_INDENTATION, EMPTY_STRING));
-        builder.append(getNewInstance(BIT_SET,
-                                      IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG,
-                                      EIGHT_SPACE_INDENTATION, EMPTY_STRING));
-        if (caseName != null) {
-            builder.append(getCaseCastString(javaFileInfo, instance, curNode));
-        }
-
-        return builder.toString();
-    }
-
-    /**
-     * Returns all process sub tree method implementations.
-     *
-     * @param methodName method name
-     * @param curNode    current node
-     * @param path       path for temporary file
-     * @param file       temp file
-     * @return method implementations
-     * @throws IOException when fails to fetch data from temp files
-     */
-    private static String getProcessStfMethods(
-            String methodName, YangNode curNode, String path, int file)
-            throws IOException {
-        StringBuilder builder = new StringBuilder(EMPTY_STRING);
-        JavaFileInfoTranslator javaFileInfo =
-                ((JavaFileInfoContainer) curNode).getJavaFileInfo();
-        String instance = APP_INSTANCE;
-        String name = getCapitalCase(javaFileInfo.getJavaName());
-        String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
-        String caseName = getNameOfClassForIfCase(curNode);
-        if (caseName != null) {
-            instance = INSTANCE;
-            name = caseName;
-        }
-
-        Map<String, String> param = new LinkedHashMap<>();
-        param.put(instance, name);
-        param.put(STF_BUILDER_PARAM, builderNamePrefix + BUILDER);
-        param.put(SELECT_OR_CONTAINMENT_NODE_PARAM, BIT_SET);
-        param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
-
-        builder.append(multiAttrMethodSignature(methodName, null,
-                                                PRIVATE, BOOLEAN_DATA_TYPE, param, CLASS_TYPE));
-
-        if (caseName != null) {
-            builder.append(getCaseCastString(javaFileInfo, instance, curNode));
-        }
-        builder.append(getDataFromTempFileHandle(file,
-                                                 getBeanFiles(curNode), path))
-                .append(getReturnString(TRUE, EIGHT_SPACE_INDENTATION)).append(
-                signatureClose()).append(methodClose(FOUR_SPACE))
-                .append(NEW_LINE);
-        return builder.toString();
-    }
-
-    /**
-     * Returns the body for process subtree filtering.
-     *
-     * @param curNode node for which the code is being generated
-     * @return body of subtree filtering
-     */
-    static String getProcessSubtreeFunctionBody(YangNode curNode) {
-        StringBuilder builder = new StringBuilder();
-
-       /* if (!processLeafSubtreeFiltering(appInstance, subTreeFilteringResultBuilder,
-                                         isAnySelectOrContainmentNode, isSelectAllSchemaChild)) {
-            return null;
-        }
-        if (!processLeafListSubTreeFiltering(appInstance, subTreeFilteringResultBuilder,
-                                             isAnySelectOrContainmentNode, isSelectAllSchemaChild)) {
-            return null;
-        }
-        if (!processChildNodesSubTreeFiltering(appInstance, subTreeFilteringResultBuilder,
-                                               isAnySelectOrContainmentNode, isSelectAllSchemaChild)) {
-            return null;
-        }
-      */
-        if (curNode instanceof YangLeavesHolder) {
-            YangLeavesHolder holder = (YangLeavesHolder) curNode;
-            if (!holder.getListOfLeaf().isEmpty()) {
-                builder.append(getInnerStfMethodClass(PROCESS_LEAF_STF_PARAM));
-            }
-            if (!holder.getListOfLeafList().isEmpty()) {
-                builder.append(getInnerStfMethodClass(PROCESS_LEAF_LIST_STF_PARAM));
-            }
-        }
-        if (curNode.getChild() != null) {
-            builder.append(getInnerStfMethodClass(PROCESS_CHILD_NODE_STF_PARAM));
-        }
-
-        return builder.toString();
-    }
-
-    //Method calls for process subtree filtering method.
-    private static String getInnerStfMethodClass(String name) {
-        StringBuilder builder = new StringBuilder()
-                .append(getIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                            getMethodCallsConditionsForStfMethods(name)))
-                .append(getReturnString(NULL, TWELVE_SPACE_INDENTATION)).append(
-                        signatureClose()).append(methodClose(EIGHT_SPACE));
-        return builder.toString();
-    }
-
-    // Condition for if check in process sub tree method.
-    private static String getMethodCallsConditionsForStfMethods(String name) {
-        return NOT + name + getOpenCloseParaWithValue(getConditionString());
-    }
-
-    //variable call for conditional method call
-    private static String getConditionString() {
-        return APP_INSTANCE + COMMA + SPACE + SUBTREE_FILTERING_RESULT_BUILDER +
-                COMMA + SPACE + SELECT_OR_CONTAINMENT_NODE_PARAM + COMMA + SPACE +
-                SELECT_ALL_CHILD;
-    }
-
-    /**
-     * 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, YangNode node) {
-        boolean isList = attr.isListAttr();
-        if (isList) {
-            return getSubtreeFilteringForList(attr, false, node);
-        } else {
-            return getSubtreeFilteringForChildNode(attr, node);
-        }
-    }
-
-    /**
-     * Returns is filter content match close.
-     *
-     * @param name name of class
-     * @return is filter content match close
-     */
-    static String getProcessSubTreeFilteringEnd(String name) {
-        /* generate code will look like this.
-        if (!isSelectAllSchemaChild && !isAnySelectOrContainmentNode) {
-            return processSubtreeFiltering(appInstance, true);
-        }
-        return subTreeFilteringResultBuilder.build();
-        */
-
-        StringBuilder builder = new StringBuilder();
-        String cond1 = NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG + SPACE + AND_OPERATION +
-                SPACE + NOT + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
-                PERIOD + GET + getOpenCloseParaWithValue(ZERO);
-        String call = PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
-                APP_INSTANCE + COMMA + SPACE + TRUE);
-        builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond1))
-                .append(getReturnString(call, TWELVE_SPACE_INDENTATION))
-                .append(signatureClose()).append(methodClose(EIGHT_SPACE));
-
-        call = getOpenCloseParaWithValue(name) + SPACE +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + BUILD_FOR_FILTER +
-                OPEN_CLOSE_BRACKET_STRING;
-        builder.append(getReturnString(call, EIGHT_SPACE_INDENTATION))
-                .append(signatureClose()).append(methodClose(FOUR_SPACE))
-                .append(NEW_LINE);
-        return builder.toString();
-    }
-
-    /**
-     * Returns filter content match for child nodes.
-     *
-     * @param attr attribute to be added
-     * @param node YANG node
-     * @return filter content match for child nodes
-     */
-    private static String getSubtreeFilteringForChildNode(JavaAttributeInfo attr,
-                                                          YangNode node) {
-        StringBuilder builder = new StringBuilder();
-        String name = attr.getAttributeName();
-        String clsInfo = attr.getImportInfo()
-                .getClassInfo();
-        String type = DEFAULT_CAPS + attr.getImportInfo()
-                .getClassInfo();
-        if (attr.isQualifiedName()) {
-            type = attr.getImportInfo().getPkgInfo() + PERIOD +
-                    type;
-            clsInfo = attr.getImportInfo().getPkgInfo() + PERIOD +
-                    clsInfo;
-        }
-        String classCast = getOpenCloseParaWithValue(type) + SPACE;
-        String cast = getOpenCloseParaWithValue(classCast + name);
-        if (node != null && node instanceof YangChoice) {
-            cast = name;
-        }
-
-        String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
-                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
-                + APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
-                + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
-                NEW_LINE;
-
-        String cond1 = name + OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL +
-                SPACE + NULL + SPACE + OR_OPERATION + SPACE + SELECT_ALL_CHILD;
-        builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond1))
-                .append(getSelectOrContainmentAssignString());
-
-        builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
-                                           getAppInstanceCondition(name, NOT)));
-
-        String assignment = SIXTEEN_SPACE_INDENTATION + clsInfo + SPACE + RESULT +
-                SPACE + EQUAL + SPACE + NULL + signatureClose();
-
-        builder.append(assignment)
-                .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                            SELECT_ALL_CHILD));
-/*
-        result = ((DefaultInterfaces)(DefaultInterfaces.builder()
-                .build())).processSubtreeFiltering(appInstance.interfaces(),
-                                                   true);*/
-
-        assignment = getDummyObjectCreation(node, name, clsInfo, type,
-                                            classCast, false, false);
-        builder.append(assignment).append(SIXTEEN_SPACE_INDENTATION).append(
-                CLOSE_CURLY_BRACKET).append(ELSE).append(OPEN_CURLY_BRACKET)
-                .append(NEW_LINE);
-
-        assignment = TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE
-                + resultString;
-        cond1 = RESULT + SPACE + NOT + EQUAL + SPACE + NULL;
-
-        builder.append(assignment).append(methodClose(SIXTEEN_SPACE))
-                .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond1));
-
-        assignment = TWENTY_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
-                PERIOD + name + getOpenCloseParaWithValue(RESULT) +
-                signatureClose();
-        builder.append(assignment).append(methodClose(SIXTEEN_SPACE)).append(
-                TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
-                .append(getSubTreeFilteredCondition(name)).append(methodClose(EIGHT_SPACE));
-        return builder.toString();
-    }
-
-    private static String getAppInstanceCondition(String name, String condition) {
-        return APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING + SPACE +
-                condition + EQUAL + SPACE + NULL;
-    }
-
-    private static String getSelectOrContainmentAssignString() {
-        return TWELVE_SPACE_INDENTATION + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
-                PERIOD + SET_METHOD_PREFIX + getOpenCloseParaWithValue(ZERO) +
-                signatureClose();
-    }
-
-    /**
-     * Returns filter content match for list types.
-     *
-     * @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,
-            YangNode node) {
-        StringBuilder builder = new StringBuilder();
-        String caps = getCapitalCase(javaAttributeInfo.getAttributeName());
-        String name = javaAttributeInfo.getAttributeName();
-        String type = javaAttributeInfo.getImportInfo().getClassInfo();
-        if (javaAttributeInfo.getAttributeType() != null && javaAttributeInfo
-                .getAttributeType().getDataType() == IDENTITYREF) {
-            type = CLASS_STRING + DIAMOND_OPEN_BRACKET +
-                    QUESTION_MARK + SPACE + EXTEND + SPACE +
-                    type + DIAMOND_CLOSE_BRACKET;
-        }
-
-        YangDataStructure struct =
-                getYangDataStructure(javaAttributeInfo.getCompilerAnnotation());
-
-        boolean isMap = false;
-        if (struct != null && struct == YangDataStructure.MAP) {
-            isMap = true;
-        }
-
-        String clsInfo = DEFAULT_CAPS + type;
-        if (javaAttributeInfo.isQualifiedName()) {
-            if (javaAttributeInfo.getAttributeType() != null && javaAttributeInfo
-                    .getAttributeType().getDataType() == IDENTITYREF) {
-                type = CLASS_STRING + DIAMOND_OPEN_BRACKET +
-                        QUESTION_MARK + SPACE + EXTEND + SPACE +
-                        javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
-                        type + DIAMOND_CLOSE_BRACKET;
-            } else {
-                type = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
-                        type;
-            }
-            clsInfo = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
-                    clsInfo;
-        }
-
-        String classCast = getOpenCloseParaWithValue(clsInfo) + SPACE;
-        String cast = getOpenCloseParaWithValue(classCast + name);
-
-        if (node != null && node instanceof YangChoice) {
-            cast = name;
-        }
-        String validPass;
-        //If map is in DS then need to pass name.getValue() to processSubTree.
-        if (isMap) {
-            validPass = name + TWO + PERIOD + GET_VALUE;
-        } else {
-            validPass = name + TWO;
-        }
-        String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
-                PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
-                validPass + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
-                NEW_LINE;
-        /*
-         * If select all schema child
-         */
-        String forCondition;
-        String mapEntry;
-        String para;
-        //If map is there in DS the for loop should run for map entry.
-        if (!isMap) {
-            forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
-                                            getAppInstanceAttrString(name));
-        } else {
-            mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
-                    KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
-            para = getAppInstanceAttrString(name) + PERIOD + ENTRY_SET;
-            forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION,
-                                            mapEntry, name, para);
-        }
-        builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION,
-                                           IS_SELECT_ALL_SCHEMA_CHILD_FLAG))
-                .append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
-                                            getAppInstanceCondition(name, NOT)))
-                .append(forCondition);
-        String assignment;
-        String result;
-        //If map is added then while creating dummy object need to used name
-        // .getValue() and to add the result in subTreeBuilder need to pass
-        // using key and value, key will be name.getKey() and value will be
-        // result.
-        if (isMap) {
-            result = getOpenCloseParaWithValue(name + PERIOD + GET_KEY + COMMA +
-                                                       SPACE + RESULT);
-        } else {
-            result = getOpenCloseParaWithValue(RESULT);
-        }
-        if (!isLeafList) {
-            builder.append(TWENTY_SPACE_INDENTATION).append(type).append(SPACE)
-                    .append(RESULT).append(signatureClose());
-            assignment = getDummyObjectCreation(node, name, type, clsInfo,
-                                                classCast, true, isMap);
-            builder.append(assignment);
-            assignment = TWENTY_SPACE_INDENTATION +
-                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
-                    getCapitalCase(TO) + caps + result +
-                    signatureClose();
-            builder.append(assignment);
-        } else {
-            assignment = TWENTY_SPACE_INDENTATION +
-                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
-                    getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name) +
-                    signatureClose();
-            builder.append(assignment);
-        }
-        builder.append(methodClose(SIXTEEN_SPACE))
-                .append(TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET);
-
-/*    } else {
-        if (isSubTreeFiltered && leafList2() != null) {
-            subTreeFilteringResultBuilder.addToLeafList2(leafList2());
-        }
-    }*/
-        builder.append(getSubTreeFilteredCondition(name));
-
-        String cond = name + OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL +
-                SPACE + NULL;
-
-        //If need to explicitly participate in query
-        builder.append(getElseIfConditionBegin(EIGHT_SPACE_INDENTATION, cond));
-
-        if (!isLeafList) {
-            builder.append(getSelectOrContainmentAssignString());
-        }
-
-        //If there is any parameter in the query condition
-        cond = NOT + name + OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY;
-        builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION, cond));
-
-        if (isLeafList) {
-            cond = getAppInstanceCondition(name, EQUAL) + SPACE + OR_OPERATION +
-                    SPACE + APP_INSTANCE + PERIOD + name +
-                    OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY;
-            /*
-             * If there is no app instance to perform content match
-             */
-            builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
-                    .append(getReturnString(FALSE, TWENTY_SPACE_INDENTATION))
-                    .append(signatureClose())
-                    .append(methodClose(SIXTEEN_SPACE))
-                    // for instance iterator
-                    .append(getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
-                                             name + OPEN_CLOSE_BRACKET_STRING));
-
-            assignment = TWENTY_SPACE_INDENTATION + BOOLEAN_DATA_TYPE + SPACE +
-                    FLAG + SPACE + EQUAL + SPACE + FALSE + signatureClose();
-            builder.append(assignment)
-                    // for app instance iterator
-                    .append(getForLoopString(TWENTY_SPACE_INDENTATION, type,
-                                             name + TWO,
-                                             getAppInstanceAttrString(name)));
-
-            cond = name + PERIOD + EQUALS_STRING
-                    + OPEN_PARENTHESIS + name + TWO + CLOSE_PARENTHESIS;
-            //the content match leaf list attribute value matches
-            builder.append(getIfConditionBegin(TWENTY_FOUR_SPACE_INDENTATION,
-                                               cond));
-
-            assignment = TWENTY_EIGHT_SPACE_INDENTATION + FLAG + SPACE + EQUAL +
-                    SPACE + TRUE + SEMI_COLON + NEW_LINE;
-            builder.append(assignment);
-            assignment = TWENTY_EIGHT_SPACE_INDENTATION +
-                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
-                    getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name + TWO) +
-                    signatureClose();
-            builder.append(assignment).append(TWENTY_EIGHT_SPACE_INDENTATION)
-                    .append(BREAK).append(signatureClose())
-                    //the content match leaf list attribute value matches
-                    .append(methodClose(TWENTY_FOUR_SPACE))
-                    // for app instance iterator
-                    .append(methodClose(TWENTY_SPACE))
-                    //if the content match failed
-                    .append(getIfConditionBegin(TWENTY_SPACE_INDENTATION, NOT +
-                            FLAG))
-                    .append(getReturnString(FALSE, TWENTY_FOUR_SPACE_INDENTATION))
-                    .append(signatureClose()).append(methodClose(TWENTY_SPACE))// if flag == false
-                    .append(methodClose(SIXTEEN_SPACE)); // for instance iterator
-        } else {
-            cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
-                    SPACE + NOT + getAppInstanceAttrString(name) +
-                    PERIOD + IS_EMPTY;
-            //Same here for loop for map entry.
-            if (!isMap) {
-                forCondition = getForLoopString(TWENTY_SPACE_INDENTATION, type,
-                                                name + TWO,
-                                                getAppInstanceAttrString(name));
-            } else {
-                mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
-                        KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
-                para = getAppInstanceAttrString(name) + PERIOD + ENTRY_SET;
-                forCondition = getForLoopString(TWENTY_SPACE_INDENTATION,
-                                                mapEntry, name + TWO, para);
-            }
-            String forCondition2;
-            //Same here for loop for map entry.
-            if (!isMap) {
-                forCondition2 = getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
-                                                 name + OPEN_CLOSE_BRACKET_STRING);
-            } else {
-                mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
-                        KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
-                para = name + OPEN_CLOSE_BRACKET_STRING + PERIOD + ENTRY_SET;
-                forCondition2 = getForLoopString(SIXTEEN_SPACE_INDENTATION,
-                                                 mapEntry, name, para);
-            }
-            /*if there is any app instance entry*/
-            builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
-                                               cond))
-                    //loop all the app instance(s)
-                    .append(forCondition2)
-                    .append(forCondition);
-
-            assignment = TWENTY_EIGHT_SPACE_INDENTATION + type + SPACE +
-                    RESULT + SPACE + EQUAL + SPACE + resultString;
-            builder.append(assignment);
-            cond = RESULT + SPACE + NOT + EQUAL + SPACE + NULL;
-            builder.append(getIfConditionBegin(TWENTY_EIGHT_SPACE_INDENTATION, cond));
-
-            //If map is added then while creating dummy object need to used name
-            // .getValue() and to add the result in subTreeBuilder need to pass
-            // using key and value, key will be name.getKey() and value will be
-            // result.
-            if (isMap) {
-                result = getOpenCloseParaWithValue(name + TWO + PERIOD + GET_KEY +
-                                                           COMMA +
-                                                           SPACE + RESULT);
-            } else {
-                result = getOpenCloseParaWithValue(RESULT);
-            }
-            assignment = THIRTY_TWO_SPACE_INDENTATION +
-                    SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
-                    getCapitalCase(TO) + caps + result + signatureClose();
-            builder.append(assignment).append(methodClose(TWENTY_EIGHT_SPACE))
-                    //loop all the app instance(s)
-                    .append(methodClose(TWENTY_FOUR_SPACE))
-                    //loop all the query condition instance(s)
-                    .append(methodClose(TWENTY_SPACE))
-                    .append(SIXTEEN_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
-                    .append(getSubTreeFilteredCondition(name));
-            //if there is any app instance entry
-        }
-
-        cond = TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET
-                + ELSE + OPEN_CURLY_BRACKET + NEW_LINE;
-        builder.append(cond);
-
-        if (isLeafList) {
-            builder.append(getSelectOrContainmentAssignString());
-        }
-
-        //need to pass name.getKey() and name.getValue() while adding to
-        // subtree builder.
-        if (!isMap) {
-            forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION, type,
-                                            name, getAppInstanceAttrString(name));
-        } else {
-            mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
-                    KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
-            para = getAppInstanceAttrString(name) + PERIOD + ENTRY_SET;
-            forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION,
-                                            mapEntry, name, para);
-        }
-        cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
-                SPACE + NOT + getAppInstanceAttrString(name) + PERIOD + IS_EMPTY;
-        builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
-                .append(forCondition);
-        if (isMap) {
-            result = getOpenCloseParaWithValue(name + PERIOD + GET_KEY + COMMA +
-                                                       SPACE + name + PERIOD +
-                                                       GET_VALUE);
-        } else {
-            result = getOpenCloseParaWithValue(name);
-        }
-        assignment = TWENTY_FOUR_SPACE_INDENTATION +
-                SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
-                getCapitalCase(TO) + caps + result + signatureClose();
-        builder.append(assignment).append(methodClose(TWENTY_SPACE))// Close collection Iteration loop
-                // close  if condition
-                .append(methodClose(SIXTEEN_SPACE))
-                .append(methodClose(TWELVE_SPACE))// close  else condition
-                .append(methodClose(EIGHT_SPACE));// close else if condition
-
-        return builder.toString();
-    }
-
-    public static String getAugmentableSubTreeFiltering() {
-        return "        if (yangAugmentedInfoMap.isEmpty()) {\n" +
-                "            java.util.Set<Map.Entry<Class<?>, Object>> " +
-                "augment =" +
-                " appInstance.yangAugmentedInfoMap().entrySet();\n" +
-                "            if (augment != null && !augment.isEmpty()) {\n" +
-                "                java.util.Iterator<Map.Entry<Class<?>, " +
-                "Object>> augItr =" +
-                " augment.iterator();\n" +
-                "                while (augItr.hasNext()) {\n" +
-                "                    Map.Entry<Class<?>, Object> aug =" +
-                " augItr.next();\n" +
-                "                    Class<?> augClass = aug.getKey();\n" +
-                "                    String augClassName = augClass.getName();\n" +
-                "                    int index = augClassName.lastIndexOf('.');\n" +
-                "                    String classPackage = augClassName.substring(0, index) +\n" +
-                "                            \".\" + \"Default\" + augClass.getSimpleName() + \"$\"\n" +
-                "                            + augClass.getSimpleName() + \"Builder\";\n" +
-                "                    ClassLoader classLoader = augClass.getClassLoader();\n" +
-                "                    try {\n" +
-                "                        Class<?> builderClass;\n" +
-                "                        builderClass = classLoader.loadClass(classPackage);\n" +
-                "                        Object builderObj = builderClass.newInstance();\n" +
-                "                        java.lang.reflect.Method method = " +
-                "builderClass.getMethod(\"build\");\n" +
-                "                        Object defaultObj = method.invoke(builderObj);\n" +
-                "                        Class<?> defaultClass = defaultObj.getClass();\n" +
-                "                        method = defaultClass.getMethod(" +
-                "\"processSubtreeFiltering\", augClass, boolean.class);\n" +
-                "                        Object result = method.invoke(" +
-                "defaultObj, aug.getValue(), true);\n" +
-                "                        subTreeFilteringResultBuilder." +
-                "addYangAugmentedInfo(result, augClass);\n" +
-                "                    } catch (ClassNotFoundException | InstantiationException\n" +
-                "                            | NoSuchMethodException |\n" +
-                "                            InvocationTargetException | IllegalAccessException e) {\n" +
-                "                    }\n" +
-                "                }\n" +
-                "            }\n" +
-                "        } else {\n" +
-                "            java.util.Set<Map.Entry<Class<?>, Object>> augment = yangAugmentedInfoMap\n" +
-                "                    .entrySet();\n" +
-                "            java.util.Iterator<Map.Entry<Class<?>, Object>> augItr = augment.iterator();\n" +
-                "            while (augItr.hasNext()) {\n" +
-                "                Map.Entry<Class<?>, Object> aug = augItr.next();\n" +
-                "                Class<?> augClass = aug.getKey();\n" +
-                "                Object appInstanceInfo = appInstance." +
-                "yangAugmentedInfo(augClass);\n" +
-                "                if (appInstanceInfo == null) {\n" +
-                "                    subTreeFilteringResultBuilder." +
-                "addYangAugmentedInfo(aug.getValue(), aug.getKey());\n" +
-                "                } else {\n" +
-                "                    Object processSubtreeFiltering;\n" +
-                "                    try {\n" +
-                "                        processSubtreeFiltering = " +
-                "aug.getValue().getClass()\n" +
-                "                                .getMethod(\"processSubtreeFiltering\"," +
-                " aug.getKey(), boolean.class)\n" +
-                "                                .invoke(aug.getValue(), appInstanceInfo, true);\n" +
-                "                        if (processSubtreeFiltering != null) {\n" +
-                "                            subTreeFilteringResultBuilder\n" +
-                "                                    .addYangAugmentedInfo(" +
-                "processSubtreeFiltering, aug.getKey());\n" +
-                "                        }\n" +
-                "                    } catch (NoSuchMethodException | InvocationTargetException |\n" +
-                "                            IllegalAccessException e) {\n" +
-                "                    }\n" +
-                "                }\n" +
-                "            }\n" +
-                "        }\n";
-    }
-
-    private static String getSubTreeFilteredCondition(String name) {
-        StringBuilder builder = new StringBuilder();
-        String cond = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + name +
-                OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL + SPACE + NULL;
-
-        builder.append(ELSE).append(OPEN_CURLY_BRACKET).append(NEW_LINE)
-                .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
-                .append(TWENTY_SPACE_INDENTATION)
-                .append(SUBTREE_FILTERING_RESULT_BUILDER).append(PERIOD)
-                .append(name).append(getOpenCloseParaWithValue(name)).append(
-                signatureClose()).append(SIXTEEN_SPACE_INDENTATION).append(
-                CLOSE_CURLY_BRACKET).append(NEW_LINE).append(TWELVE_SPACE_INDENTATION)
-                .append(CLOSE_CURLY_BRACKET).append(NEW_LINE);
-        return builder.toString();
-    }
-
-    private static String getNameOfClassForIfCase(YangNode curNode) {
-        String name = null;
-        JavaFileInfoTranslator parentInfo;
-        if (curNode instanceof YangCase) {
-            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(),
-                            null));
-                }
-            }
-        }
-        return name;
-    }
-
-    private static String getCaseCastString(
-            JavaFileInfoTranslator javaFileInfo, String instance, YangNode curNode) {
-        if (curNode instanceof YangCase) {
-            String caseName = DEFAULT_CAPS + getCapitalCase(
-                    javaFileInfo.getJavaName());
-            return EIGHT_SPACE_INDENTATION + caseName + SPACE + APP_INSTANCE + SPACE +
-                    EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
-                    CLOSE_PARENTHESIS + SPACE + instance + signatureClose();
-        }
-        return null;
-    }
-
-    private static String getDummyObjectCreation(YangNode node, String name,
-                                                 String clsInfo, String type,
-                                                 String classCast, boolean isList,
-                                                 boolean isMap) {
-        String para = getAppInstanceAttrString(name);
-        if (isList) {
-            if (isMap) {
-                para = name + PERIOD + GET_VALUE;
-            } else {
-                para = name;
-            }
-        }
-        if (node != null && node instanceof YangChoice) {
-            return getChoiceReflectionResult(name, clsInfo);
-        }
-        return TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE +
-                getOpenCloseParaWithValue(
-                        classCast + type + PERIOD + BUILDER_LOWER_CASE +
-                                OPEN_CLOSE_BRACKET_STRING + NEW_LINE +
-                                TWENTY_EIGHT_SPACE_INDENTATION + PERIOD +
-                                BUILD_FOR_FILTER + OPEN_CLOSE_BRACKET_STRING) +
-                PERIOD + PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
-                para + COMMA + SPACE + TRUE) + signatureClose();
-    }
-
-    private static String getChoiceReflectionResult(String name, String returnType) {
-        String call = "appInstance." + name + "()";
-        return "                    Class<?>[] classArray = " + call + "" +
-                ".getClass()" +
-                ".getInterfaces();\n" +
-                "                    Class<?> caseIntf = classArray[0];\n" +
-                "                    try {\n" +
-                "                        ClassLoader classLoader = this" +
-                ".getClass().getClassLoader();\n" +
-                "                        String className = \"Default\" + " +
-                "caseIntf.getSimpleName();\n" +
-                "                        className = caseIntf.getPackage()" +
-                ".getName() + \".\" + className;\n" +
-                "                        Class<?> caseClass = classLoader" +
-                ".loadClass(className);\n" +
-                "                        java.lang.reflect.Constructor<?> " +
-                "constructor = caseClass.getDeclaredConstructor();\n" +
-                "                        constructor.setAccessible(true);\n" +
-                "                        Object obj1 = constructor" +
-                ".newInstance();\n" +
-                "                        java.lang.reflect.Method method =" +
-                " caseClass.getMethod(\"builder\");\n" +
-                "                        Object obj = method.invoke(obj1);\n" +
-                "                        Class<?> builderClass = obj.getClass();\n" +
-                "                        method = builderClass.getMethod(\"build\");\n" +
-                "                        Object obj2 = method.invoke(obj);\n" +
-                "                        Class<?> input = this.getClass()" +
-                ".getMethod(" + "\"" + name + "\").getReturnType();\n" +
-                "                        method = caseClass.getMethod" +
-                "(\"processSubtreeFiltering\", input,\n" +
-                "                                     boolean.class);\n" +
-                "                        result = (" + returnType + ") method.invoke" +
-                "(obj2, " + call + ", true);\n" +
-                "                    } catch (NoSuchMethodException | InstantiationException |\n" +
-                "                            IllegalAccessException | " +
-                "InvocationTargetException |\n" +
-                "                            ClassNotFoundException e) {\n" +
-                "                        e.printStackTrace();\n" +
-                "                    }\n";
-    }
-}
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
index bec4e2d..22a8f98 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
@@ -332,23 +332,6 @@
      * Static attribute for space.
      */
     public static final String SPACE = " ";
-    /**
-     * Static attribute for space.
-     */
-    public static final String TWO = "2";
-    /**
-     * Static attribute for space.
-     */
-    public static final String FLAG = "flag";
-    /**
-     * Static attribute for result.
-     */
-    public static final String RESULT = "result";
-
-    /**
-     * Static attribute for isSelectAllSchemaChild.
-     */
-    public static final String SELECT_ALL_CHILD = "isSelectAllSchemaChild";
 
     /**
      * Static attribute for schema name.
@@ -652,16 +635,6 @@
     public static final String KEYS = "Keys";
 
     /**
-     * Static attribute for key syntax.
-     */
-    public static final String GET_KEY = "getKey()";
-
-    /**
-     * Static attribute for key syntax.
-     */
-    public static final String GET_VALUE = "getValue()";
-
-    /**
      * Static attribute for -1 to syntax.
      */
     public static final String NEG_ONE = "-1";
@@ -909,36 +882,6 @@
      */
     public static final String OP_PARAM = "OpParam";
 
-
-    /**
-     * Static attribute for is filter content match method prefix.
-     */
-    public static final String PROCESS_SUBTREE_FILTERING =
-            "processSubtreeFiltering";
-
-    /**
-     * variable name of the subtree  filtering result builder.
-     */
-    public static final String SUBTREE_FILTERING_RESULT_BUILDER =
-            "subTreeFilteringResultBuilder";
-
-    /**
-     * variable name of the subtree  filtering result flag.
-     */
-    public static final String IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG =
-            "isAnySelectOrContainmentNode";
-
-    /**
-     * variable name of the subtree  filtering to select all child.
-     */
-    public static final String IS_SELECT_ALL_SCHEMA_CHILD_FLAG =
-            "isSelectAllSchemaChild";
-
-    /**
-     * Static attribute for break prefix.
-     */
-    public static final String BREAK = "break";
-
     /**
      * Static attribute for isEmpty.
      */
@@ -980,21 +923,6 @@
     public static final String VALUE_LEAF = "valueLeafFlags";
 
     /**
-     * Static attribute for is selectLeafFlags method prefix.
-     */
-    public static final String SELECT_LEAF = "selectLeafFlags";
-
-    /**
-     * Static attribute for is isSelectLeaf method prefix.
-     */
-    public static final String IS_SELECT_LEAF = "isSelectLeaf";
-
-    /**
-     * Static attribute for is selectLeaf method prefix.
-     */
-    public static final String SET_SELECT_LEAF = "selectLeaf";
-
-    /**
      * Static attribute for is LeafIdentifier enum prefix.
      */
     public static final String LEAF_IDENTIFIER = "LeafIdentifier";
@@ -1512,6 +1440,11 @@
     public static final String JAVA_UTIL_PKG = "java.util";
 
     /**
+     * Static attribute for model object import package.
+     */
+    public static final String MODEL_OBJECT_PKG = "org.onosproject.yang.model";
+
+    /**
      * Static attribute for java utilities import package.
      */
     public static final String JAVA_UTIL_REGEX_PKG = "java.util.regex";
@@ -1537,23 +1470,6 @@
     public static final String JAVA_UTIL_OBJECTS_IMPORT_CLASS = "Objects";
 
     /**
-     * Static attribute for AugmentedInfo class.
-     */
-    public static final String YANG_AUGMENTED_INFO = "YangAugmentedInfo";
-
-    /**
-     * Static attribute for AugmentedInfo class.
-     */
-    public static final String YANG_AUGMENTED_INFO_LOWER_CASE =
-            "yangAugmentedInfo";
-
-    /**
-     * Static attribute for AugmentedInfo class.
-     */
-    public static final String YANG_AUGMENTED_INFO_MAP =
-            "yangAugmentedInfoMap";
-
-    /**
      * Static attribute for augmented.
      */
     public static final String AUGMENTED = "Augmented";
@@ -1773,12 +1689,6 @@
     public static final String ONE = "1";
 
     /**
-     * Static attribute for YANG node operation type class.
-     */
-    public static final String OPERATION_TYPE_CLASS =
-            "OnosYangOpType";
-
-    /**
      * Static attribute for YANG node operation type attribute.
      */
     public static final String OPERATION_TYPE_ATTRIBUTE =
@@ -1882,39 +1792,6 @@
      */
     public static final String AT = " at ";
 
-    /**
-     * Static param for processChildNodesSubTreeFiltering.
-     */
-    public static final String PROCESS_CHILD_NODE_STF_PARAM =
-            "processChildNodesSubTreeFiltering";
-
-    /**
-     * Static param for processLeafListSubTreeFiltering.
-     */
-    public static final String PROCESS_LEAF_LIST_STF_PARAM =
-            "processLeafListSubTreeFiltering";
-    /**
-     * Static param for processLeafListSubTreeFiltering.
-     */
-    public static final String PROCESS_LEAF_STF_PARAM =
-            "processLeafSubtreeFiltering";
-    /**
-     * 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";
-
     //File type extension for java classes.
     public static final String JAVA_FILE_EXTENSION = ".java";
 
@@ -1928,6 +1805,56 @@
      */
     public static final String LAST = "last";
 
+    /**
+     * Static param for model object.
+     */
+    public static final String MODEL_OBJECT = "ModelObject";
+
+    /**
+     * Static param for add augmentation.
+     */
+    public static final String ADD_AUGMENTATION = "addAugmentation";
+
+    /**
+     * Static param for remove augmentation.
+     */
+    public static final String REMOVE_AUGMENTATION = "removeAugmentation";
+
+    /**
+     * Static param for augmentations.
+     */
+    public static final String AUGMENTATIONS = "augmentations";
+
+    /**
+     * Static param for augmentation.
+     */
+    public static final String AUGMENTATION = "augmentation";
+
+    /**
+     * Static param for variable c.
+     */
+    public static final String VARIABLE_C = "c";
+
+    /**
+     * Static param for left angular bracket.
+     */
+    public static final String LEFT_ANGULAR_BRACKET = "<";
+
+    /**
+     * Static param for right angular brace.
+     */
+    public static final String RIGHT_ANGULAR_BRACKET = ">";
+
+    /**
+     * Static param for template t.
+     */
+    public static final String TEMPLATE_T = "T";
+
+    /**
+     * Static param for class.
+     */
+    public static final String CAMEL_CLASS = "Class";
+
     // No instantiation.
     private UtilConstants() {
     }
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
index 89ab368..07af02e 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
@@ -386,18 +386,6 @@
                 " * valueLeafFlags identify the leafs whose value are " +
                 "explicitly set\n" +
                 " * Applicable in protocol edit and query operation.\n" +
-                " * </p>\n" +
-                " *\n" +
-                " * <p>\n" +
-                " * selectLeafFlags identify the leafs to be selected, in" +
-                " a query operation.\n" +
-                " * </p>\n" +
-                " *\n" +
-                " * <p>\n" +
-                " * Operation type specify the node specific operation in" +
-                " protocols like NETCONF.\n" +
-                " * Applicable in protocol edit operation, not applicable" +
-                " in query operation.\n" +
                 " * </p>\n";
     }
 
@@ -524,37 +512,6 @@
     }
 
     /**
-     * Generates javaDocs for add augmentation method.
-     *
-     * @param name builder class name
-     * @return javaDocs
-     */
-    public static String generateForAddAugmentation(String name) {
-        return getJavaDocStartLine(YANG_AUGMENTED_INFO_LOWER_CASE,
-                                   JAVA_DOC_SETTERS_COMMON) +
-                getJavaDocEmptyAsteriskLine() +
-                getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, VALUE) +
-                getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, CLASS +
-                        OBJECT_STRING) +
-                getJavaDocReturnLine(name) + getJavaDocEndLine();
-    }
-
-    /**
-     * Returns javadoc for get augmentation method.
-     *
-     * @return javadoc for get augmentation method
-     */
-    public static String generateForGetAugmentation() {
-        return NEW_LINE + getJavaDocStartLine(YANG_AUGMENTED_INFO_LOWER_CASE,
-                                              JAVA_DOC_GETTERS) +
-                getJavaDocEmptyAsteriskLine() +
-                getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, CLASS +
-                        OBJECT_STRING) +
-                getJavaDocReturnLine(YANG_AUGMENTED_INFO) +
-                getJavaDocEndLine();
-    }
-
-    /**
      * Returns javadoc for validator method.
      *
      * @return javadoc for validator method
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ChoiceCaseTranslatorTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ChoiceCaseTranslatorTest.java
index 395792a..3a1976b 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ChoiceCaseTranslatorTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ChoiceCaseTranslatorTest.java
@@ -18,9 +18,9 @@
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.junit.Test;
+import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
-import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 import org.onosproject.yang.compiler.utils.io.impl.YangFileScanner;
 import org.onosproject.yang.compiler.utils.io.impl.YangIoUtils;
