diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/ych/defaultcodecs/xml/XmlCodecYdtListener.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/ych/defaultcodecs/xml/XmlCodecYdtListener.java
index 98a8ccb..61c2f00 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/ych/defaultcodecs/xml/XmlCodecYdtListener.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/ych/defaultcodecs/xml/XmlCodecYdtListener.java
@@ -50,6 +50,11 @@
     private YdtExtendedContext rootYdtNode;
 
     /**
+     * Module YDT node.
+     */
+    private YdtExtendedContext currentModule;
+
+    /**
      * Creates a new codec listener.
      *
      * @param format   protocol data format
@@ -59,6 +64,7 @@
                         YdtExtendedContext rootNode) {
         dataFormat = format;
         rootYdtNode = rootNode;
+        currentModule = ((YdtExtendedContext) rootNode.getFirstChild());
     }
 
     /**
@@ -70,10 +76,29 @@
         return elementStack;
     }
 
+    /**
+     * Returns true, if YDT node is module node; false otherwise.
+     *
+     * @param ydtContext YDT node
+     * @return true if YDT node is module; false otherwise
+     */
+    private boolean isModuleNode(YdtExtendedContext ydtContext,
+                                 boolean isExit) {
+        if (Objects.equals(currentModule, ydtContext)) {
+            if (isExit) {
+                currentModule = (YdtExtendedContext) currentModule
+                        .getNextSibling();
+            }
+            return true;
+        }
+        return false;
+    }
+
     @Override
     public void enterYdtNode(YdtExtendedContext ydtContext) {
 
-        if (!Objects.equals(rootYdtNode, ydtContext)) {
+        if (!Objects.equals(rootYdtNode, ydtContext) &&
+                !isModuleNode(ydtContext, false)) {
 
             CodecHandlerFactory factory = CodecHandlerFactory.instance();
             XmlCodecHandler handler =
@@ -94,7 +119,8 @@
 
     @Override
     public void exitYdtNode(YdtExtendedContext ydtExtendedContext) {
-        if (!Objects.equals(rootYdtNode, ydtExtendedContext)) {
+        if (!Objects.equals(rootYdtNode, ydtExtendedContext) &&
+                !isModuleNode(ydtExtendedContext, true)) {
             elementStack.pop();
         }
     }
diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/ytb/YdtBuilderFromYo.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/ytb/YdtBuilderFromYo.java
index 10874f0..4faa58b 100644
--- a/apps/yms/app/src/main/java/org/onosproject/yms/app/ytb/YdtBuilderFromYo.java
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/ytb/YdtBuilderFromYo.java
@@ -345,12 +345,30 @@
                 }
                 curTraversal = PARENT;
                 traverseToParent(curNode);
-                curNode = curNode.getParent();
+                curNode = getParentSchemaNode(curNode);
             }
         }
     }
 
     /**
+     * Returns parent schema node of current node.
+     *
+     * @param curNode current schema node
+     * @return parent schema node
+     */
+    private YangNode getParentSchemaNode(YangNode curNode) {
+        if (curNode instanceof YangAugment) {
+            /*
+             * If curNode is augment, either next augment or augmented node
+             * has to be processed. So traversal type is changed to parent,
+             * but node is not changed.
+             */
+            return curNode;
+        }
+        return curNode.getParent();
+    }
+
+    /**
      * Processes root YANG node and adds it as a child to the YDT
      * extended builder which is created earlier.
      */
@@ -372,7 +390,8 @@
      * @param curNode current YANG node
      */
     private void traverseToParent(YangNode curNode) {
-        if (curNode instanceof YangCase || curNode instanceof YangChoice) {
+        if (curNode instanceof YangCase || curNode instanceof YangChoice
+                || curNode instanceof YangAugment) {
             return;
         }
         extBuilder.traverseToParentWithoutValidation();
diff --git a/apps/yms/ut/src/test/java/org/onosproject/yms/app/ych/DefaultYangCodecHandlerTest.java b/apps/yms/ut/src/test/java/org/onosproject/yms/app/ych/DefaultYangCodecHandlerTest.java
index 7a1c8ea..dea5877 100644
--- a/apps/yms/ut/src/test/java/org/onosproject/yms/app/ych/DefaultYangCodecHandlerTest.java
+++ b/apps/yms/ut/src/test/java/org/onosproject/yms/app/ych/DefaultYangCodecHandlerTest.java
@@ -91,9 +91,8 @@
      */
     private static String customsXml() {
         return "<filter xmlns=\"ydt.filter-type\" type=\"subtree\">" +
-                "<customssupervisor xmlns=\"ydt.customs-supervisor\">" +
-                "<supervisor>Customssupervisor</supervisor>" +
-                "</customssupervisor>" +
+                "<supervisor xmlns=\"ydt.customs-supervisor\">" +
+                "Customssupervisor</supervisor>" +
                 "</filter>";
     }
 
@@ -104,10 +103,8 @@
      */
     private static String merchandXml() {
         return "<config xmlns=\"ydt.root\">" +
-                "<merchandisersupervisor xmlns=\"ydt.Merchandiser-" +
-                "supervisor\">" +
-                "<supervisor>Merchandisersupervisor</supervisor>" +
-                "</merchandisersupervisor>" +
+                "<supervisor xmlns=\"ydt.Merchandiser-supervisor\">" +
+                "Merchandisersupervisor</supervisor>" +
                 "</config>";
     }
 
@@ -118,9 +115,8 @@
      */
     private static String tradingXml() {
         return "<config xmlns=\"ydt.root\">" +
-                "<tradingsupervisor xmlns=\"ydt.trading-supervisor\">" +
-                "<supervisor>Tradingsupervisor</supervisor>" +
-                "</tradingsupervisor>" +
+                "<supervisor xmlns=\"ydt.trading-supervisor\">" +
+                "Tradingsupervisor</supervisor>" +
                 "</config>";
     }
 
@@ -130,10 +126,9 @@
      * @return the xml string for customssupervisor module
      */
     private static String customsCompositeXml() {
-        return "<filter xmlns=\"ydt.filter-type\"><customssupervisor " +
-                "xmlns=\"ydt.customs-supervisor\">" +
-                "<supervisor>Customssupervisor</supervisor>" +
-                "</customssupervisor></filter>";
+        return "<filter xmlns=\"ydt.filter-type\">" +
+                "<supervisor xmlns=\"ydt.customs-supervisor\">" +
+                "Customssupervisor</supervisor></filter>";
     }
 
     /**
@@ -143,7 +138,6 @@
      */
     private static String customsEmptyXml() {
         return "<filter xmlns=\"ydt.filter-type\" type=\"subtree\">" +
-                "<customssupervisor xmlns=\"ydt.customs-supervisor\"/>" +
                 "</filter>";
     }
 
@@ -154,19 +148,21 @@
      */
     private static String materialXml() {
         return "<filter xmlns=\"ydt.filter-type\" type=\"subtree\">" +
-                "<materialsupervisor xmlns=\"ydt.material-supervisor\">" +
-                "<supervisor>" +
+                "<supervisor xmlns=\"ydt.material-supervisor\">" +
                 "<name>abc1</name><departmentId>xyz1</departmentId>" +
                 "</supervisor>" +
-                "<supervisor><name>abc2</name><departmentId>xyz2</departmentId>" +
+                "<supervisor xmlns=\"ydt.material-supervisor\"" +
+                "><name>abc2</name><departmentId>xyz2</departmentId>" +
                 "</supervisor>" +
-                "<supervisor><name>abc3</name><departmentId>xyz3</departmentId>" +
+                "<supervisor xmlns=\"ydt.material-supervisor\"" +
+                "><name>abc3</name><departmentId>xyz3</departmentId>" +
                 "</supervisor>" +
-                "<supervisor><name>abc4</name><departmentId>xyz4</departmentId>" +
+                "<supervisor xmlns=\"ydt.material-supervisor\"" +
+                "><name>abc4</name><departmentId>xyz4</departmentId>" +
                 "</supervisor>" +
-                "<supervisor><name>abc5</name><departmentId>xyz5</departmentId>" +
+                "<supervisor xmlns=\"ydt.material-supervisor\"" +
+                "><name>abc5</name><departmentId>xyz5</departmentId>" +
                 "</supervisor>" +
-                "</materialsupervisor>" +
                 "</filter>";
     }
 
@@ -177,7 +173,6 @@
      */
     private static String containerEmptyXml() {
         return "<filter xmlns=\"ydt.filter-type\" type=\"subtree\">" +
-                "<EmptyContainer xmlns=\"ych.Empty.Container\"/>" +
                 "</filter>";
     }
 
@@ -188,7 +183,7 @@
      */
     private static String listTestXml() {
         return "<filter xmlns=\"ydt.filter-type\" type=\"subtree\">" +
-                "<Combined xmlns=\"ych:combined\"><attributes>" +
+                "<attributes xmlns=\"ych:combined\">" +
                 "<origin><value>123</value></origin>" +
                 "<multi-exit-disc><med>456</med></multi-exit-disc>" +
                 "<local-pref><pref>23</pref></local-pref>" +
@@ -225,7 +220,7 @@
                 "<optional-capabilities><c-parameters><as4-bytes-capability>" +
                 "<as-number>33</as-number></as4-bytes-capability>" +
                 "</c-parameters></optional-capabilities>" +
-                "</bgp-parameters></attributes></Combined></filter>";
+                "</bgp-parameters></attributes></filter>";
     }
 
     /**
@@ -342,6 +337,27 @@
     }
 
     /**
+     * Returns the xml string for more than one module.
+     *
+     * @return the xml string for more than one module
+     */
+    private String multipleAppxml() {
+        return "<filter xmlns=\"ydt.filter-type\" type=\"subtree\"><supervisor" +
+                " xmlns=\"ydt.customs-supervisor\">Customssupervisor" +
+                "</supervisor><supervisor xmlns=\"ydt.material-supervisor\"" +
+                "><name>abc1</name><departmentId>xyz1</departmentId" +
+                "></supervisor><supervisor xmlns=\"ydt.material-supervisor\">" +
+                "<name>abc2</name><departmentId>xyz2</departmentId>" +
+                "</supervisor><supervisor xmlns=\"ydt" +
+                ".material-supervisor\"><name>abc3</name><departmentId>xyz3" +
+                "</departmentId></supervisor><supervisor xmlns=\"ydt" +
+                ".material-supervisor\"><name>abc4</name><departmentId>xyz4" +
+                "</departmentId></supervisor><supervisor xmlns=\"ydt" +
+                ".material-supervisor\"><name>abc5</name><departmentId>xyz5" +
+                "</departmentId></supervisor></filter>";
+    }
+
+    /**
      * Unit test case in which verifying xml string for module object with leaf
      * for composite encode.
      */
@@ -487,6 +503,57 @@
     }
 
     /**
+     * Unit test case in which verifying xml string for more than one module
+     * object.
+     */
+    @Test
+    public void proceessCodecHandlerForMultipleApp() {
+        testYangSchemaNodeProvider.processSchemaRegistry(null);
+        DefaultYangSchemaRegistry schemaRegistry = testYangSchemaNodeProvider
+                .getDefaultYangSchemaRegistry();
+        List<Object> yangModuleList = new ArrayList<>();
+
+        // Creating the object
+        Object object = CustomssupervisorOpParam.builder()
+                .supervisor("Customssupervisor").build();
+        yangModuleList.add(object);
+
+        // Creating the object
+        Supervisor supervisor1 = new DefaultSupervisor.SupervisorBuilder()
+                .name("abc1").departmentId("xyz1").build();
+        Supervisor supervisor2 = new DefaultSupervisor.SupervisorBuilder()
+                .name("abc2").departmentId("xyz2").build();
+        Supervisor supervisor3 = new DefaultSupervisor.SupervisorBuilder()
+                .name("abc3").departmentId("xyz3").build();
+        Supervisor supervisor4 = new DefaultSupervisor.SupervisorBuilder()
+                .name("abc4").departmentId("xyz4").build();
+        Supervisor supervisor5 = new DefaultSupervisor.SupervisorBuilder()
+                .name("abc5").departmentId("xyz5").build();
+
+        Object object1 = MaterialsupervisorOpParam.builder()
+                .addToSupervisor(supervisor1)
+                .addToSupervisor(supervisor2)
+                .addToSupervisor(supervisor3)
+                .addToSupervisor(supervisor4)
+                .addToSupervisor(supervisor5).build();
+        yangModuleList.add(object1);
+
+        // Get the xml string and compare
+        Map<String, String> tagAttr = new HashMap<String, String>();
+        tagAttr.put("type", "subtree");
+
+        YangCodecRegistry.initializeDefaultCodec();
+        DefaultYangCodecHandler codecHandler =
+                new DefaultYangCodecHandler(schemaRegistry);
+        String xml = codecHandler.encodeOperation("filter", "ydt.filter-type",
+                                                  tagAttr, yangModuleList,
+                                                  XML, null);
+
+        assertEquals(AM_XML + "for multiple applications",
+                     multipleAppxml(), xml);
+    }
+
+    /**
      * Unit test case in which verifying xml string for module object with list.
      */
     @Test
