diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index 7a894e6..32ce235 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -150,6 +150,12 @@
     @Parameter(readonly = true, defaultValue = "${project.remoteArtifactRepositories}")
     private List<ArtifactRepository> remoteRepository;
 
+    /**
+     * Code generation is for nbi or sbi.
+     */
+    @Parameter(property = "generateJavaFileForsbi", defaultValue = "nbi")
+    private String generateJavaFileForsbi;
+
     @Override
     public void execute()
             throws MojoExecutionException, MojoFailureException {
@@ -177,6 +183,7 @@
             yangPlugin.setManagerCodeGenDir(managerCodeGenDir);
             yangPlugin.setConflictResolver(conflictResolver);
 
+            yangPlugin.setCodeGenerateForsbi(generateJavaFileForsbi.toLowerCase());
             /*
              * Obtain the YANG files at a path mentioned in plugin and creates
              * YANG file information set.
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/GeneratedJavaFileType.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/GeneratedJavaFileType.java
index 1a2b9b8..cdb8b5a 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/GeneratedJavaFileType.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/GeneratedJavaFileType.java
@@ -44,8 +44,7 @@
     /**
      * Interface and class file.
      */
-    public static final int GENERATE_INTERFACE_WITH_BUILDER = INTERFACE_MASK
-            | BUILDER_INTERFACE_MASK | BUILDER_CLASS_MASK | IMPL_CLASS_MASK;
+    public static final int GENERATE_INTERFACE_WITH_BUILDER = 8207;
 
     /**
      * Java interface corresponding to rpc.
@@ -94,6 +93,16 @@
     public static final int GENERATE_IDENTITY_CLASS = 2048;
 
     /**
+     * Operation class file.
+     */
+    public static final int OPERATION_CLASS_MASK = 4096;
+
+    /**
+     * Operation class builder file.
+     */
+    public static final int OPERATION_BUILDER_CLASS_MASK = 8192;
+
+    /**
      * Creates an instance of generate java file type.
      */
     private GeneratedJavaFileType() {
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
index e9eafbf..0e19b23 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/JavaImportData.java
@@ -32,6 +32,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.IMPORT;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_LANG;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
+import static org.onosproject.yangutils.utils.UtilConstants.BITSET;
 import static org.onosproject.yangutils.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_PKG;
 import static org.onosproject.yangutils.utils.UtilConstants.LIST;
 import static org.onosproject.yangutils.utils.UtilConstants.LISTENER_REG;
@@ -209,6 +210,15 @@
     }
 
     /**
+     * Returns import for to bitset method.
+     *
+     * @return import for to bitset method
+     */
+    public String getImportForToBitSet() {
+        return IMPORT + JAVA_UTIL_OBJECTS_IMPORT_PKG + PERIOD + BITSET + SEMI_COLAN + NEW_LINE;
+    }
+
+    /**
      * Returns import for list attribute.
      *
      * @return import for list attribute
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
index d8bba5e..67ee69e 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaFragmentFiles.java
@@ -47,6 +47,7 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_TYPE_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.OPERATION_BUILDER_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.AUGMENTE_CLASS_CONSTRUCTOR_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EQUALS_IMPL_MASK;
@@ -69,6 +70,8 @@
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateImplClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateInterfaceFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.addResolvedAugmentedDataNodeImports;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateOpParamBuilderClassFile;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateOpParamImplClassFile;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getAugmentedConstructor;
@@ -102,6 +105,9 @@
 import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
 import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.OPERATION;
+import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
+import static org.onosproject.yangutils.utils.UtilConstants.PROTECTED;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.readAppendFile;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
@@ -246,11 +252,39 @@
     private File builderClassJavaFileHandle;
 
     /**
+     * Retrieves the temporary file handle of op param builder class.
+     *
+     * @return op param builder temporary file handle
+     */
+    public File getBuilderOpParmClassJavaFileHandle() {
+        return builderOpParmClassJavaFileHandle;
+    }
+
+    /**
+     * Sets the java file handle for op param builder class.
+     *
+     * @param builderOpParmClassJavaFileHandle java file handle
+     */
+    public void setBuilderOpParmClassJavaFileHandle(File builderOpParmClassJavaFileHandle) {
+        this.builderOpParmClassJavaFileHandle = builderOpParmClassJavaFileHandle;
+    }
+
+    /**
+     * Java file handle for builder op param class file.
+     */
+    private File builderOpParmClassJavaFileHandle;
+
+    /**
      * Java file handle for impl class file.
      */
     private File implClassJavaFileHandle;
 
     /**
+     * Java file handle for op param class file.
+     */
+    private File opParamClassJavaFileHandle;
+
+    /**
      * Temporary file handle for attribute.
      */
     private File attributesTempFileHandle;
@@ -1192,13 +1226,17 @@
          * TODO: check if this utility needs to be called or move to the caller
          */
         String attributeName = getCamelCase(attr.getAttributeName(), pluginConfig.getConflictResolver());
+        String attributeAccessType = PRIVATE;
+        if ((javaFileInfo.getGeneratedFileTypes() & GENERATE_INTERFACE_WITH_BUILDER) != 0) {
+            attributeAccessType = PROTECTED;
+        }
         if (attr.isQualifiedName()) {
             return getJavaAttributeDefination(attr.getImportInfo().getPkgInfo(),
                     attr.getImportInfo().getClassInfo(),
-                    attributeName, attr.isListAttr());
+                    attributeName, attr.isListAttr(), attributeAccessType);
         } else {
             return getJavaAttributeDefination(null, attr.getImportInfo().getClassInfo(), attributeName,
-                    attr.isListAttr());
+                    attr.isListAttr(), attributeAccessType);
         }
     }
 
@@ -1260,7 +1298,7 @@
                 if (!(leaf instanceof JavaLeafInfoContainer)) {
                     throw new TranslatorException("Leaf does not have java information");
                 }
-                addJavaSnippetInfoToApplicableTempFiles(getJavaAttributeOfLeaf(leaf, yangPluginConfig),
+                addJavaSnippetInfoToApplicableTempFiles(getJavaAttributeOfLeaf(this, leaf, yangPluginConfig),
                         yangPluginConfig);
             }
         }
@@ -1269,12 +1307,13 @@
     /**
      * Returns java attribute for leaf.
      *
+     * @param tempJavaFragmentFiles temporary generated file
      * @param leaf             YANG leaf
      * @param yangPluginConfig plugin configurations
      * @return java attribute for leaf
      */
-    private JavaAttributeInfo getJavaAttributeOfLeaf(YangLeaf leaf,
-                                                     YangPluginConfig yangPluginConfig) {
+    public static JavaAttributeInfo getJavaAttributeOfLeaf(TempJavaFragmentFiles tempJavaFragmentFiles, YangLeaf leaf,
+                                                            YangPluginConfig yangPluginConfig) {
         JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leaf;
         javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver());
         javaLeaf.updateJavaQualifiedInfo();
@@ -1282,7 +1321,7 @@
                 javaLeaf.getJavaQualifiedInfo(),
                 javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()),
                 javaLeaf.getDataType(),
-                getIsQualifiedAccessOrAddToImportList(javaLeaf.getJavaQualifiedInfo()),
+                tempJavaFragmentFiles.getIsQualifiedAccessOrAddToImportList(javaLeaf.getJavaQualifiedInfo()),
                 false);
     }
 
@@ -1300,7 +1339,7 @@
                 if (!(leafList instanceof JavaLeafInfoContainer)) {
                     throw new TranslatorException("Leaf-list does not have java information");
                 }
-                addJavaSnippetInfoToApplicableTempFiles(getJavaAttributeOfLeafList(leafList, yangPluginConfig),
+                addJavaSnippetInfoToApplicableTempFiles(getJavaAttributeOfLeafList(this, leafList, yangPluginConfig),
                         yangPluginConfig);
             }
         }
@@ -1309,25 +1348,28 @@
     /**
      * Returns java attribute for leaf-list.
      *
+     * @param tempJavaFragmentFiles temporary generated file
      * @param leafList         YANG leaf-list
      * @param yangPluginConfig plugin configurations
      * @return java attribute for leaf-list
      */
-    private JavaAttributeInfo getJavaAttributeOfLeafList(YangLeafList leafList, YangPluginConfig yangPluginConfig) {
+    public static JavaAttributeInfo getJavaAttributeOfLeafList(TempJavaFragmentFiles tempJavaFragmentFiles,
+                                                           YangLeafList leafList, YangPluginConfig yangPluginConfig) {
         JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leafList;
         javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver());
         javaLeaf.updateJavaQualifiedInfo();
-        getJavaImportData().setIfListImported(true);
+        tempJavaFragmentFiles.getJavaImportData().setIfListImported(true);
         return getAttributeInfoForTheData(
                 javaLeaf.getJavaQualifiedInfo(),
                 javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()),
                 javaLeaf.getDataType(),
-                getIsQualifiedAccessOrAddToImportList(javaLeaf.getJavaQualifiedInfo()),
+                tempJavaFragmentFiles.getIsQualifiedAccessOrAddToImportList(javaLeaf.getJavaQualifiedInfo()),
                 true);
     }
 
     /**
-     * Adds all the leaves in the current data model node as part of the generated temporary file.
+     * Adds all the leaves in the current data model node as part of the
+     * generated temporary file.
      *
      * @param curNode          java file info of the generated file
      * @param yangPluginConfig plugin config
@@ -1419,6 +1461,24 @@
     }
 
     /**
+     * Returns op param java class name.
+     *
+     * @return op param java class name
+     */
+    String getOpParamImplClassName() {
+        return getCapitalCase(getJavaFileInfo().getJavaName()) + OPERATION;
+    }
+
+    /**
+     * Returns op param builder java class name.
+     *
+     * @return op param builder java class name
+     */
+    String getOpParamBuilderImplClassName() {
+        return getCapitalCase(getJavaFileInfo().getJavaName()) + OPERATION + BUILDER;
+    }
+
+    /**
      * Returns the directory path.
      *
      * @return directory path
@@ -1494,7 +1554,7 @@
         }
         if ((fileType & BUILDER_CLASS_MASK) != 0 || (fileType & IMPL_CLASS_MASK) != 0) {
             if (isAttributePresent()) {
-                addImportsToStringAndHasCodeMethods(imports);
+                addImportsToStringAndHasCodeMethods(imports, true);
             }
             if (curNode instanceof YangAugmentableNode) {
                 addImportsForAugmentableClass(imports);
@@ -1522,6 +1582,39 @@
                 validateLineLength(getImplClassJavaFileHandle());
             }
             insertDataIntoJavaFile(getImplClassJavaFileHandle(), getJavaClassDefClose());
+
+            if (!(curNode instanceof YangModule)) {
+                if (isAttributePresent()) {
+                    addImportsToStringAndHasCodeMethods(imports, false);
+                }
+                addBitsetImport(imports, true);
+                /*
+                 * Create impl class file.
+                 */
+                setOpParamClassJavaFileHandle(getJavaFileHandle(getOpParamImplClassName()));
+                setOpParamClassJavaFileHandle(
+                        generateOpParamImplClassFile(getOpParamClassJavaFileHandle(), curNode,
+                                                     isAttributePresent(), imports));
+
+                /*
+                 * Create builder class file.
+                 */
+                if ((fileType & BUILDER_CLASS_MASK) != 0) {
+                    setBuilderOpParmClassJavaFileHandle(getJavaFileHandle(getOpParamBuilderImplClassName()));
+                    setBuilderOpParmClassJavaFileHandle(
+                            generateOpParamBuilderClassFile(getBuilderOpParmClassJavaFileHandle(), curNode,
+                                                            isAttributePresent()));
+                    /*
+                     * Append impl class to builder class and close it.
+                     */
+                    mergeJavaFiles(getBuilderOpParmClassJavaFileHandle(), getOpParamClassJavaFileHandle());
+                    validateLineLength(getOpParamClassJavaFileHandle());
+
+                    addBitsetImport(imports, false);
+                }
+                insertDataIntoJavaFile(getOpParamClassJavaFileHandle(), getJavaClassDefClose());
+
+            }
         }
         /*
          * Close all the file handles.
@@ -1547,15 +1640,15 @@
             YangLeavesHolder holder = (YangLeavesHolder) augmentedNode;
             if (holder.getListOfLeaf() != null) {
                 for (YangLeaf leaf : holder.getListOfLeaf()) {
-                    addAugmentConstructor(getJavaAttributeOfLeaf(leaf,
-                            pluginConfig), pluginConfig);
+                    addAugmentConstructor(getJavaAttributeOfLeaf(this, leaf,
+                                                                 pluginConfig), pluginConfig);
                 }
 
             }
             if (holder.getListOfLeafList() != null) {
                 for (YangLeafList leafList : holder.getListOfLeafList()) {
-                    addAugmentConstructor(getJavaAttributeOfLeafList(leafList,
-                            pluginConfig), pluginConfig);
+                    addAugmentConstructor(getJavaAttributeOfLeafList(this, leafList,
+                                                                     pluginConfig), pluginConfig);
                 }
 
             }
@@ -1579,10 +1672,30 @@
      * Adds imports for ToString and HashCodeMethod.
      *
      * @param imports import list
+     * @param operation add or remove
      */
-    public void addImportsToStringAndHasCodeMethods(List<String> imports) {
-        imports.add(getJavaImportData().getImportForHashAndEquals());
-        imports.add(getJavaImportData().getImportForToString());
+    public void addImportsToStringAndHasCodeMethods(List<String> imports, boolean operation) {
+        if (operation) {
+            imports.add(getJavaImportData().getImportForHashAndEquals());
+            imports.add(getJavaImportData().getImportForToString());
+        } else {
+            imports.remove(getJavaImportData().getImportForHashAndEquals());
+            imports.remove(getJavaImportData().getImportForToString());
+        }
+    }
+
+    /**
+     * Adds imports for bitset method.
+     *
+     * @param imports import list
+     * @param operation add or remove
+     */
+    public void addBitsetImport(List<String> imports, boolean operation) {
+        if (operation) {
+            imports.add(getJavaImportData().getImportForToBitSet());
+        } else {
+            imports.remove(getJavaImportData().getImportForToBitSet());
+        }
     }
 
 
@@ -1653,6 +1766,9 @@
         if ((getGeneratedJavaFiles() & BUILDER_CLASS_MASK) != 0) {
             closeFile(getBuilderClassJavaFileHandle(), true);
         }
+        if ((getGeneratedJavaFiles() & OPERATION_BUILDER_CLASS_MASK) != 0) {
+            closeFile(getBuilderOpParmClassJavaFileHandle(), true);
+        }
         if ((getGeneratedJavaFiles() & BUILDER_INTERFACE_MASK) != 0) {
             closeFile(getBuilderInterfaceJavaFileHandle(), true);
         }
@@ -1700,4 +1816,21 @@
                 getJavaFileInfo().getPackage());
     }
 
+    /**
+     * Returns java file handle for op param class file.
+     *
+     * @return java file handle for op param class file
+     */
+    public File getOpParamClassJavaFileHandle() {
+        return opParamClassJavaFileHandle;
+    }
+
+    /**
+     * Sets the java file handle for op param class file.
+     *
+     * @param opParamClassJavaFileHandle  java file handle
+     */
+    public void setOpParamClassJavaFileHandle(File opParamClassJavaFileHandle) {
+        this.opParamClassJavaFileHandle = opParamClassJavaFileHandle;
+    }
 }
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
index d693381..1d31d20 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/TempJavaTypeFragmentFiles.java
@@ -332,7 +332,7 @@
          * Creates type def class file.
          */
         if ((fileType & GENERATE_TYPEDEF_CLASS) != 0) {
-            addImportsToStringAndHasCodeMethods(imports);
+            addImportsToStringAndHasCodeMethods(imports, true);
             setTypedefClassJavaFileHandle(getJavaFileHandle(getJavaClassName(TYPEDEF_CLASS_FILE_NAME_SUFFIX)));
             generateTypeDefClassFile(getTypedefClassJavaFileHandle(), curNode, imports);
         }
@@ -340,7 +340,7 @@
          * Creates type class file.
          */
         if ((fileType & GENERATE_UNION_CLASS) != 0) {
-            addImportsToStringAndHasCodeMethods(imports);
+            addImportsToStringAndHasCodeMethods(imports, true);
             setTypeClassJavaFileHandle(getJavaFileHandle(getJavaClassName(UNION_TYPE_CLASS_FILE_NAME_SUFFIX)));
             generateUnionClassFile(getTypeClassJavaFileHandle(), curNode, imports);
         }
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
index 6837aa4..dd08265 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaModule.java
@@ -39,6 +39,7 @@
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.isGenerationOfCodeReq;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.searchAndDeleteTempDir;
+import static org.onosproject.yangutils.utils.UtilConstants.SBI;
 
 /**
  * Represents module information extended to support java code generation.
@@ -159,10 +160,13 @@
 
         try {
             if (isManagerCodeGenRequired(this) && isGenerationOfCodeReq(getJavaFileInfo())) {
-                getTempJavaCodeFragmentFiles()
-                        .generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
-                getTempJavaCodeFragmentFiles()
-                        .generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
+                if ((getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi() == null) ||
+                        (!getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi().equals(SBI))) {
+                    getTempJavaCodeFragmentFiles()
+                            .generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+                    getTempJavaCodeFragmentFiles()
+                            .generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
+                }
             }
             searchAndDeleteTempDir(getJavaFileInfo().getBaseCodeGenPath() +
                     getJavaFileInfo().getPackageFilePath());
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
index f7176e2..e029ecd 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaSubModule.java
@@ -40,6 +40,7 @@
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.isManagerCodeGenRequired;
 import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.isGenerationOfCodeReq;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
+import static org.onosproject.yangutils.utils.UtilConstants.SBI;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.searchAndDeleteTempDir;
 
 /**
@@ -127,8 +128,7 @@
     /**
      * Returns the name space of the module to which the sub module belongs to.
      *
-     * @param belongsToInfo Information of the module to which the sub module
-     *                      belongs
+     * @param belongsToInfo Information of the module to which the sub module belongs
      * @return the name space string of the module.
      */
     public String getNameSpaceFromModule(YangBelongsTo belongsToInfo) {
@@ -136,8 +136,7 @@
     }
 
     /**
-     * Prepares the information for java code generation corresponding to YANG
-     * submodule info.
+     * Prepares the information for java code generation corresponding to YANG submodule info.
      *
      * @param yangPlugin YANG plugin config
      * @throws TranslatorException when fails to translate
@@ -171,9 +170,11 @@
          */
         try {
             if (isManagerCodeGenRequired(this) && isGenerationOfCodeReq(getJavaFileInfo())) {
-
-                getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
-                getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
+                if ((getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi() == null) ||
+                        (!getJavaFileInfo().getPluginConfig().getCodeGenerateForsbi().equals(SBI))) {
+                    getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+                    getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
+                }
             }
             searchAndDeleteTempDir(getJavaFileInfo().getBaseCodeGenPath() +
                     getJavaFileInfo().getPackageFilePath());
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
index ff5f7ba..f671ecf 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/ClassDefinitionGenerator.java
@@ -38,11 +38,14 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.OPERATION_BUILDER_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.OPERATION_CLASS_MASK;
 import static org.onosproject.yangutils.utils.UtilConstants.ABSTRACT;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLASS;
 import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
 import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
+import static org.onosproject.yangutils.utils.UtilConstants.OPERATION;
 import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_OPEN_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
@@ -123,8 +126,12 @@
                 return getInterfaceDefinition(yangName, curNode);
             case BUILDER_CLASS_MASK:
                 return getBuilderClassDefinition(yangName, curNode);
+            case OPERATION_BUILDER_CLASS_MASK:
+                return getOpParamBuilderClassDefinition(yangName, curNode);
             case IMPL_CLASS_MASK:
                 return getImplClassDefinition(yangName, curNode);
+            case OPERATION_CLASS_MASK:
+                return getOperClassDefinition(yangName, curNode);
             case BUILDER_INTERFACE_MASK:
                 return getBuilderInterfaceDefinition(yangName, curNode);
             case GENERATE_SERVICE_AND_MANAGER:
@@ -205,6 +212,26 @@
     }
 
     /**
+     * Returns operation param builder file class definition.
+     *
+     * @param yangName class name
+     * @param curNode   YANG node
+     * @return definition returns operation param builder file class definition
+     */
+    private static String getOpParamBuilderClassDefinition(String yangName, YangNode curNode) {
+        String clsDef = "";
+        if (curNode instanceof YangAugment) {
+            clsDef = getClassDefinitionForWhenExtended(curNode, yangName, OPERATION_BUILDER_CLASS_MASK);
+            if (clsDef != null) {
+                return clsDef;
+            }
+        }
+        return PUBLIC + SPACE + CLASS + SPACE + yangName + OPERATION + BUILDER + SPACE + EXTEND +
+                SPACE + getCapitalCase(DEFAULT) + yangName + PERIOD + yangName + BUILDER + SPACE +
+                OPEN_CURLY_BRACKET + NEW_LINE;
+    }
+
+    /**
      * Returns impl file class definition.
      *
      * @param yangName file name
@@ -223,6 +250,26 @@
     }
 
     /**
+     * Returns operation param file class definition.
+     *
+     * @param yangName class name
+     * @param curNode   YANG node
+     * @return definition returns operation param file class definition
+     */
+    private static String getOperClassDefinition(String yangName, YangNode curNode) {
+        String clsDef = "";
+        if (curNode instanceof YangAugment) {
+            clsDef = getClassDefinitionForWhenExtended(curNode, yangName, OPERATION_CLASS_MASK);
+            if (clsDef != null) {
+                return clsDef;
+            }
+        }
+
+        return PUBLIC + SPACE + CLASS + SPACE + yangName + OPERATION + SPACE + EXTEND + SPACE
+                + getCapitalCase(DEFAULT) + yangName + SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
+    }
+
+    /**
      * Returns impl file class definition.
      *
      * @param yangName file name
@@ -413,6 +460,19 @@
                     return def + SPACE + IMPLEMENTS + SPACE
                             + yangName + SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
 
+                case OPERATION_CLASS_MASK:
+                    def = def + SPACE + CLASS + SPACE + yangName + OPERATION + SPACE;
+                    for (JavaQualifiedTypeInfo info : holder.getExtendsList()) {
+                        if (!info.getClassInfo().contains(BUILDER)
+                                && info.getClassInfo().contains(OPERATION)) {
+                            def = getDefinitionString(def, info, holder);
+                        }
+                    }
+
+                    def = trimAtLast(def, COMMA);
+
+                    return def + SPACE + EXTEND + SPACE
+                            + getCapitalCase(DEFAULT) + yangName + SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
                 default:
                     return null;
             }
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
index 3f1a7d9..ade6375 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGen.java
@@ -105,16 +105,17 @@
     /**
      * Returns the textual java code for attribute definition in class.
      *
-     * @param javaAttributeTypePkg Package of the attribute type
-     * @param javaAttributeType    java attribute type
-     * @param javaAttributeName    name of the attribute
-     * @param isList               is list attribute
-     * @return the textual java code for attribute definition in class
+     * @param javaAttributeTypePkg  Package of the attribute type
+     * @param javaAttributeType     java attribute type
+     * @param javaAttributeName     name of the attribute
+     * @param isList                is list attribute
+     * @param attributeAccessType   attribute access type
+     * @return  the textual java code for attribute definition in class
      */
     public static String getJavaAttributeDefination(String javaAttributeTypePkg, String javaAttributeType,
-                                                    String javaAttributeName, boolean isList) {
+            String javaAttributeName, boolean isList, String attributeAccessType) {
 
-        String attributeDefination = PRIVATE + SPACE;
+        String attributeDefination = attributeAccessType + SPACE;
 
         if (!isList) {
             if (javaAttributeTypePkg != null) {
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
index 46c9dd1..c9d28a7 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGenerator.java
@@ -22,6 +22,9 @@
 import java.util.List;
 
 import org.onosproject.yangutils.datamodel.YangAugment;
+import org.onosproject.yangutils.datamodel.YangLeaf;
+import org.onosproject.yangutils.datamodel.YangLeafList;
+import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
@@ -44,6 +47,8 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.OPERATION_BUILDER_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.OPERATION_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.AUGMENTE_CLASS_CONSTRUCTOR_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
@@ -91,11 +96,21 @@
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getHashCodeMethodOpen;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getOmitNullValueString;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getOpParamConstructorStart;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getOperationTypeSetter;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getOperationTypegetter;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getOverRideString;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForClass;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForLeaf;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForLeafList;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterString;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringLeafListgetter;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringLeafgetter;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
 import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringSelectLeafListgetter;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getToStringSelectLeafgetter;
+import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getisFilterContentMatch;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
@@ -118,6 +133,27 @@
 import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
 import static org.onosproject.yangutils.utils.UtilConstants.SERVICE_METHOD_STRING;
 import static org.onosproject.yangutils.utils.UtilConstants.SUPER;
+import static org.onosproject.yangutils.utils.UtilConstants.BITSET;
+import static org.onosproject.yangutils.utils.UtilConstants.GET_FILTER_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.FILTER_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.GET_FILTER_LEAF_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.FILTER_LEAF_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_ENUM;
+import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM_TYPE;
+import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
+import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
+import static org.onosproject.yangutils.utils.UtilConstants.NEW;
+import static org.onosproject.yangutils.utils.UtilConstants.STATIC;
+import static org.onosproject.yangutils.utils.UtilConstants.ENUM;
+import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
+import static org.onosproject.yangutils.utils.UtilConstants.MERGE;
+import static org.onosproject.yangutils.utils.UtilConstants.REPLACE;
+import static org.onosproject.yangutils.utils.UtilConstants.CREATE;
+import static org.onosproject.yangutils.utils.UtilConstants.REMOVE;
+import static org.onosproject.yangutils.utils.UtilConstants.DELETE;
+import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.TYPE_CONSTRUCTOR;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
@@ -328,6 +364,119 @@
     }
 
     /**
+     * Returns generated op param builder class file for current node.
+     * @param file    file handle
+     * @param curNode  current YANG node
+     * @param isAttrPresent if any attribute is present or not
+     * @return builder class file
+     * @throws IOException when fails to write in file
+     */
+    public static File generateOpParamBuilderClassFile(File file, YangNode curNode,
+                                                boolean isAttrPresent) throws IOException {
+
+        JavaFileInfo javaFileInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
+        YangPluginConfig pluginConfig = javaFileInfo.getPluginConfig();
+
+        String className = getCapitalCase(javaFileInfo.getJavaName());
+
+        initiateJavaFileGeneration(file, OPERATION_BUILDER_CLASS_MASK, null, curNode, className);
+        List<String> methods = new ArrayList<>();
+
+        if (isAttrPresent) {
+            /**
+             * Add attribute strings.
+             */
+            try {
+                insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                        OPERATION_ENUM + SPACE + OP_PARAM_TYPE + SEMI_COLAN + NEW_LINE);
+
+            } catch (IOException e) {
+                throw new IOException("No data found in temporary java code fragment files for " + className
+                                              + " while impl class file generation");
+            }
+
+            try {
+                if (curNode instanceof YangLeavesHolder) {
+                    YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
+                    List<YangLeaf> leaves = leavesHolder.getListOfLeaf();
+                    List<YangLeafList> listOfLeafList = leavesHolder.getListOfLeafList();
+
+                    if (leaves != null && !leaves.isEmpty()) {
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + FILTER_LEAF + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SEMI_COLAN
+                                + NEW_LINE);
+
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + SELECT_LEAF + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SEMI_COLAN + NEW_LINE);
+                    }
+
+                    if (listOfLeafList != null && !listOfLeafList.isEmpty()) {
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + FILTER_LEAF_LIST + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SEMI_COLAN + NEW_LINE);
+
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + SELECT_LEAF_LIST + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SEMI_COLAN + NEW_LINE);
+                    }
+                }
+
+            } catch (IOException e) {
+                throw new IOException("No data found in temporary java code fragment files for " + className
+                                              + " while impl class file generation");
+            }
+
+            try {
+                /**
+                 * Setter methods.
+                 */
+                methods.add(getSetterForLeaf(className, curNode, pluginConfig));
+                methods.add(getSetterForLeafList(className, curNode, pluginConfig));
+
+                if (curNode instanceof YangLeavesHolder) {
+                    YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
+                    List<YangLeaf> leaves = leavesHolder.getListOfLeaf();
+                    List<YangLeafList> listOfLeafList = leavesHolder.getListOfLeafList();
+
+                    if (leaves != null && !leaves.isEmpty()) {
+                        methods.add(getToStringLeafgetter());
+                        methods.add(getToStringSelectLeafgetter());
+                    }
+
+                    if (listOfLeafList != null && !listOfLeafList.isEmpty()) {
+                        methods.add(getToStringLeafListgetter());
+                        methods.add(getToStringSelectLeafListgetter());
+                    }
+                }
+
+                methods.add(getOperationTypegetter());
+                methods.add(getOperationTypeSetter());
+                insertDataIntoJavaFile(file, NEW_LINE);
+            } catch (IOException e) {
+                throw new IOException("No data found in temporary java code fragment files for " + className
+                                              + " while builder class file generation");
+            }
+        } else {
+            insertDataIntoJavaFile(file, NEW_LINE);
+        }
+
+        /**
+         * Add methods in builder class.
+         */
+        for (String method : methods) {
+            insertDataIntoJavaFile(file, method);
+        }
+        insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET);
+        return validateLineLength(file);
+    }
+
+
+    /**
      * Returns generated manager class file for current node.
      *
      * @param file    file
@@ -513,6 +662,160 @@
     }
 
     /**
+     * Returns generated op param class file for current node.
+     *
+     * @param file           file handle
+     * @param curNode        current YANG node
+     * @param isAttrPresent  if any attribute is present or not
+     * @param imports        import list
+     * @return    returns generated op param class file for current node
+     * @throws IOException when fails to write in file
+     */
+    public static File generateOpParamImplClassFile(File file, YangNode curNode,
+                                                    boolean isAttrPresent, List<String> imports)
+            throws IOException {
+
+        JavaFileInfo javaFileInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
+        YangPluginConfig pluginConfig = javaFileInfo.getPluginConfig();
+
+        String className = getCapitalCase(javaFileInfo.getJavaName());
+        String path = javaFileInfo.getBaseCodeGenPath() + javaFileInfo.getPackageFilePath();
+
+        initiateJavaFileGeneration(file, OPERATION_CLASS_MASK, imports, curNode, className);
+
+        List<String> methods = new ArrayList<>();
+
+        if (isAttrPresent) {
+            /**
+             * Add attribute strings.
+             */
+            try {
+                insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PUBLIC + SPACE + STATIC +
+                        SPACE + ENUM + SPACE + OPERATION_ENUM + SPACE + OPEN_CURLY_BRACKET +
+                        NEW_LINE + EIGHT_SPACE_INDENTATION + MERGE +
+                        NEW_LINE + EIGHT_SPACE_INDENTATION + REPLACE +
+                        NEW_LINE + EIGHT_SPACE_INDENTATION + CREATE +
+                        NEW_LINE + EIGHT_SPACE_INDENTATION + DELETE +
+                        NEW_LINE + EIGHT_SPACE_INDENTATION + REMOVE +
+                        NEW_LINE + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE);
+
+            } catch (IOException e) {
+                throw new IOException("No data found in temporary java code fragment files for " + className
+                                              + " while impl class file generation");
+            }
+
+            /**
+             * Add attribute strings.
+             */
+            try {
+                insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                        OPERATION_ENUM + SPACE + OP_PARAM_TYPE + SEMI_COLAN + NEW_LINE);
+
+            } catch (IOException e) {
+                throw new IOException("No data found in temporary java code fragment files for " + className
+                                              + " while impl class file generation");
+            }
+
+            try {
+                if (curNode instanceof YangLeavesHolder) {
+                    YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
+                    List<YangLeaf> leaves = leavesHolder.getListOfLeaf();
+                    List<YangLeafList> listOfLeafList = leavesHolder.getListOfLeafList();
+
+                    if (leaves != null && !leaves.isEmpty()) {
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + FILTER_LEAF + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SEMI_COLAN + NEW_LINE);
+
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + SELECT_LEAF + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SEMI_COLAN + NEW_LINE);
+                    }
+
+                    if (listOfLeafList != null && !listOfLeafList.isEmpty()) {
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + FILTER_LEAF_LIST + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SEMI_COLAN + NEW_LINE);
+
+                        insertDataIntoJavaFile(file, FOUR_SPACE_INDENTATION + PRIVATE + SPACE +
+                                BITSET + SPACE + SELECT_LEAF_LIST + SPACE + EQUAL + SPACE +
+                                NEW + SPACE + BITSET + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SEMI_COLAN + NEW_LINE);
+                    }
+                }
+
+            } catch (IOException e) {
+                throw new IOException("No data found in temporary java code fragment files for " + className
+                                              + " while impl class file generation");
+            }
+
+            if (curNode instanceof YangLeavesHolder) {
+                YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
+                List<YangLeaf> leaves = leavesHolder.getListOfLeaf();
+                List<YangLeafList> listOfLeafList = leavesHolder.getListOfLeafList();
+
+                if (leaves != null && !leaves.isEmpty()) {
+                    methods.add(getToStringLeafgetter());
+                    methods.add(getToStringSelectLeafgetter());
+                }
+
+                if (listOfLeafList != null && !listOfLeafList.isEmpty()) {
+                    methods.add(getToStringLeafListgetter());
+                    methods.add(getToStringSelectLeafListgetter());
+                }
+            }
+
+            methods.add(getOperationTypegetter());
+            methods.add(getisFilterContentMatch(className, curNode, pluginConfig));
+
+        } else {
+            insertDataIntoJavaFile(file, NEW_LINE);
+        }
+        String constructor = getOpParamConstructorStart(className, pluginConfig);
+
+        constructor = constructor + EIGHT_SPACE_INDENTATION + SUPER + OPEN_PARENTHESIS
+                + BUILDER.toLowerCase() + OBJECT
+                + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE;
+
+        if (curNode instanceof YangLeavesHolder) {
+            YangLeavesHolder leavesHolder = (YangLeavesHolder) curNode;
+            List<YangLeaf> leaves = leavesHolder.getListOfLeaf();
+            List<YangLeafList> listOfLeafList = leavesHolder.getListOfLeafList();
+            String filterLeaf = "";
+            String filterLeafList = "";
+
+            if (leaves != null && !leaves.isEmpty()) {
+                filterLeaf = EIGHT_SPACE_INDENTATION + FILTER_LEAF + SPACE + EQUAL + SPACE
+                        + BUILDER.toLowerCase() + OBJECT + PERIOD + GET_FILTER_LEAF + OPEN_PARENTHESIS
+                        + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE;
+            }
+
+            if (listOfLeafList != null && !listOfLeafList.isEmpty()) {
+                filterLeafList = EIGHT_SPACE_INDENTATION + FILTER_LEAF_LIST + SPACE + EQUAL + SPACE
+                        + BUILDER.toLowerCase() + OBJECT + PERIOD + GET_FILTER_LEAF_LIST + OPEN_PARENTHESIS
+                        + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE;
+            }
+
+            constructor = constructor + filterLeaf + filterLeafList;
+        }
+
+        methods.add(constructor + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET);
+
+        /**
+         * Add methods in impl class.
+         */
+        for (String method : methods) {
+            insertDataIntoJavaFile(file, method);
+        }
+
+
+        return validateLineLength(file);
+    }
+
+    /**
      * Generates class file for type def.
      *
      * @param file    generated file
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
index 6f4fa9b..14e71ad 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -55,6 +55,8 @@
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_UNION_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.IMPL_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.INTERFACE_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.OPERATION_BUILDER_CLASS_MASK;
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.OPERATION_CLASS_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.ATTRIBUTES_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.AUGMENTE_CLASS_CONSTRUCTOR_MASK;
 import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.CONSTRUCTOR_FOR_TYPE_MASK;
@@ -95,6 +97,7 @@
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT_LISTENER;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.EVENT_SUBJECT_CLASS;
+import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.OPERATION_CLASS;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.IMPL_CLASS;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.INTERFACE;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.RPC_INTERFACE;
@@ -371,9 +374,16 @@
                 appendHeaderContents(file, pkgString, importsList);
                 write(file, genType, IMPL_CLASS, curNode, className);
                 break;
+            case OPERATION_CLASS_MASK:
+                appendHeaderContents(file, pkgString, importsList);
+                write(file, genType, OPERATION_CLASS, curNode, className);
+                break;
             case BUILDER_CLASS_MASK:
                 write(file, genType, BUILDER_CLASS, curNode, className);
                 break;
+            case OPERATION_BUILDER_CLASS_MASK:
+                write(file, genType, BUILDER_CLASS, curNode, className);
+                break;
             case BUILDER_INTERFACE_MASK:
                 write(file, genType, BUILDER_INTERFACE, curNode, className);
                 break;
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index ffc0a46..14243ca 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -19,6 +19,9 @@
 import java.util.List;
 import java.util.Map;
 
+import org.onosproject.yangutils.datamodel.YangLeaf;
+import org.onosproject.yangutils.datamodel.YangLeafList;
+import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangAtomicPath;
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangNode;
@@ -27,15 +30,29 @@
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
+import org.onosproject.yangutils.translator.tojava.TempJavaBeanFragmentFiles;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
 import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
 
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.DECIMAL64;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT8;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT16;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT32;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.INT64;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT8;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT16;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.BOOLEAN;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT64;
+import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.UINT32;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_SUBJECT_CLASS;
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getAugmentedClassNameForDataMethods;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getParentNodeNameForDataMethods;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getResolvedAugmentsForManager;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getSetOfNodeIdentifiers;
+import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.getJavaAttributeOfLeaf;
+import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.getJavaAttributeOfLeafList;
 import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE;
 import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE_ANNOTATION;
 import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
@@ -134,6 +151,25 @@
 import static org.onosproject.yangutils.utils.UtilConstants.VOID;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_UTILS_TODO;
+import static org.onosproject.yangutils.utils.UtilConstants.OPERATION;
+import static org.onosproject.yangutils.utils.UtilConstants.BITSET;
+import static org.onosproject.yangutils.utils.UtilConstants.GET_FILTER_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.FILTER_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.GET_SELECT_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
+import static org.onosproject.yangutils.utils.UtilConstants.GET_FILTER_LEAF_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.FILTER_LEAF_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.GET_SELECT_LEAF_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF_LIST;
+import static org.onosproject.yangutils.utils.UtilConstants.OPERATION_ENUM;
+import static org.onosproject.yangutils.utils.UtilConstants.GET_OPERATION_TYPE;
+import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM_TYPE;
+import static org.onosproject.yangutils.utils.UtilConstants.SET_OPERATION_TYPE;
+import static org.onosproject.yangutils.utils.UtilConstants.RECEIVED_OBJECT;
+import static org.onosproject.yangutils.utils.UtilConstants.FILTER_CONTENT_MATCH;
+import static org.onosproject.yangutils.utils.UtilConstants.APP_INSTANCE;
+import static org.onosproject.yangutils.utils.UtilConstants.NOT;
+import static org.onosproject.yangutils.utils.UtilConstants.OR_OPERATION;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.BUILD_METHOD;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.CONSTRUCTOR;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR;
@@ -537,6 +573,21 @@
     }
 
     /**
+     * Returns constructor string for op param class.
+     *
+     * @param yangName      class name
+     * @param pluginConfig    plugin configurations
+     * @return     constructor string
+     */
+    public static String getOpParamConstructorStart(String yangName, YangPluginConfig pluginConfig) {
+
+        String javadoc = getConstructorString(yangName, pluginConfig);
+        String constructor = FOUR_SPACE_INDENTATION + PUBLIC + SPACE + yangName + OPERATION +
+                OPEN_PARENTHESIS + yangName + OPERATION + BUILDER + SPACE + BUILDER.toLowerCase() + OBJECT
+                + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
+        return javadoc + constructor;
+    }
+    /**
      * Returns the constructor strings for class file.
      *
      * @param attr               attribute info
@@ -652,6 +703,278 @@
     }
 
     /**
+     * Returns to string leaf for get method.
+     *
+     * @return  string leaf for get method
+     */
+    public static String getToStringLeafgetter() {
+        return NEW_LINE + NEW_LINE + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + BITSET + SPACE + GET_FILTER_LEAF
+                +  OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE
+                + EIGHT_SPACE_INDENTATION + RETURN + SPACE + FILTER_LEAF + SEMI_COLAN + NEW_LINE
+                + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns to string select leaf for get method.
+     *
+     * @return select leaf string for get method
+     */
+    public static String getToStringSelectLeafgetter() {
+        return NEW_LINE + NEW_LINE + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + BITSET + SPACE + GET_SELECT_LEAF
+                +  OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE
+                + EIGHT_SPACE_INDENTATION + RETURN + SPACE + SELECT_LEAF + SEMI_COLAN + NEW_LINE
+                + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns to string leaf list for get method.
+     *
+     * @return  string leaf list for get method
+     */
+    public static String getToStringLeafListgetter() {
+        return NEW_LINE + NEW_LINE + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + BITSET + SPACE + GET_FILTER_LEAF_LIST
+                +  OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE
+                + EIGHT_SPACE_INDENTATION + RETURN + SPACE + FILTER_LEAF_LIST + SEMI_COLAN + NEW_LINE
+                + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns to string select leaf list for get.
+     *
+     * @return select leaf list list for get
+     */
+    public static String getToStringSelectLeafListgetter() {
+        return NEW_LINE + NEW_LINE + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + BITSET + SPACE + GET_SELECT_LEAF_LIST
+                +  OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET + NEW_LINE
+                + EIGHT_SPACE_INDENTATION + RETURN + SPACE + SELECT_LEAF_LIST + SEMI_COLAN + NEW_LINE
+                + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns to string operation type for get method.
+     *
+     * @return operation type for get method
+     */
+    public static String getOperationTypegetter() {
+        return NEW_LINE + NEW_LINE + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + OPERATION_ENUM
+                + SPACE + GET_OPERATION_TYPE +  OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SPACE
+                + OPEN_CURLY_BRACKET + NEW_LINE + EIGHT_SPACE_INDENTATION + RETURN + SPACE
+                + OP_PARAM_TYPE + SEMI_COLAN + NEW_LINE + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns to string operation type for set.
+     *
+     * @return operation type set method
+     */
+    public static String getOperationTypeSetter() {
+        return NEW_LINE + NEW_LINE + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + VOID + SPACE + SET_OPERATION_TYPE
+                +  OPEN_PARENTHESIS + OPERATION_ENUM + SPACE + getSmallCase(OPERATION_ENUM) + CLOSE_PARENTHESIS
+                + SPACE + OPEN_CURLY_BRACKET + NEW_LINE + EIGHT_SPACE_INDENTATION + THIS + PERIOD
+                + OP_PARAM_TYPE + SPACE + EQUAL + SPACE + getSmallCase(OPERATION_ENUM) + SEMI_COLAN + NEW_LINE
+                + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+    }
+
+    /**
+     * Returns string for leaf set method.
+     *
+     * @param className   class name
+     * @param curnode    current YANG node
+     * @param pluginConfig plugin configurations
+     * @return  string for leaf set method
+     */
+    public static String getSetterForLeaf(String className, YangNode curnode, YangPluginConfig pluginConfig) {
+
+        int numleaf = 1;
+        String filterMethod = "";
+        TempJavaBeanFragmentFiles tempFragmentFiles = ((JavaCodeGeneratorInfo) curnode)
+                .getTempJavaCodeFragmentFiles().getBeanTempFiles();
+        if (curnode instanceof YangLeavesHolder) {
+            YangLeavesHolder leavesHolder = (YangLeavesHolder) curnode;
+            List<YangLeaf> leaves = leavesHolder.getListOfLeaf();
+            if (leaves !=  null && !leaves.isEmpty()) {
+                for (YangLeaf leaf : leaves) {
+                    JavaAttributeInfo javaAttributeInfo = getJavaAttributeOfLeaf(tempFragmentFiles, leaf, pluginConfig);
+                    String attrQuaifiedType = getReturnType(javaAttributeInfo);
+                    String attributeName = javaAttributeInfo.getAttributeName();
+
+                    filterMethod = filterMethod + NEW_LINE + FOUR_SPACE_INDENTATION + OVERRIDE + NEW_LINE
+                            + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + className + BUILDER + SPACE
+                            + attributeName + OPEN_PARENTHESIS + attrQuaifiedType
+                            + SPACE + RECEIVED_OBJECT + attributeName + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET
+                            + NEW_LINE + EIGHT_SPACE_INDENTATION + attributeName + SPACE + EQUAL + SPACE
+                            + RECEIVED_OBJECT + attributeName + SEMI_COLAN + NEW_LINE + EIGHT_SPACE_INDENTATION
+                            + GET_FILTER_LEAF + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD + SET_METHOD_PREFIX
+                            + OPEN_PARENTHESIS + String.valueOf(numleaf) + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE
+                            + EIGHT_SPACE_INDENTATION + RETURN + SPACE + THIS + SEMI_COLAN + NEW_LINE
+                            + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET;
+                    numleaf++;
+                }
+            }
+        }
+        return filterMethod;
+    }
+
+    /**
+     * Returns string for leaf list set method.
+     *
+     * @param className  class name
+     * @param curnode    current YANG node
+     * @param pluginConfig  plugin configurations
+     * @return string for leaf list set method
+     */
+    public static String getSetterForLeafList(String className, YangNode curnode, YangPluginConfig pluginConfig) {
+
+        int numleaf = 1;
+        String filterMethod = "";
+        TempJavaBeanFragmentFiles tempFragmentFiles = ((JavaCodeGeneratorInfo) curnode)
+                .getTempJavaCodeFragmentFiles().getBeanTempFiles();
+        if (curnode instanceof YangLeavesHolder) {
+            YangLeavesHolder leavesHolder = (YangLeavesHolder) curnode;
+            List<YangLeafList> listOfLeafList = leavesHolder.getListOfLeafList();
+
+            if (listOfLeafList !=  null && !listOfLeafList.isEmpty()) {
+                for (YangLeafList leafList : listOfLeafList) {
+                    JavaAttributeInfo javaAttributeInfo = getJavaAttributeOfLeafList(tempFragmentFiles, leafList,
+                                                                                     pluginConfig);
+                    String attributeName = javaAttributeInfo.getAttributeName();
+                    String attrQuaifiedType = getReturnType(javaAttributeInfo);
+                    if (javaAttributeInfo.isListAttr()) {
+                        attrQuaifiedType = getListString() + attrQuaifiedType + DIAMOND_CLOSE_BRACKET;
+                    }
+                    filterMethod = filterMethod + NEW_LINE + FOUR_SPACE_INDENTATION + OVERRIDE + NEW_LINE
+                            + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + className + BUILDER + SPACE
+                            + attributeName + OPEN_PARENTHESIS + attrQuaifiedType
+                            + SPACE + RECEIVED_OBJECT + attributeName + CLOSE_PARENTHESIS + SPACE + OPEN_CURLY_BRACKET
+                            + NEW_LINE + EIGHT_SPACE_INDENTATION + attributeName + SPACE + EQUAL + SPACE
+                            + RECEIVED_OBJECT + attributeName + SEMI_COLAN + NEW_LINE + EIGHT_SPACE_INDENTATION
+                            + GET_FILTER_LEAF_LIST + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD + SET_METHOD_PREFIX
+                            + OPEN_PARENTHESIS + String.valueOf(numleaf) + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE
+                            + EIGHT_SPACE_INDENTATION + RETURN + SPACE + THIS + SEMI_COLAN + NEW_LINE
+                            + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET;
+                    numleaf++;
+                }
+            }
+        }
+        return filterMethod;
+    }
+
+    /**
+     * Returns whether the data type is of primitive data type.
+     *
+     * @param dataType data type to be checked
+     * @return true, if data type can have primitive data type, false otherwise
+     */
+    public static boolean isPrimitiveDataType(YangDataTypes dataType) {
+        return dataType == INT8
+                || dataType == INT16
+                || dataType == INT32
+                || dataType == INT64
+                || dataType == UINT8
+                || dataType == UINT16
+                || dataType == UINT32
+                || dataType == UINT64
+                || dataType == DECIMAL64
+                || dataType == BOOLEAN;
+    }
+
+    /**
+     * Returns string for is filter content match method.
+     *
+     * @param className   class name
+     * @param curnode   current YANG node
+     * @param pluginConfig   plugin configurations
+     * @return  string for is filter content match method
+     */
+    public static String getisFilterContentMatch(String className, YangNode curnode, YangPluginConfig pluginConfig) {
+
+        int numleaf = 1;
+        String filterMethod = "";
+        TempJavaBeanFragmentFiles tempFragmentFiles = ((JavaCodeGeneratorInfo) curnode)
+                .getTempJavaCodeFragmentFiles().getBeanTempFiles();
+
+        if (curnode instanceof YangLeavesHolder) {
+            YangLeavesHolder leavesHolder = (YangLeavesHolder) curnode;
+            List<YangLeaf> leaves = leavesHolder.getListOfLeaf();
+            List<YangLeafList> listOfLeafList = leavesHolder.getListOfLeafList();
+            if (leaves !=  null || listOfLeafList != null) {
+                filterMethod = NEW_LINE + NEW_LINE + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + BOOLEAN_DATA_TYPE
+                        + SPACE + FILTER_CONTENT_MATCH + OPEN_PARENTHESIS + getCapitalCase(DEFAULT)
+                        + getCapitalCase(className) + SPACE + APP_INSTANCE + CLOSE_PARENTHESIS + SPACE
+                        + OPEN_CURLY_BRACKET + NEW_LINE;
+            }
+            if (leaves !=  null) {
+                for (YangLeaf leaf : leaves) {
+                    JavaAttributeInfo javaAttributeInfo = getJavaAttributeOfLeaf(tempFragmentFiles, leaf,
+                                                                                 pluginConfig);
+                    String attributeName = javaAttributeInfo.getAttributeName();
+
+                    String attrQuaifiedType = "";
+                    if (isPrimitiveDataType(leaf.getDataType().getDataType())) {
+                        attrQuaifiedType = APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SPACE + NOT + EQUAL + SPACE + attributeName + OPEN_PARENTHESIS
+                                + CLOSE_PARENTHESIS;
+                    } else {
+                        attrQuaifiedType = APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SPACE + EQUAL + EQUAL + SPACE + NULL + SPACE + OR_OPERATION + SPACE + OPEN_PARENTHESIS
+                                + NOT + OPEN_PARENTHESIS + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + PERIOD + EQUALS_STRING + OPEN_PARENTHESIS + APP_INSTANCE + PERIOD
+                                + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + CLOSE_PARENTHESIS
+                                + CLOSE_PARENTHESIS + CLOSE_PARENTHESIS;
+                    }
+
+                    filterMethod = filterMethod + EIGHT_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS
+                            + GET_FILTER_LEAF + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD + GET_METHOD_PREFIX
+                            + OPEN_PARENTHESIS + String.valueOf(numleaf) + CLOSE_PARENTHESIS + CLOSE_PARENTHESIS
+                            + SPACE + OPEN_CURLY_BRACKET + NEW_LINE + TWELVE_SPACE_INDENTATION + IF + SPACE
+                            + OPEN_PARENTHESIS + attrQuaifiedType + CLOSE_PARENTHESIS + SPACE
+                            + OPEN_CURLY_BRACKET + NEW_LINE + SIXTEEN_SPACE_INDENTATION + RETURN + SPACE + FALSE
+                            + SEMI_COLAN + NEW_LINE + TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE
+                            + EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+                    numleaf++;
+                }
+            }
+
+            if (listOfLeafList !=  null) {
+                numleaf = 1;
+                for (YangLeafList leafList : listOfLeafList) {
+                    JavaAttributeInfo javaAttributeInfo = getJavaAttributeOfLeafList(tempFragmentFiles, leafList,
+                                                                                 pluginConfig);
+                    String attributeName = javaAttributeInfo.getAttributeName();
+                    String attrQuaifiedType = "";
+                    if (isPrimitiveDataType(leafList.getDataType().getDataType())) {
+                        attrQuaifiedType = APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SPACE + NOT + EQUAL + SPACE + attributeName + OPEN_PARENTHESIS
+                                + CLOSE_PARENTHESIS;
+                    } else {
+                        attrQuaifiedType = APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + SPACE + EQUAL + EQUAL + SPACE + NULL + OR_OPERATION + OPEN_PARENTHESIS + NOT
+                                + OPEN_PARENTHESIS + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS
+                                + PERIOD + EQUALS_STRING + OPEN_PARENTHESIS + APP_INSTANCE + PERIOD
+                                + attributeName + OPEN_PARENTHESIS + CLOSE_PARENTHESIS;
+                    }
+
+                    filterMethod = filterMethod + EIGHT_SPACE_INDENTATION + IF + SPACE + OPEN_PARENTHESIS
+                            + GET_FILTER_LEAF_LIST + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD + GET_METHOD_PREFIX
+                            + OPEN_PARENTHESIS + String.valueOf(numleaf) + CLOSE_PARENTHESIS + CLOSE_PARENTHESIS
+                            + SPACE + OPEN_CURLY_BRACKET + NEW_LINE + TWELVE_SPACE_INDENTATION + IF + SPACE
+                            + OPEN_PARENTHESIS + attrQuaifiedType + CLOSE_PARENTHESIS + SPACE
+                            + OPEN_CURLY_BRACKET + NEW_LINE + SIXTEEN_SPACE_INDENTATION + RETURN + SPACE + FALSE
+                            + SEMI_COLAN + NEW_LINE + TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE
+                            + EIGHT_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+                    numleaf++;
+                }
+            }
+
+            if (leaves !=  null || listOfLeafList != null) {
+                filterMethod = filterMethod + EIGHT_SPACE_INDENTATION + RETURN + SPACE + TRUE + SEMI_COLAN +
+                        NEW_LINE + FOUR_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE;
+            }
+        }
+        return filterMethod;
+    }
+
+    /**
      * Returns omit null value string.
      *
      * @return omit null value string
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index 44dddea..21f8d65 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -47,6 +47,11 @@
     public static final String EVENT_JAVA_DOC = " * Represents event implementation of ";
 
     /**
+     * JavaDocs for op param class.
+     */
+    public static final String OP_PARAM_JAVA_DOC = " * Represents operation parameter implementation of ";
+
+    /**
      * JavaDocs for event listener.
      */
     public static final String EVENT_LISTENER_JAVA_DOC = " * Abstraction for event listener of ";
@@ -167,6 +172,21 @@
     public static final String DEFAULT = "default";
 
     /**
+     * Static attribute for op param class.
+     */
+    public static final String OPERATION = "OpParam";
+
+    /**
+     * Static attribute for operation type.
+     */
+    public static final String OPERATION_ENUM = "OperationType";
+
+    /**
+     * Static attribute for java code generation for sbi.
+     */
+    public static final String SBI = "sbi";
+
+    /**
      * Static attribute for multiple new line.
      */
     public static final String MULTIPLE_NEW_LINE = "\n\n";
@@ -512,6 +532,11 @@
     public static final String OPEN_PARENTHESIS = "(";
 
     /**
+     * Static attribute for received syntax.
+     */
+    public static final String RECEIVED_OBJECT = "recv";
+
+    /**
      * Static attribute for switch syntax.
      */
     public static final String SWITCH = "switch";
@@ -562,11 +587,76 @@
     public static final String SET_METHOD_PREFIX = "set";
 
     /**
+     * Static attribute for get filter leaf flags.
+     */
+    public static final String GET_FILTER_LEAF = "getFilterLeafFlags";
+
+    /**
+     * Static attribute for get filter leaf list flags.
+     */
+    public static final String GET_FILTER_LEAF_LIST = "getFilterLeafListFlags";
+
+    /**
+     * Static attribute for filter leaf flags.
+     */
+    public static final String FILTER_LEAF = "filterLeafFlags";
+
+    /**
+     * Static attribute for filter leaf list flags.
+     */
+    public static final String FILTER_LEAF_LIST = "filterLeafListFlags";
+
+    /**
+     * Static attribute for get select leaf flags.
+     */
+    public static final String GET_SELECT_LEAF = "getSelectLeafFlags";
+
+    /**
+     * Static attribute for get select leaf list flags.
+     */
+    public static final String GET_SELECT_LEAF_LIST = "getSelectLeafListFlags";
+
+    /**
+     * Static attribute for get operation type.
+     */
+    public static final String GET_OPERATION_TYPE = "getOpertionType";
+
+    /**
+     * Static attribute for set operation type.
+     */
+    public static final String SET_OPERATION_TYPE = "setOpertionType";
+
+    /**
+     * Static attribute for select leaf flags.
+     */
+    public static final String SELECT_LEAF = "selectLeafFlags";
+
+    /**
+     * Static attribute for select leaf list flags.
+     */
+    public static final String SELECT_LEAF_LIST = "selectLeafListFlags";
+
+    /**
+     * Static attribute for op param type.
+     */
+    public static final String OP_PARAM_TYPE = "opParamType";
+
+    /**
+     * Static attribute for is filter content match method prefix.
+     */
+    public static final String FILTER_CONTENT_MATCH = "isFilterContentMatch";
+
+    /**
      * Static attribute for four space indentation.
      */
     public static final String FOUR_SPACE_INDENTATION = "    ";
 
     /**
+     * Static attribute for not syntax.
+     */
+    public static final String NOT = "!";
+
+    /**
      * Static attribute for try syntax.
      */
     public static final String TRY = "try";
@@ -582,6 +672,31 @@
     public static final String SUPER = "super";
 
     /**
+     * Static attribute for merge syntax.
+     */
+    public static final String MERGE = "MERGE,";
+
+    /**
+     * Static attribute for replace syntax.
+     */
+    public static final String REPLACE = "REPLACE,";
+
+    /**
+     * Static attribute for create syntax.
+     */
+    public static final String CREATE = "CREATE,";
+
+    /**
+     * Static attribute for delete syntax.
+     */
+    public static final String DELETE = "DELETE,";
+
+    /**
+     * Static attribute for remove syntax.
+     */
+    public static final String REMOVE = "REMOVE";
+
+    /**
      * Static attribute for eight space indentation.
      */
     public static final String EIGHT_SPACE_INDENTATION = FOUR_SPACE_INDENTATION + FOUR_SPACE_INDENTATION;
@@ -637,6 +752,11 @@
     public static final String ABSTRACT = "abstract";
 
     /**
+     * Static attribute for protected modifier.
+     */
+    public static final String PROTECTED = "protected";
+
+    /**
      * Void java type.
      */
     public static final String VOID = "void";
@@ -927,6 +1047,11 @@
     public static final String OBJECT = "Object";
 
     /**
+     * Static attribute for app instance.
+     */
+    public static final String APP_INSTANCE = "appInstance";
+
+    /**
      * Static attribute for override annotation.
      */
     public static final String OVERRIDE = "@Override";
@@ -968,6 +1093,11 @@
     public static final String JAVA_UTIL_OBJECTS_IMPORT_PKG = "java.util";
 
     /**
+     * Static attribute for bitset.
+     */
+    public static final String BITSET = "BitSet";
+
+    /**
      * Static attribute for java utilities objects import class.
      */
     public static final String JAVA_UTIL_OBJECTS_IMPORT_CLASS = "Objects;\n";
@@ -1111,6 +1241,11 @@
     public static final String EVENT_LISTENER = "EventListener";
 
     /**
+     * Static attribute for or operator.
+     */
+    public static final String OR_OPERATION = "||";
+
+    /**
      * Static attribute for YANG file error.
      */
     public static final String YANG_FILE_ERROR = "YANG file error : ";
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
index 336cc52..34e4983 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -20,6 +20,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUGMENTED_INFO;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_CLASS_JAVA_DOC;
+import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM_JAVA_DOC;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_INTERFACE_JAVA_DOC;
 import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_OBJECT;
 import static org.onosproject.yangutils.utils.UtilConstants.CLASS;
@@ -97,6 +98,12 @@
             case BUILDER_CLASS: {
                 return generateForBuilderClass(name);
             }
+            case OPERATION_CLASS: {
+                return generateForOpParamClass(name);
+            }
+            case OPERATION_BUILDER_CLASS: {
+                return generateForOpParamClass(name);
+            }
             case INTERFACE: {
                 return generateForInterface(name);
             }
@@ -401,6 +408,17 @@
     }
 
     /**
+     * Generates javaDocs for the op param class.
+     *
+     * @param className class name
+     * @return javaDocs
+     */
+    private static String generateForOpParamClass(String className) {
+        return NEW_LINE + JAVA_DOC_FIRST_LINE + OP_PARAM_JAVA_DOC + className + PERIOD + NEW_LINE
+                + JAVA_DOC_END_LINE;
+    }
+
+    /**
      * Generates javaDoc for the interface.
      *
      * @param interfaceName interface name
@@ -623,6 +641,16 @@
         /**
          * For event subject.
          */
-        EVENT_SUBJECT_CLASS
+        EVENT_SUBJECT_CLASS,
+
+        /**
+         * For operation.
+         */
+        OPERATION_CLASS,
+
+        /**
+         * For operation builder.
+         */
+        OPERATION_BUILDER_CLASS
     }
 }
diff --git a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangPluginConfig.java b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangPluginConfig.java
index d7ef5a2..8199a8e 100644
--- a/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangPluginConfig.java
+++ b/utils/yangutils/plugin/src/main/java/org/onosproject/yangutils/utils/io/impl/YangPluginConfig.java
@@ -43,6 +43,29 @@
     }
 
     /**
+     * Java code generation is for sbi.
+     */
+    private String codeGenerateForsbi;
+
+    /**
+     * Returns the string for code generation.
+     *
+     * @return returns the string for code generation.
+     */
+    public String getCodeGenerateForsbi() {
+        return codeGenerateForsbi;
+    }
+
+    /**
+     * Sets the string sbi or nbi for code generation.
+     *
+     * @par code generation is for sbi
+     */
+    public void setCodeGenerateForsbi(String codeGenerateForsbi) {
+        this.codeGenerateForsbi = codeGenerateForsbi;
+    }
+
+    /**
      * Sets the path of the java code where it has to be generated.
      *
      * @param codeGenDir path of the directory
diff --git a/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGenTest.java b/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGenTest.java
index fd5c0d3..7081156 100644
--- a/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGenTest.java
+++ b/utils/yangutils/plugin/src/test/java/org/onosproject/yangutils/translator/tojava/utils/JavaCodeSnippetGenTest.java
@@ -102,20 +102,24 @@
     @Test
     public void testForJavaAttributeInfo() {
 
-        String attributeWithoutTypePkg = getJavaAttributeDefination(null, STRING_DATA_TYPE, YANG_NAME, false);
+        String attributeWithoutTypePkg = getJavaAttributeDefination(null, STRING_DATA_TYPE, YANG_NAME,
+                                                                    false, PRIVATE);
         assertThat(true, is(attributeWithoutTypePkg.equals(
                 PRIVATE + SPACE + STRING_DATA_TYPE + SPACE + YANG_NAME + SEMI_COLAN + NEW_LINE)));
 
-        String attributeWithTypePkg = getJavaAttributeDefination(JAVA_LANG, STRING_DATA_TYPE, YANG_NAME, false);
+        String attributeWithTypePkg = getJavaAttributeDefination(JAVA_LANG, STRING_DATA_TYPE, YANG_NAME,
+                                                                 false, PRIVATE);
         assertThat(true, is(attributeWithTypePkg.equals(PRIVATE + SPACE + JAVA_LANG + PERIOD
                 + STRING_DATA_TYPE + SPACE + YANG_NAME + SEMI_COLAN + NEW_LINE)));
 
-        String attributeWithListPkg = getJavaAttributeDefination(JAVA_LANG, STRING_DATA_TYPE, YANG_NAME, true);
+        String attributeWithListPkg = getJavaAttributeDefination(JAVA_LANG, STRING_DATA_TYPE, YANG_NAME,
+                                                                 true, PRIVATE);
         assertThat(true, is(attributeWithListPkg.equals(
                 PRIVATE + SPACE + LIST + DIAMOND_OPEN_BRACKET + JAVA_LANG + PERIOD + STRING_DATA_TYPE
                         + DIAMOND_CLOSE_BRACKET + SPACE + YANG_NAME + SEMI_COLAN + NEW_LINE)));
 
-        String attributeWithListWithoutPkg = getJavaAttributeDefination(null, STRING_DATA_TYPE, YANG_NAME, true);
+        String attributeWithListWithoutPkg = getJavaAttributeDefination(null, STRING_DATA_TYPE, YANG_NAME,
+                                                                        true, PRIVATE);
         assertThat(true, is(attributeWithListWithoutPkg.equals(
                 PRIVATE + SPACE + LIST + DIAMOND_OPEN_BRACKET + STRING_DATA_TYPE + DIAMOND_CLOSE_BRACKET + SPACE
                         + YANG_NAME + SEMI_COLAN + NEW_LINE)));
