diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
index d62f40d..f647c0d 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaGrouping.java
@@ -15,18 +15,116 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
+import java.io.IOException;
+
 import org.onosproject.yangutils.datamodel.YangGrouping;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
+import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
+
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
+import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfNode;
 
 /**
  * Represents grouping information extended to support java code generation.
  */
 public class YangJavaGrouping
-        extends YangGrouping {
+        extends YangGrouping implements JavaCodeGeneratorInfo, JavaCodeGenerator {
+
+    /**
+     * Contains the information of the java file being generated.
+     */
+    private JavaFileInfo javaFileInfo;
+
+    /**
+     * File handle to maintain temporary java code fragments as per the code
+     * snippet types.
+     */
+    private TempJavaCodeFragmentFiles tempFileHandle;
 
     /**
      * Creates YANG Java grouping object.
      */
     public YangJavaGrouping() {
         super();
+        setJavaFileInfo(new JavaFileInfo());
+        getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
     }
+
+    /**
+     * Returns the generated java file information.
+     *
+     * @return generated java file information
+     */
+    @Override
+    public JavaFileInfo getJavaFileInfo() {
+        if (javaFileInfo == null) {
+            throw new TranslatorException("Missing java info in java datamodel node");
+        }
+        return javaFileInfo;
+    }
+
+    /**
+     * Sets the java file info object.
+     *
+     * @param javaInfo java file info object
+     */
+    @Override
+    public void setJavaFileInfo(JavaFileInfo javaInfo) {
+        javaFileInfo = javaInfo;
+    }
+
+    /**
+     * Returns the temporary file handle.
+     *
+     * @return temporary file handle
+     */
+    @Override
+    public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
+        return tempFileHandle;
+    }
+
+    /**
+     * Sets temporary file handle.
+     *
+     * @param fileHandle temporary file handle
+     */
+    @Override
+    public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
+        tempFileHandle = fileHandle;
+    }
+
+    /**
+     * Prepare the information for java code generation corresponding to YANG
+     * grouping info.
+     *
+     * @param yangPlugin YANG plugin config
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+        try {
+            generateCodeOfNode(this, yangPlugin);
+        } catch (IOException e) {
+            throw new TranslatorException(
+                    "Failed to prepare generate code entry for container node " + this.getName());
+        }
+    }
+
+    /**
+     * Create a java file using the YANG grouping info.
+     *
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeExit() throws TranslatorException {
+        try {
+            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to generate code for container node " + this.getName());
+        }
+    }
+
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
index e5f2dab..7934ba1 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaInput.java
@@ -26,7 +26,7 @@
 import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
-import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfNode;
+import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfAugmentableNode;
 
 /**
  * Represents input information extended to support java code generation.
@@ -46,6 +46,8 @@
      */
     private TempJavaCodeFragmentFiles tempFileHandle;
 
+    private boolean codeGenFlag;
+
     /**
      * Creates an instance of java input.
      */
@@ -108,7 +110,7 @@
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
-            generateCodeOfNode(this, yangPlugin);
+            generateCodeOfAugmentableNode(this, yangPlugin);
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code entry for input node " + this.getName());
@@ -123,9 +125,29 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            if (isCodeGenFlag()) {
+                getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            }
         } catch (IOException e) {
             throw new TranslatorException("Failed to generate code for input node " + this.getName());
         }
     }
+
+    /**
+     * Returns code generator flag.
+     *
+     * @return code generator flag
+     */
+    public boolean isCodeGenFlag() {
+        return codeGenFlag;
+    }
+
+    /**
+     * Sets code generator flag.
+     *
+     * @param codeGenFlag code generator flag
+     */
+    public void setCodeGenFlag(boolean codeGenFlag) {
+        this.codeGenFlag = codeGenFlag;
+    }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
index 10df251..6afa8c5 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaLeaf.java
@@ -71,6 +71,7 @@
      *
      * @return java naming conflict resolve configurations
      */
+    @Override
     public YangToJavaNamingConflictUtil getConflictResolveConfig() {
         return conflictResolveConfig;
     }
@@ -80,6 +81,7 @@
      *
      * @param conflictResolveConfig java naming conflict resolve configurations
      */
+    @Override
     public void setConflictResolveConfig(YangToJavaNamingConflictUtil conflictResolveConfig) {
         this.conflictResolveConfig = conflictResolveConfig;
     }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
index fec436c..5c84ddc 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaOutput.java
@@ -26,7 +26,7 @@
 import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
 
 import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
-import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfNode;
+import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.generateCodeOfAugmentableNode;
 
 /**
  * Represents output information extended to support java code generation.
@@ -46,6 +46,8 @@
      */
     private TempJavaCodeFragmentFiles tempFileHandle;
 
+    private boolean codeGenFlag;
+
     /**
      * Creates an instance of java output.
      */
@@ -108,7 +110,7 @@
     @Override
     public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
         try {
-            generateCodeOfNode(this, yangPlugin);
+            generateCodeOfAugmentableNode(this, yangPlugin);
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code entry for output node " + this.getName());
@@ -124,10 +126,30 @@
     @Override
     public void generateCodeExit() throws TranslatorException {
         try {
-            getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            if (isCodeGenFlag()) {
+                getTempJavaCodeFragmentFiles().generateJavaFile(GENERATE_INTERFACE_WITH_BUILDER, this);
+            }
         } catch (IOException e) {
             throw new TranslatorException(
                     "Failed to prepare generate code exit for output node " + this.getName());
         }
     }
+
+    /**
+     * Returns code generator flag.
+     *
+     * @return code generator flag
+     */
+    public boolean isCodeGenFlag() {
+        return codeGenFlag;
+    }
+
+    /**
+     * Sets code generator flag.
+     *
+     * @param codeGenFlag code generator flag
+     */
+    public void setCodeGenFlag(boolean codeGenFlag) {
+        this.codeGenFlag = codeGenFlag;
+    }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
index e721fa7..78c4f64 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaRpc.java
@@ -17,26 +17,36 @@
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
 import java.io.IOException;
+import java.util.List;
 
 import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
 import org.onosproject.yangutils.datamodel.YangInput;
+import org.onosproject.yangutils.datamodel.YangLeaf;
+import org.onosproject.yangutils.datamodel.YangLeafList;
+import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangOutput;
 import org.onosproject.yangutils.datamodel.YangRpc;
+import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
 import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
 import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
-import org.onosproject.yangutils.translator.tojava.JavaImportData;
 import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
 import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
 import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
 
+import static org.onosproject.yangutils.datamodel.YangNodeType.LIST_NODE;
 import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
 import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
+import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.resolveGroupingsQuailifiedInfo;
+import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaDataType;
+import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaImportClass;
+import static org.onosproject.yangutils.translator.tojava.utils.AttributesJavaDataType.getJavaImportPackage;
+import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getParentNodeInGenCode;
 import static org.onosproject.yangutils.translator.tojava.utils.YangJavaModelUtils.updatePackageInfo;
@@ -58,6 +68,11 @@
      */
     private TempJavaCodeFragmentFiles tempJavaCodeFragmentFiles;
 
+    private boolean isInputLeafHolder;
+    private boolean isOutputLeafHolder;
+    private boolean isInputSingleChildHolder;
+    private boolean isOutputSingleChildHolder;
+
     /**
      * Creates an instance of YANG java rpc.
      */
@@ -67,123 +82,6 @@
     }
 
     /**
-     * Prepares the information for java code generation corresponding to YANG
-     * RPC info.
-     *
-     * @param yangPlugin YANG plugin config
-     * @throws TranslatorException translator operations fails
-     */
-    @Override
-    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
-
-        if (!(this instanceof JavaCodeGeneratorInfo)) {
-            // TODO:throw exception
-        }
-
-        // Add package information for rpc and create corresponding folder.
-        try {
-            updatePackageInfo(this, yangPlugin);
-        } catch (IOException e) {
-            throw new TranslatorException("Failed to prepare generate code entry for RPC node " + this.getName());
-        }
-    }
-
-    /**
-     * Creates a java file using the YANG RPC info.
-     *
-     * @throws TranslatorException translator operations fails
-     */
-    @Override
-    public void generateCodeExit() throws TranslatorException {
-        // Get the parent module/sub-module.
-        YangNode parent = getParentNodeInGenCode(this);
-
-        // Parent should be holder of rpc or notification.
-        if (!(parent instanceof RpcNotificationContainer)) {
-            throw new TranslatorException("parent node of rpc can only be module or sub-module");
-        }
-
-        /*
-         * Create attribute info for input and output of rpc and add it to the
-         * parent import list.
-         */
-
-        JavaAttributeInfo javaAttributeInfoOfInput = null;
-        JavaAttributeInfo javaAttributeInfoOfOutput = null;
-
-        // Get the child input and output node and obtain create java attribute
-        // info.
-        YangNode yangNode = this.getChild();
-        while (yangNode != null) {
-            if (yangNode instanceof YangInput) {
-                javaAttributeInfoOfInput = getChildNodeAsAttributeInParentService(yangNode, this);
-            } else if (yangNode instanceof YangOutput) {
-                javaAttributeInfoOfOutput = getChildNodeAsAttributeInParentService(yangNode, this);
-            } else {
-                // TODO throw exception
-            }
-            yangNode = yangNode.getNextSibling();
-        }
-
-        if (!(parent instanceof TempJavaCodeFragmentFilesContainer)) {
-            throw new TranslatorException("missing parent temp file handle");
-        }
-
-        /*
-         * Add the rpc information to the parent's service temp file.
-         */
-        try {
-            ((TempJavaCodeFragmentFilesContainer) parent).getTempJavaCodeFragmentFiles().getServiceTempFiles()
-                    .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfoOfInput, javaAttributeInfoOfOutput,
-                            ((JavaFileInfoContainer) parent).getJavaFileInfo().getPluginConfig(),
-                            ((YangNode) this).getName());
-        } catch (IOException e) {
-            throw new TranslatorException("Failed to generate code for RPC node " + this.getName());
-        }
-        // No file will be generated during RPC exit.
-    }
-
-    /**
-     * Creates an attribute info object corresponding to a data model node and
-     * return it.
-     *
-     * @param childNode child data model node(input / output) for which the java code generation
-     * is being handled
-     * @param currentNode parent node (module / sub-module) in which the child node is an attribute
-     * @return AttributeInfo attribute details required to add in temporary
-     * files
-     */
-    public static JavaAttributeInfo getChildNodeAsAttributeInParentService(
-            YangNode childNode, YangNode currentNode) {
-
-        YangNode parentNode = getParentNodeInGenCode(currentNode);
-
-        String childNodeName = ((JavaFileInfoContainer) childNode).getJavaFileInfo().getJavaName();
-        /*
-         * Get the import info corresponding to the attribute for import in
-         * generated java files or qualified access
-         */
-        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(currentNode,
-                getCapitalCase(childNodeName));
-        if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) {
-            throw new TranslatorException("Parent node does not have file info");
-        }
-
-        TempJavaFragmentFiles tempJavaFragmentFiles;
-        tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) parentNode)
-                .getTempJavaCodeFragmentFiles()
-                .getServiceTempFiles();
-
-        if (tempJavaFragmentFiles == null) {
-            throw new TranslatorException("Parent node does not have service file info");
-        }
-
-        JavaImportData parentImportData = tempJavaFragmentFiles.getJavaImportData();
-        boolean isQualified = parentImportData.addImportInfo(qualifiedTypeInfo);
-        return getAttributeInfoForTheData(qualifiedTypeInfo, childNodeName, null, isQualified, false);
-    }
-
-    /**
      * Returns the generated java file information.
      *
      * @return generated java file information
@@ -217,4 +115,487 @@
         tempJavaCodeFragmentFiles = fileHandle;
     }
 
+    /**
+     * Prepares the information for java code generation corresponding to YANG
+     * RPC info.
+     *
+     * @param yangPlugin YANG plugin config
+     * @throws TranslatorException translator operations fails
+     */
+    @Override
+    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+
+        if (!(this instanceof JavaCodeGeneratorInfo)) {
+            // TODO:throw exception
+        }
+
+        // Add package information for rpc and create corresponding folder.
+        try {
+            updatePackageInfo(this, yangPlugin);
+            if (this.getChild() != null) {
+                processNodeEntry(this.getChild(), yangPlugin);
+                if (this.getChild().getNextSibling() != null) {
+                    processNodeEntry(this.getChild().getNextSibling(), yangPlugin);
+                }
+            }
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to prepare generate code entry for RPC node " + this.getName());
+        }
+    }
+
+    /**
+     * Creates a java file using the YANG RPC info.
+     *
+     * @throws TranslatorException translator operations fails
+     */
+    @Override
+    public void generateCodeExit() throws TranslatorException {
+        // Get the parent module/sub-module.
+        YangNode parent = getParentNodeInGenCode(this);
+
+        // Parent should be holder of rpc or notification.
+        if (!(parent instanceof RpcNotificationContainer)) {
+            throw new TranslatorException("parent node of rpc can only be module or sub-module");
+        }
+
+        /*
+         * Create attribute info for input and output of rpc and add it to the
+         * parent import list.
+         */
+
+        JavaAttributeInfo javaAttributeInfoOfInput = null;
+        JavaAttributeInfo javaAttributeInfoOfOutput = null;
+
+        // Get the child input and output node and obtain create java attribute
+        // info.
+        YangNode yangNode = this.getChild();
+        while (yangNode != null) {
+            if (yangNode instanceof YangInput) {
+                javaAttributeInfoOfInput = processNodeExit(yangNode, getJavaFileInfo().getPluginConfig());
+
+            } else if (yangNode instanceof YangOutput) {
+                javaAttributeInfoOfOutput = processNodeExit(yangNode, getJavaFileInfo().getPluginConfig());
+            } else {
+                // TODO throw exception
+            }
+            yangNode = yangNode.getNextSibling();
+        }
+
+        if (!(parent instanceof TempJavaCodeFragmentFilesContainer)) {
+            throw new TranslatorException("missing parent temp file handle");
+        }
+
+        /*
+         * Add the rpc information to the parent's service temp file.
+         */
+        try {
+            ((TempJavaCodeFragmentFilesContainer) parent).getTempJavaCodeFragmentFiles().getServiceTempFiles()
+                    .addJavaSnippetInfoToApplicableTempFiles(javaAttributeInfoOfInput, javaAttributeInfoOfOutput,
+                            ((JavaFileInfoContainer) parent).getJavaFileInfo().getPluginConfig(),
+                            ((YangNode) this).getName(), isInputLeafHolder(), isOutputLeafHolder(),
+                            isInputSingleChildHolder(), isOutputSingleChildHolder());
+        } catch (IOException e) {
+            throw new TranslatorException("Failed to generate code for RPC node " + this.getName());
+        }
+        // No file will be generated during RPC exit.
+    }
+
+    /**
+     * Creates an attribute info object corresponding to a data model node and
+     * return it.
+     *
+     * @param childNode child data model node(input / output) for which the java code generation
+     * is being handled
+     * @param currentNode parent node (module / sub-module) in which the child node is an attribute
+     * @return AttributeInfo attribute details required to add in temporary
+     * files
+     */
+    public JavaAttributeInfo getChildNodeAsAttributeInParentService(
+            YangNode childNode, YangNode currentNode) {
+
+        YangNode parentNode = getParentNodeInGenCode(currentNode);
+
+        String childNodeName = ((JavaFileInfoContainer) childNode).getJavaFileInfo().getJavaName();
+        /*
+         * Get the import info corresponding to the attribute for import in
+         * generated java files or qualified access
+         */
+        JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(currentNode,
+                getCapitalCase(childNodeName));
+        if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) {
+            throw new TranslatorException("Parent node does not have file info");
+        }
+
+        TempJavaFragmentFiles tempJavaFragmentFiles;
+        tempJavaFragmentFiles = ((TempJavaCodeFragmentFilesContainer) parentNode)
+                .getTempJavaCodeFragmentFiles()
+                .getServiceTempFiles();
+
+        if (tempJavaFragmentFiles == null) {
+            throw new TranslatorException("Parent node does not have service file info");
+        }
+        boolean isQualified = addImportToService(qualifiedTypeInfo);
+        return getAttributeInfoForTheData(qualifiedTypeInfo, childNodeName, null, isQualified, false);
+    }
+
+    /**
+     * Process input/output nodes.
+     *
+     * @param node YANG node
+     * @param yangPluginConfig plugin configurations
+     */
+    private void processNodeEntry(YangNode node, YangPluginConfig yangPluginConfig) {
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        if (node.getChild() == null) {
+            if (holder.getListOfLeaf() != null && holder.getListOfLeafList().isEmpty()
+                    && holder.getListOfLeaf().size() == 1) {
+                setCodeGenFlagForNode(node, false);
+            } else if (holder.getListOfLeaf().isEmpty() && holder.getListOfLeafList() != null
+                    && holder.getListOfLeafList().size() == 1) {
+                setCodeGenFlagForNode(node, false);
+            } else {
+                setCodeGenFlagForNode(node, true);
+            }
+        } else if (node.getChild() != null && holder.getListOfLeaf().isEmpty()
+                && holder.getListOfLeafList().isEmpty()) {
+            if (getNumberOfChildNodes(node) == 1) {
+                setCodeGenFlagForNode(node, false);
+            } else {
+                setCodeGenFlagForNode(node, true);
+            }
+        } else {
+            setCodeGenFlagForNode(node, true);
+        }
+    }
+
+    /**
+     * Process input/output nodes.
+     *
+     * @param node YANG node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute info
+     */
+    private JavaAttributeInfo processNodeExit(YangNode node, YangPluginConfig yangPluginConfig) {
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        if (node.getChild() == null) {
+            if (holder.getListOfLeaf() != null && holder.getListOfLeafList().isEmpty()
+                    && holder.getListOfLeaf().size() == 1) {
+                return processNodeWhenOnlyOneLeafIsPresent(node, yangPluginConfig);
+
+            } else if (holder.getListOfLeaf().isEmpty() && holder.getListOfLeafList() != null
+                    && holder.getListOfLeafList().size() == 1) {
+                return processNodeWhenOnlyOneLeafListIsPresent(node, yangPluginConfig);
+            } else {
+                return processNodeWhenMultipleContaintsArePresent(node);
+            }
+        } else if (node.getChild() != null && holder.getListOfLeaf().isEmpty()
+                && holder.getListOfLeafList().isEmpty()) {
+            if (getNumberOfChildNodes(node) == 1) {
+                return processNodeWhenOnlyOneChildNodeIsPresent(node, yangPluginConfig);
+            } else {
+                return processNodeWhenMultipleContaintsArePresent(node);
+            }
+        } else {
+            return processNodeWhenMultipleContaintsArePresent(node);
+        }
+    }
+
+    /**
+     * Process input/output node when one leaf is present.
+     *
+     * @param node input/output node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenOnlyOneLeafIsPresent(YangNode node,
+            YangPluginConfig yangPluginConfig) {
+
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        List<YangLeaf> listOfLeaves = holder.getListOfLeaf();
+
+        for (YangLeaf leaf : listOfLeaves) {
+            if (!(leaf instanceof JavaLeafInfoContainer)) {
+                throw new TranslatorException("Leaf does not have java information");
+            }
+            JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leaf;
+            javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver());
+            javaLeaf.updateJavaQualifiedInfo();
+            JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData(
+                    javaLeaf.getJavaQualifiedInfo(),
+                    javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()),
+                    javaLeaf.getDataType(),
+                    addTypeImport(javaLeaf.getDataType(), false, yangPluginConfig), false);
+            setLeafHolderFlag(node, true);
+            return javaAttributeInfo;
+        }
+        return null;
+    }
+
+    /**
+     * Process input/output node when one leaf list is present.
+     *
+     * @param node input/output node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenOnlyOneLeafListIsPresent(YangNode node,
+            YangPluginConfig yangPluginConfig) {
+
+        YangLeavesHolder holder = (YangLeavesHolder) node;
+        List<YangLeafList> listOfLeafList = holder.getListOfLeafList();
+
+        for (YangLeafList leafList : listOfLeafList) {
+            if (!(leafList instanceof JavaLeafInfoContainer)) {
+                throw new TranslatorException("Leaf-list does not have java information");
+            }
+            JavaLeafInfoContainer javaLeaf = (JavaLeafInfoContainer) leafList;
+            javaLeaf.setConflictResolveConfig(yangPluginConfig.getConflictResolver());
+            javaLeaf.updateJavaQualifiedInfo();
+            ((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles()
+                    .getServiceTempFiles().getJavaImportData().setIfListImported(true);
+            JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData(
+                    javaLeaf.getJavaQualifiedInfo(),
+                    javaLeaf.getJavaName(yangPluginConfig.getConflictResolver()),
+                    javaLeaf.getDataType(),
+                    addTypeImport(javaLeaf.getDataType(), true, yangPluginConfig),
+                    true);
+            setLeafHolderFlag(node, true);
+            return javaAttributeInfo;
+        }
+        return null;
+    }
+
+    /**
+     * Process input/output node when one child node is present.
+     *
+     * @param node input/output node
+     * @param yangPluginConfig plugin configurations
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenOnlyOneChildNodeIsPresent(YangNode node,
+            YangPluginConfig yangPluginConfig) {
+        JavaFileInfo rpcInfo = getJavaFileInfo();
+        String clsInfo = "";
+        JavaQualifiedTypeInfo childInfo = new JavaQualifiedTypeInfo();
+        if (node.getChild() instanceof YangJavaUses) {
+            childInfo = resolveGroupingsQuailifiedInfo(((YangJavaUses) node.getChild()).getRefGroup(),
+                    yangPluginConfig);
+            clsInfo = getCapitalCase(getCamelCase(((YangJavaUses) node.getChild()).getRefGroup().getName(),
+                    yangPluginConfig.getConflictResolver()));
+        } else {
+            String pkg = (rpcInfo.getPackage() + "." + rpcInfo.getJavaName() + "."
+                    + getCamelCase(node.getName(), yangPluginConfig.getConflictResolver())).toLowerCase();
+            clsInfo = getCapitalCase(
+                    getCamelCase(node.getChild().getName(), yangPluginConfig.getConflictResolver()));
+            childInfo.setPkgInfo(pkg);
+            childInfo.setClassInfo(clsInfo);
+        }
+        boolean isList = false;
+        if (node.getChild().getNodeType().equals(LIST_NODE)) {
+            isList = true;
+        }
+        boolean isQualified = addImportToService(childInfo);
+
+        JavaAttributeInfo javaAttributeInfo =
+                getAttributeInfoForTheData(childInfo, clsInfo, null, isQualified, isList);
+
+        setLeafHolderFlag(node, false);
+        setSingleChildHolderFlag(node, true);
+        return javaAttributeInfo;
+    }
+
+    /**
+     * Process input/output node when multiple leaf and child nodes are present.
+     *
+     * @param node input/output node
+     * @return java attribute for node
+     */
+    private JavaAttributeInfo processNodeWhenMultipleContaintsArePresent(YangNode node) {
+
+        setLeafHolderFlag(node, false);
+        setSingleChildHolderFlag(node, false);
+        return getChildNodeAsAttributeInParentService(node, this);
+    }
+
+    /**
+     * Adds type import to the RPC import list.
+     *
+     * @param type YANG type
+     * @param isList is list attribute
+     * @param pluginConfig plugin configurations
+     * @return type import to the RPC import list
+     */
+    private boolean addTypeImport(YangType<?> type, boolean isList, YangPluginConfig pluginConfig) {
+
+        String classInfo = getJavaImportClass(type, isList, pluginConfig.getConflictResolver());
+        if (classInfo == null) {
+            classInfo = getJavaDataType(type);
+            return false;
+        } else {
+            classInfo = getJavaImportClass(type, isList, pluginConfig.getConflictResolver());
+            String pkgInfo = getJavaImportPackage(type, isList, pluginConfig.getConflictResolver());
+            JavaQualifiedTypeInfo importInfo = new JavaQualifiedTypeInfo();
+            importInfo.setPkgInfo(pkgInfo);
+            importInfo.setClassInfo(classInfo);
+            if (!((JavaFileInfoContainer) this.getParent()).getJavaFileInfo().getJavaName().equals(classInfo)) {
+                return addImportToService(importInfo);
+            } else {
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Adds to service class import list.
+     *
+     * @param importInfo import info
+     * @return true or false
+     */
+    private boolean addImportToService(JavaQualifiedTypeInfo importInfo) {
+        if (((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles()
+                .getServiceTempFiles().getJavaImportData().addImportInfo(importInfo)) {
+            return !((TempJavaCodeFragmentFilesContainer) this.getParent()).getTempJavaCodeFragmentFiles()
+                    .getServiceTempFiles().getJavaImportData().getImportSet().contains(importInfo);
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * Sets leaf holder flag for input/output.
+     *
+     * @param node input/output node
+     * @param flag true or false
+     */
+    private void setLeafHolderFlag(YangNode node, boolean flag) {
+        if (node instanceof YangJavaInput) {
+            setInputLeafHolder(flag);
+        } else {
+            setOutputLeafHolder(flag);
+        }
+    }
+
+    /**
+     * Sets sing child holder flag for input/output.
+     *
+     * @param node input/output node
+     * @param flag true or false
+     */
+    private void setSingleChildHolderFlag(YangNode node, boolean flag) {
+        if (node instanceof YangJavaInput) {
+            setInputSingleChildHolder(flag);
+        } else {
+            setOutputSingleChildHolder(flag);
+        }
+    }
+
+    /**
+     * Sets code generator flag for input and output.
+     *
+     * @param node YANG node
+     * @param flag cod generator flag
+     */
+    private void setCodeGenFlagForNode(YangNode node, boolean flag) {
+        if (node instanceof YangJavaInput) {
+            ((YangJavaInput) node).setCodeGenFlag(flag);
+        } else {
+            ((YangJavaOutput) node).setCodeGenFlag(flag);
+        }
+
+    }
+
+    /**
+     * Counts the number of child nodes of a YANG node.
+     *
+     * @param node YANG node
+     * @return count of children
+     */
+    private int getNumberOfChildNodes(YangNode node) {
+        YangNode tempNode = node.getChild();
+        int count = 0;
+        if (tempNode != null) {
+            count = 1;
+        }
+        while (tempNode != null) {
+
+            tempNode = tempNode.getNextSibling();
+            if (tempNode != null) {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    /**
+     * Returns true if input is a leaf holder.
+     *
+     * @return true if input is a leaf holder
+     */
+    public boolean isInputLeafHolder() {
+        return isInputLeafHolder;
+    }
+
+    /**
+     * Sets true if input is a leaf holder.
+     *
+     * @param isInputLeafHolder true if input is a leaf holder
+     */
+    public void setInputLeafHolder(boolean isInputLeafHolder) {
+        this.isInputLeafHolder = isInputLeafHolder;
+    }
+
+    /**
+     * Returns true if output is a leaf holder.
+     *
+     * @return true if output is a leaf holder
+     */
+    public boolean isOutputLeafHolder() {
+        return isOutputLeafHolder;
+    }
+
+    /**
+     * Sets true if output is a leaf holder.
+     *
+     * @param isOutputLeafHolder true if output is a leaf holder
+     */
+    public void setOutputLeafHolder(boolean isOutputLeafHolder) {
+        this.isOutputLeafHolder = isOutputLeafHolder;
+    }
+
+    /**
+     * Returns true if input is single child holder.
+     *
+     * @return true if input is single child holder
+     */
+    public boolean isInputSingleChildHolder() {
+        return isInputSingleChildHolder;
+    }
+
+    /**
+     * Sets true if input is single child holder.
+     *
+     * @param isInputSingleChildHolder true if input is single child holder
+     */
+    public void setInputSingleChildHolder(boolean isInputSingleChildHolder) {
+        this.isInputSingleChildHolder = isInputSingleChildHolder;
+    }
+
+    /**
+     * Returns true if output is single child holder.
+     *
+     * @return true if output is single child holder
+     */
+    public boolean isOutputSingleChildHolder() {
+        return isOutputSingleChildHolder;
+    }
+
+    /**
+     * Sets true if output is single child holder.
+     *
+     * @param isOutputSingleChildHolder true if output is single child holder
+     */
+    public void setOutputSingleChildHolder(boolean isOutputSingleChildHolder) {
+        this.isOutputSingleChildHolder = isOutputSingleChildHolder;
+    }
+
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
index 660940f..e537743 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaType.java
@@ -55,7 +55,7 @@
              */
             importInfo.setClassInfo(className);
             String classPkg = AttributesJavaDataType.getJavaImportPackage(this,
-                    false, className, conflictResolver);
+                    false,  conflictResolver);
             if (classPkg == null) {
                 throw new TranslatorException("import package cannot be null when the class is used");
             }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
index a498893..f2d2ada 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/YangJavaUses.java
@@ -15,18 +15,113 @@
  */
 package org.onosproject.yangutils.translator.tojava.javamodel;
 
+import java.io.IOException;
+
 import org.onosproject.yangutils.datamodel.YangUses;
+import org.onosproject.yangutils.translator.exception.TranslatorException;
+import org.onosproject.yangutils.translator.tojava.JavaCodeGenerator;
+import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
+import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
+import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
+
+import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
+import static org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles.addCurNodeInfoInParentTempFile;
 
 /**
  * Represents uses information extended to support java code generation.
  */
 public class YangJavaUses
-        extends YangUses {
+        extends YangUses implements JavaCodeGeneratorInfo, JavaCodeGenerator {
+
+
+    /**
+     * Contains the information of the java file being generated.
+     */
+    private JavaFileInfo javaFileInfo;
+
+    /**
+     * File handle to maintain temporary java code fragments as per the code
+     * snippet types.
+     */
+    private TempJavaCodeFragmentFiles tempFileHandle;
 
     /**
      * Creates YANG java uses object.
      */
     public YangJavaUses() {
         super();
+        setJavaFileInfo(new JavaFileInfo());
+        getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
     }
+
+    /**
+     * Returns the generated java file information.
+     *
+     * @return generated java file information
+     */
+    @Override
+    public JavaFileInfo getJavaFileInfo() {
+        if (javaFileInfo == null) {
+            throw new TranslatorException("Missing java info in java datamodel node");
+        }
+        return javaFileInfo;
+    }
+
+    /**
+     * Sets the java file info object.
+     *
+     * @param javaInfo java file info object
+     */
+    @Override
+    public void setJavaFileInfo(JavaFileInfo javaInfo) {
+        javaFileInfo = javaInfo;
+    }
+
+    /**
+     * Returns the temporary file handle.
+     *
+     * @return temporary file handle
+     */
+    @Override
+    public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
+        return tempFileHandle;
+    }
+
+    /**
+     * Sets temporary file handle.
+     *
+     * @param fileHandle temporary file handle
+     */
+    @Override
+    public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
+        tempFileHandle = fileHandle;
+    }
+
+    /**
+     * Prepare the information for java code generation corresponding to YANG
+     * uses info.
+     *
+     * @param yangPlugin YANG plugin config
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+        try {
+            addCurNodeInfoInParentTempFile(this, false, yangPlugin);
+        } catch (IOException e) {
+            throw new TranslatorException(
+                    "Failed to prepare generate code entry for container node " + this.getName());
+        }
+    }
+
+    /**
+     * Create a java file using the YANG uses info.
+     *
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeExit() throws TranslatorException {
+        // no code generation will be done for uses.
+    }
+
 }
