diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
index 0ce482a..9ff2b15 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
@@ -45,6 +45,7 @@
 import org.onosproject.yang.compiler.datamodel.YangMust;
 import org.onosproject.yang.compiler.datamodel.YangMustHolder;
 import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangNotification;
 import org.onosproject.yang.compiler.datamodel.YangReferenceResolver;
 import org.onosproject.yang.compiler.datamodel.YangResolutionInfo;
 import org.onosproject.yang.compiler.datamodel.YangRpc;
@@ -310,6 +311,25 @@
     }
 
     /**
+     * Checks if there is any rpc/notification defined in the module or
+     * sub-module.
+     *
+     * @param rootNode root node of the data model
+     * @return status of rpc/notification existence
+     */
+    public static boolean isRpcNotificationPresent(YangNode rootNode) {
+        YangNode childNode = rootNode.getChild();
+        while (childNode != null) {
+            if (childNode instanceof YangRpc ||
+                    childNode instanceof YangNotification) {
+                return true;
+            }
+            childNode = childNode.getNextSibling();
+        }
+        return false;
+    }
+
+    /**
      * Returns referred node in a given set.
      *
      * @param yangNodeSet YANG node set
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/base/tool/YangToolManager.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/base/tool/YangToolManager.java
index 548511d..d4992cb 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/base/tool/YangToolManager.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/base/tool/YangToolManager.java
@@ -303,8 +303,8 @@
         yangNodeSortedList.addAll(yangNodeSet);
         sort(yangNodeSortedList);
         for (YangNode node : yangNodeSortedList) {
-            if (node.isToTranslate() && !(!((YangDeviationHolder) node)
-                    .isModuleForDeviation())) {
+            if (node.isToTranslate() && !((YangDeviationHolder) node)
+                    .isModuleForDeviation()) {
                 generateJavaCode(node, pluginConfig);
             }
         }
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..426806a 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
@@ -18,7 +18,6 @@
 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.YangLeaf;
 import org.onosproject.yang.compiler.datamodel.YangLeafList;
@@ -57,9 +56,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 +94,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 +113,27 @@
 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 +142,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 +386,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 +430,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 +458,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 +522,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);
@@ -622,18 +573,6 @@
         TempJavaBeanFragmentFiles tempFiles =
                 getBeanFiles((JavaCodeGeneratorInfo) parent);
         tempFiles.setAttrNode(curNode);
-        JavaFileInfoTranslator fileInfo = ((JavaCodeGeneratorInfo) parent)
-                .getJavaFileInfo();
-        if (curNode instanceof YangChoice && curNode.isOpTypeReq()) {
-            JavaQualifiedTypeInfoTranslator info = new
-                    JavaQualifiedTypeInfoTranslator();
-            info.setClassInfo(INVOCATION_TARGET_EXCEPTION);
-            info.setPkgInfo(REFLECT_IMPORTS);
-            info.setForInterface(false);
-            tempFiles.getJavaImportData().addImportInfo(
-                    info, getCapitalCase(fileInfo.getJavaName()),
-                    fileInfo.getPackage());
-        }
         JavaAttributeInfo attr = getCurNodeAsAttributeInTarget(
                 curNode, parent, isList, tempFiles);
         tempFiles.addJavaSnippetInfoToApplicableTempFiles(attr, config);
@@ -691,17 +630,6 @@
             }
             qualified = parentImportData.addImportInfo(typeInfo, className,
                                                        fileInfo.getPackage());
-            if (!qualified && !(curNode instanceof YangChoice) &&
-                    targetNode.isOpTypeReq()) {
-                String name = DEFAULT_CAPS + typeInfo.getClassInfo();
-                JavaQualifiedTypeInfoTranslator qInfo =
-                        new JavaQualifiedTypeInfoTranslator();
-                qInfo.setForInterface(false);
-                qInfo.setPkgInfo(typeInfo.getPkgInfo());
-                qInfo.setClassInfo(name);
-                parentImportData.addImportInfo(qInfo, className,
-                                               fileInfo.getPackage());
-            }
         }
         boolean collectionSet = false;
         if (curNode instanceof YangList) {
@@ -1065,43 +993,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 +1040,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 +1059,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 +1442,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 +1471,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 +1497,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 +1534,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 +1545,7 @@
             if (tempFlagSet(GETTER_FOR_CLASS_MASK)) {
                 addGetterImpl(newAttrInfo);
             }
+
             if (tempFlagSet(FROM_STRING_IMPL_MASK)) {
                 JavaQualifiedTypeInfoTranslator typeInfo =
                         getQualifiedInfoOfFromString(newAttrInfo,
@@ -1847,10 +1606,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 +1669,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 +1706,7 @@
                 mergeJavaFiles(builderClassJavaFileHandle,
                                implClassJavaFileHandle);
             }
+
             insertDataIntoJavaFile(implClassJavaFileHandle, CLOSE_CURLY_BRACKET);
             validateLineLength(implClassJavaFileHandle);
         }
@@ -1944,6 +1721,7 @@
                         getJavaFileHandle(getJavaClassName(
                                 KEY_CLASS_FILE_NAME_SUFFIX));
                 generateKeyClassFile(keyClassJavaFileHandle, curNode);
+
             }
         }
         //Close all the file handles.
@@ -2012,15 +1790,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 +1847,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 +1856,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 +1888,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..ddc83f2 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
@@ -51,7 +51,7 @@
 import java.util.Map;
 
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcChildNodePresent;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcNotificationPresent;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yang.compiler.translator.tojava.TempJavaFragmentFiles.addCurNodeInfoInParentTempFile;
@@ -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 =
@@ -514,7 +501,7 @@
         }
         updatePackageInfo(info, config, rootPkg);
 
-        if (isRpcChildNodePresent((YangNode) info)) {
+        if (isRpcNotificationPresent((YangNode) info)) {
             info.getJavaFileInfo().addGeneratedFileTypes(GENERATE_SERVICE_AND_MANAGER);
         }
         generateTempFiles(info, config);
@@ -557,16 +544,6 @@
     }
 
     /**
-     * Returns true if get/set method of root node are required.
-     *
-     * @param node root node
-     * @return true if get/set method of root node are required
-     */
-    public static boolean isGetSetOfRootNodeRequired(YangNode node) {
-        return isNodeCodeGenRequired(node, false);
-    }
-
-    /**
      * Returns true if either get/set method of root node are required or root
      * node contains any data node. This check is done depending on the
      * boolean parameter indicating whether check to be performed for root
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java
index dbc6803..51fb388 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java
@@ -28,6 +28,8 @@
 import java.io.IOException;
 import java.util.ArrayList;
 
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcChildNodePresent;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcNotificationPresent;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
@@ -133,7 +135,9 @@
         try {
             generateCodeOfRootNode(this, yangPlugin, modulePkg);
             //Add augmented rpc name
-            tempFileHandle.getServiceTempFiles().addAugmentedRpcMethod(this);
+            if (isRpcChildNodePresent(this)) {
+                tempFileHandle.getServiceTempFiles().addAugmentedRpcMethod(this);
+            }
         } catch (IOException e) {
             throw new TranslatorException(getErrorMsg(FAIL_AT_ENTRY, this,
                                                       e.getLocalizedMessage()));
@@ -173,8 +177,10 @@
                         .getCodeGenerateForSbi() == null ||
                         !getJavaFileInfo().getPluginConfig()
                                 .getCodeGenerateForSbi().equals(SBI)) {
-                    getTempJavaCodeFragmentFiles()
-                            .generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
+                    if (isRpcNotificationPresent(this)) {
+                        getTempJavaCodeFragmentFiles()
+                                .generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
+                    }
                 }
             }
 
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
index 5cee773..76e3ff7 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
@@ -29,6 +29,8 @@
 import java.io.IOException;
 import java.util.ArrayList;
 
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcChildNodePresent;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcNotificationPresent;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
@@ -145,8 +147,10 @@
         }
         try {
             generateCodeOfRootNode(this, yangPlugin, subModulePkg);
-            tempFileHandle.getServiceTempFiles().addAugmentedRpcMethod(
-                    this);
+            if (isRpcChildNodePresent(this)) {
+                tempFileHandle.getServiceTempFiles().addAugmentedRpcMethod(
+                        this);
+            }
         } catch (IOException e) {
             throw new TranslatorException(getErrorMsg(FAIL_AT_ENTRY, this,
                                                       e.getLocalizedMessage()));
@@ -183,8 +187,10 @@
                         .getCodeGenerateForSbi() == null ||
                         !getJavaFileInfo().getPluginConfig()
                                 .getCodeGenerateForSbi().equals(SBI)) {
-                    getTempJavaCodeFragmentFiles().generateJavaFile(
-                            GENERATE_SERVICE_AND_MANAGER, this);
+                    if (isRpcNotificationPresent(this)) {
+                        getTempJavaCodeFragmentFiles().generateJavaFile(
+                                GENERATE_SERVICE_AND_MANAGER, this);
+                    }
                 }
             }
 
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..896426a 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;
@@ -239,16 +240,10 @@
      */
     private static String getImplClassDefinition(String yangName,
                                                  YangNode curNode) {
-        if (!(curNode instanceof YangCase)) {
-            String clsDef = getClassDefinitionForWhenExtended(
-                    curNode, yangName, DEFAULT_CLASS_MASK);
-            if (clsDef != null) {
-                return clsDef;
-            }
-        }
-        if (curNode instanceof RpcNotificationContainer) {
-            return getDefaultDefinitionWithImpl(
-                    CLASS, getSuffixedName(yangName, OP_PARAM), PUBLIC, yangName);
+        String clsDef = getClassDefinitionForWhenExtended(
+                curNode, yangName, DEFAULT_CLASS_MASK);
+        if (clsDef != null) {
+            return clsDef;
         }
         return getDefaultDefinitionWithImpl(CLASS, getDefaultName(yangName),
                                             PUBLIC, yangName);
@@ -416,16 +411,26 @@
                             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);
                     break;
                 case DEFAULT_CLASS_MASK:
+
+                    // class defination
                     if (curNode instanceof RpcNotificationContainer) {
                         def.append(CLASS).append(SPACE).append(yangName)
                                 .append(OP_PARAM).append(SPACE).append(EXTEND)
@@ -435,9 +440,18 @@
                                 .append(yangName).append(SPACE).append(EXTEND)
                                 .append(SPACE);
                     }
-                    def = new StringBuilder(getDefinitionString(def.toString(),
-                                                                holder));
-                    def.append(SPACE).append(IMPLEMENTS).append(SPACE)
+
+                    // append with extendList
+                    if (curNode instanceof YangCase) {
+                        def = new StringBuilder(getDefinitionStringForCase(def.toString(),
+                                                                           holder));
+                    } else {
+                        def = new StringBuilder(getDefinitionString(def.toString(),
+                                                                    holder));
+                    }
+
+                    // append implements
+                    def.append(IMPLEMENTS).append(SPACE)
                             .append(yangName);
                     break;
                 default:
@@ -472,4 +486,24 @@
         def = builder.toString();
         return trimAtLast(def, COMMA);
     }
+
+    /**
+     * Returns updated class definition for case.
+     *
+     * @param def    current definition
+     * @param holder extend list holder
+     * @return updated class definition
+     */
+    private static String getDefinitionStringForCase(String def,
+                                                     JavaExtendsListHolder holder) {
+        StringBuilder builder = new StringBuilder(def);
+        for (JavaQualifiedTypeInfoTranslator info : holder.getExtendsList()) {
+            if (!info.getClassInfo().equals(MODEL_OBJECT)) {
+                continue;
+            }
+            builder.append(info.getClassInfo() + COMMA + SPACE);
+        }
+        def = builder.toString();
+        return trimAtLast(def, COMMA);
+    }
 }
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..b9c609e 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;
@@ -78,9 +76,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.SETTER_FOR_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.SETTER_FOR_INTERFACE_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedTempFileType.TO_STRING_IMPL_MASK;
-import static org.onosproject.yang.compiler.translator.tojava.TempJavaFragmentFiles.getCurNodeAsAttributeInTarget;
 import static org.onosproject.yang.compiler.translator.tojava.TempJavaFragmentFiles.getListOfAttributesForKey;
-import static org.onosproject.yang.compiler.translator.tojava.YangJavaModelUtils.isGetSetOfRootNodeRequired;
 import static org.onosproject.yang.compiler.translator.tojava.utils.IndentationType.FOUR_SPACE;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaCodeSnippetGen.addStaticAttributeIntRange;
 import static org.onosproject.yang.compiler.translator.tojava.utils.JavaCodeSnippetGen.addStaticAttributeLongRange;
@@ -88,17 +84,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.getAugmentsDataMethodForService;
+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.getBitSetEnumClassFromString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getBitSetEnumClassToString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getCompareToForKeyClass;
@@ -112,39 +106,24 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getFromStringMethodSignature;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getGetter;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getGetterForClass;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getGetterString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getHashCodeMethod;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getHashCodeMethodClose;
 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 +217,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 +242,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 +310,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 +384,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 +391,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 +557,6 @@
             insertDataIntoJavaFile(file, NEW_LINE);
         }
 
-        if (curNode instanceof YangAugmentableNode) {
-            methods.add(getYangAugmentInfoImpl());
-        }
         try {
             //Constructor.
             String constructor = getConstructorStart(className, rootNode) +
@@ -628,35 +564,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 +573,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);
@@ -1129,25 +1041,8 @@
                                    curNode, className);
 
         List<String> methods = new ArrayList<>();
-        JavaAttributeInfo rootAttribute =
-                getCurNodeAsAttributeInTarget(curNode, curNode, false,
-                                              tempFiles);
 
         try {
-
-            if (isGetSetOfRootNodeRequired(curNode)) {
-                //Getter methods.
-                methods.add(getGetterString(rootAttribute,
-                                            GENERATE_SERVICE_AND_MANAGER) +
-                                    NEW_LINE);
-                // Setter methods.
-                methods.add(getSetterString(rootAttribute, className,
-                                            GENERATE_SERVICE_AND_MANAGER) +
-                                    NEW_LINE);
-            }
-
-            methods.add(getAugmentsDataMethodForService(curNode));
-
             if (((JavaCodeGeneratorInfo) curNode).getTempJavaCodeFragmentFiles()
                     .getServiceTempFiles() != null) {
                 JavaCodeGeneratorInfo javaGenInfo =
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/main/java/org/onosproject/yang/compiler/plugin/maven/YangPluginUtils.java b/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangPluginUtils.java
index c5f0e69..1a43f6c 100644
--- a/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangPluginUtils.java
+++ b/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangPluginUtils.java
@@ -18,7 +18,6 @@
 
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Plugin;
 import org.apache.maven.model.Resource;
 import org.apache.maven.project.MavenProject;
 import org.onosproject.yang.compiler.base.tool.YangToolManager;
@@ -30,13 +29,9 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
-import static org.onosproject.yang.compiler.utils.UtilConstants.COLON;
-import static org.onosproject.yang.compiler.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.HYPHEN;
 import static org.onosproject.yang.compiler.utils.UtilConstants.JAR;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
@@ -51,10 +46,6 @@
 
     private static final Logger log = getLogger(YangPluginUtils.class);
 
-    private static final String TEXT_FILE_EXTENSION = ".txt";
-    private static final String VERSION_META_DATA = "VersionMetaData";
-    private static final String PLUGIN_ARTIFACT = "onos-yang-maven-plugin";
-
     private YangPluginUtils() {
     }
 
@@ -80,7 +71,6 @@
      */
     static void copyYangFilesToTarget(String outputDir, MavenProject project)
             throws IOException {
-
         addToProjectResource(outputDir + SLASH + TEMP + SLASH, project);
     }
 
@@ -104,39 +94,6 @@
         if (operation) {
             addToProjectResource(directory + SLASH + TEMP + SLASH, project);
         }
-
-        if (operation) {
-            addVersionMetaDataFile(project, serFileDirPath);
-        }
-    }
-
-    /**
-     * Adds version meta data files for YSR to know version of YANG tools.
-     *
-     * @param project maven project
-     * @param dir     directory
-     * @throws IOException when fails to do IO operations
-     */
-    private static void addVersionMetaDataFile(MavenProject project, String dir)
-            throws IOException {
-        List<Plugin> plugins = project.getBuildPlugins();
-        Iterator<Plugin> it = plugins.iterator();
-        Plugin plugin = it.next();
-        String data = EMPTY_STRING;
-        while (it.hasNext()) {
-            if (plugin.getArtifactId().equals(PLUGIN_ARTIFACT)) {
-                data = plugin.getGroupId() + COLON + plugin.getArtifactId()
-                        + COLON + plugin.getVersion();
-            }
-            plugin = it.next();
-        }
-        if (data.equals(EMPTY_STRING)) {
-            throw new IOException("Invalid artifact for " + PLUGIN_ARTIFACT);
-        }
-        String verFileName = dir + VERSION_META_DATA + TEXT_FILE_EXTENSION;
-        PrintWriter out = new PrintWriter(verFileName);
-        out.print(data);
-        out.close();
     }
 
     /**
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;
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/YangJavaModelUtilsTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/YangJavaModelUtilsTest.java
index e1cad16..6612ab6 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/YangJavaModelUtilsTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/YangJavaModelUtilsTest.java
@@ -20,9 +20,9 @@
 import org.hamcrest.core.Is;
 import org.junit.Test;
 import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.translator.tojava.YangJavaModelUtils;
 import org.onosproject.yang.compiler.utils.io.impl.YangFileScanner;
-import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 
 import java.io.IOException;
 
@@ -47,11 +47,9 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(false, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(true, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
             if (node.getName().equals("test6")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(true, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
@@ -68,7 +66,6 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(true, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
@@ -85,7 +82,6 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(true, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
@@ -102,11 +98,9 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(false, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
             if (node.getName().equals("test6")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(false, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
@@ -124,11 +118,9 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(false, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(false, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
             if (node.getName().equals("test6")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(false, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
@@ -145,7 +137,6 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(false, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(false, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
@@ -163,11 +154,9 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(false, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(true, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
             if (node.getName().equals("test6")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(true, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
@@ -185,7 +174,6 @@
 
         for (YangNode node : utilManager.getYangNodeSet()) {
             if (node.getName().equals("test5")) {
-                assertThat(true, Is.is(YangJavaModelUtils.isGetSetOfRootNodeRequired(node)));
                 assertThat(false, Is.is(YangJavaModelUtils.isRootNodesCodeGenRequired(node)));
             }
         }
