YANG construct collision detection framework added

Change-Id: I1458f9e3192641f3f90c444798c31a64536ffa5d
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BaseFileListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BaseFileListener.java
index 527ce08..99f6807 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BaseFileListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BaseFileListener.java
@@ -22,14 +22,15 @@
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.YANGBASE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.*;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CHILD;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.YANGBASE_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -55,8 +56,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (yangfile), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processYangFileEntry(TreeWalkListener listener, GeneratedYangParser.YangfileContext ctx) {
 
@@ -69,8 +70,8 @@
      * It is called when parser exits from grammar rule (yangfile), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processYangFileExit(TreeWalkListener listener, GeneratedYangParser.YangfileContext ctx) {
 
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BelongsToListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BelongsToListener.java
index fc9793f..c938190 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BelongsToListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BelongsToListener.java
@@ -22,13 +22,14 @@
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.BELONGS_TO_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.*;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.BELONGS_TO_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -70,8 +71,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (belongsto), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processBelongsToEntry(TreeWalkListener listener,
                                              GeneratedYangParser.BelongstoStatementContext ctx) {
@@ -91,8 +92,8 @@
      * It is called when parser exits from grammar rule (belongsto), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processBelongsToExit(TreeWalkListener listener,
                                             GeneratedYangParser.BelongstoStatementContext ctx) {
@@ -110,7 +111,7 @@
                                  ctx.IDENTIFIER().getText(), EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
             case SUB_MODULE_DATA: {
                 YangSubModule subModule = (YangSubModule) tmpNode;
                 subModule.setBelongsTo((YangBelongsTo) tmpBelongstoNode);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitListener.java
index a574091..b13b3b1 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitListener.java
@@ -65,7 +65,7 @@
 import org.onosproject.yangutils.datamodel.YangBits;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
-import static org.onosproject.yangutils.parser.ParsableDataType.BIT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.BIT_DATA;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
@@ -95,8 +95,8 @@
      * It is called when parser enters grammar rule (bit), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processBitEntry(TreeWalkListener listener,
                                         GeneratedYangParser.BitStatementContext ctx) {
@@ -113,8 +113,8 @@
      * It is called when parser exits from grammar rule (bit), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx      context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processBitExit(TreeWalkListener listener,
                                        GeneratedYangParser.BitStatementContext ctx) {
@@ -130,7 +130,7 @@
             checkStackIsNotEmpty(listener, MISSING_HOLDER, BIT_DATA, ctx.IDENTIFIER().getText(), EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
                 case BITS_DATA: {
                     YangBits yangBits = (YangBits) tmpNode;
                     if ((ctx.bitBodyStatement() == null) || (ctx.bitBodyStatement().positionStatement() == null)) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java
index d8f8467..c0c302f 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/BitsListener.java
@@ -46,8 +46,8 @@
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.parser.Parsable;
-import static org.onosproject.yangutils.parser.ParsableDataType.BITS_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.BITS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
@@ -75,8 +75,8 @@
      * It is called when parser enters grammar rule (bits), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processBitsEntry(TreeWalkListener listener,
                                                GeneratedYangParser.BitsSpecificationContext ctx) {
@@ -93,7 +93,7 @@
 
             Parsable tmpData = listener.getParsedDataStack().peek();
 
-            switch (tmpData.getParsableDataType()) {
+            switch (tmpData.getYangConstructType()) {
                 case LEAF_DATA:
                     bitsNode.setBitsName(((YangLeaf) tmpData).getLeafName());
                     break;
@@ -116,8 +116,8 @@
      * It is called when parser exits from grammar rule (bits), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx      context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processBitsExit(TreeWalkListener listener,
                                               GeneratedYangParser.BitsSpecificationContext ctx) {
@@ -133,7 +133,7 @@
             checkStackIsNotEmpty(listener, MISSING_HOLDER, BITS_DATA, "", EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
                 case TYPE_DATA: {
                     YangType typeNode = (YangType) tmpNode;
                     typeNode.setDataTypeExtendedInfo((YangBits) tmpBitsNode);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListener.java
index 49c0348..68d2b43 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ConfigListener.java
@@ -24,13 +24,12 @@
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.CONFIG_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.CONFIG_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -62,8 +61,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (config), performs validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processConfigEntry(TreeWalkListener listener,
             GeneratedYangParser.ConfigStatementContext ctx) {
@@ -77,7 +76,7 @@
         }
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getParsableDataType()) {
+        switch (tmpData.getYangConstructType()) {
             case LEAF_DATA:
                 YangLeaf leaf = (YangLeaf) tmpData;
                 leaf.setConfig(isConfig);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContactListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContactListener.java
index 53c86cb..f1d670a 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContactListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContactListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.CONTACT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.CONTACT_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -86,8 +86,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (contact), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processContactEntry(TreeWalkListener listener, GeneratedYangParser.ContactStatementContext ctx) {
 
@@ -96,7 +96,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
         case MODULE_DATA: {
             YangModule module = (YangModule) tmpNode;
             module.setContact(ctx.string().getText());
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListener.java
index 2325be3..1f23449 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ContainerListener.java
@@ -22,24 +22,27 @@
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
-import org.onosproject.yangutils.parser.ParsableDataType;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
-import org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.CONTAINER_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CARDINALITY;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinality;
+import static org.onosproject.yangutils.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.CONTAINER_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.PRESENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -76,8 +79,6 @@
  */
 public final class ContainerListener {
 
-    private static ParsableDataType yangConstruct;
-
     /**
      * Creates a new container listener.
      */
@@ -85,30 +86,34 @@
     }
 
     /**
-     * It is called when parser receives an input matching the grammar
-     * rule (container), performs validation and updates the data model
-     * tree.
+     * It is called when parser receives an input matching the grammar rule
+     * (container), performs validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processContainerEntry(TreeWalkListener listener,
-                                             GeneratedYangParser.ContainerStatementContext ctx) {
+            GeneratedYangParser.ContainerStatementContext ctx) {
 
-        YangNode parentNode;
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, CONTAINER_DATA, ctx.IDENTIFIER().getText(), ENTRY);
 
-        boolean result = validateSubStatementsCardinality(ctx);
-        if (!result) {
-            throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY));
-        }
+        // Validate sub statement cardinality.
+        validateSubStatementsCardinality(ctx);
+
+        // Check for identifier collision
+        int line = ctx.IDENTIFIER().getSymbol().getLine();
+        int charPositionInLine = ctx.IDENTIFIER().getSymbol().getCharPositionInLine();
+        String identifierName = ctx.IDENTIFIER().getText();
+        detectCollidingChildUtil(listener, line, charPositionInLine, identifierName, CONTAINER_DATA);
 
         YangContainer container = new YangContainer();
         container.setName(ctx.IDENTIFIER().getText());
 
-        /* If "config" is not specified, the default is the same as the parent
-           schema node's "config" value. */
+        /*
+         * If "config" is not specified, the default is the same as the parent
+         * schema node's "config" value.
+         */
         if (ctx.configStatement().isEmpty()) {
             boolean parentConfig = ListenerValidation.getParentNodeConfig(listener);
             container.setConfig(parentConfig);
@@ -122,7 +127,7 @@
                 curNode.addChild(container);
             } catch (DataModelException e) {
                 throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
-                                CONTAINER_DATA, ctx.IDENTIFIER().getText(), ENTRY, e.getMessage()));
+                        CONTAINER_DATA, ctx.IDENTIFIER().getText(), ENTRY, e.getMessage()));
             }
             listener.getParsedDataStack().push(container);
         } else {
@@ -135,11 +140,11 @@
      * It is called when parser exits from grammar rule (container), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processContainerExit(TreeWalkListener listener,
-                                            GeneratedYangParser.ContainerStatementContext ctx) {
+            GeneratedYangParser.ContainerStatementContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, CONTAINER_DATA, ctx.IDENTIFIER().getText(), EXIT);
@@ -155,48 +160,22 @@
             listener.getParsedDataStack().pop();
         } else {
             throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, CONTAINER_DATA,
-                            ctx.IDENTIFIER().getText(), EXIT));
+                    ctx.IDENTIFIER().getText(), EXIT));
         }
     }
 
     /**
      * Validates the cardinality of container sub-statements as per grammar.
      *
-     * @param ctx context object of the grammar rule.
-     * @return true/false validation success or failure.
+     * @param ctx context object of the grammar rule
      */
-    private static boolean validateSubStatementsCardinality(GeneratedYangParser.ContainerStatementContext ctx) {
+    private static void validateSubStatementsCardinality(GeneratedYangParser.ContainerStatementContext ctx) {
 
-        if ((!ctx.presenceStatement().isEmpty())
-                && (ctx.presenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.PRESENCE_DATA;
-            return false;
-        }
-
-        if ((!ctx.configStatement().isEmpty())
-                && (ctx.configStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.CONFIG_DATA;
-            return false;
-        }
-
-        if ((!ctx.descriptionStatement().isEmpty())
-                && (ctx.descriptionStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.DESCRIPTION_DATA;
-            return false;
-        }
-
-        if ((!ctx.referenceStatement().isEmpty())
-                && (ctx.referenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.REFERENCE_DATA;
-            return false;
-        }
-
-        if ((!ctx.statusStatement().isEmpty())
-                && (ctx.statusStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.STATUS_DATA;
-            return false;
-        }
-
-        return true;
+        validateCardinality(ctx.presenceStatement(), PRESENCE_DATA, CONTAINER_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.configStatement(), CONFIG_DATA, CONTAINER_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.descriptionStatement(), DESCRIPTION_DATA, CONTAINER_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.referenceStatement(), REFERENCE_DATA, CONTAINER_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.statusStatement(), STATUS_DATA, CONTAINER_DATA, ctx.IDENTIFIER().getText());
+        // TODO when, grouping, typedef.
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DefaultListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DefaultListener.java
index f500cca..42b3cc4 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DefaultListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DefaultListener.java
@@ -45,7 +45,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.DEFAULT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DEFAULT_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
@@ -64,8 +64,8 @@
      * It is called when parser enters grammar rule (default), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processDefaultEntry(TreeWalkListener listener,
             GeneratedYangParser.DefaultStatementContext ctx) {
@@ -74,7 +74,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, DEFAULT_DATA, ctx.string().getText(), ENTRY);
 
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
             case TYPEDEF_DATA: {
                 YangTypeDef typeDef = (YangTypeDef) tmpNode;
                 typeDef.setDefaultValueInString(ctx.string().getText());
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListener.java
index 1befa54..e27c618 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/DescriptionListener.java
@@ -22,7 +22,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.DESCRIPTION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -56,8 +56,8 @@
      * rule (description), perform validations and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processDescriptionEntry(TreeWalkListener listener,
                                              GeneratedYangParser.DescriptionStatementContext ctx) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumListener.java
index e255441..1d45a5e 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumListener.java
@@ -64,7 +64,7 @@
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
-import static org.onosproject.yangutils.parser.ParsableDataType.ENUM_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.ENUM_DATA;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
@@ -94,8 +94,8 @@
      * It is called when parser enters grammar rule (enum), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processEnumEntry(TreeWalkListener listener, GeneratedYangParser.EnumStatementContext ctx) {
 
@@ -111,8 +111,8 @@
      * It is called when parser exits from grammar rule (enum), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processEnumExit(TreeWalkListener listener, GeneratedYangParser.EnumStatementContext ctx) {
 
@@ -127,7 +127,7 @@
             checkStackIsNotEmpty(listener, MISSING_HOLDER, ENUM_DATA, ctx.string().getText(), EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
                 case ENUMERATION_DATA: {
                     YangEnumeration yangEnumeration = (YangEnumeration) tmpNode;
                     if ((ctx.enumStatementBody() == null) || (ctx.enumStatementBody().valueStatement() == null)) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumerationListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumerationListener.java
index f83c49c..5f98fa4 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumerationListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/EnumerationListener.java
@@ -46,8 +46,8 @@
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangType;
 import org.onosproject.yangutils.parser.Parsable;
-import static org.onosproject.yangutils.parser.ParsableDataType.ENUMERATION_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.ENUMERATION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
@@ -76,8 +76,8 @@
      * It is called when parser enters grammar rule (enumeration), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processEnumerationEntry(TreeWalkListener listener,
             GeneratedYangParser.EnumSpecificationContext ctx) {
@@ -94,7 +94,7 @@
 
             Parsable tmpData = listener.getParsedDataStack().peek();
 
-            switch (tmpData.getParsableDataType()) {
+            switch (tmpData.getYangConstructType()) {
                 case LEAF_DATA:
                     enumerationNode.setEnumerationName(((YangLeaf) tmpData).getLeafName());
                     break;
@@ -117,8 +117,8 @@
      * It is called when parser exits from grammar rule (enumeration), it
      * perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processEnumerationExit(TreeWalkListener listener,
             GeneratedYangParser.EnumSpecificationContext ctx) {
@@ -134,7 +134,7 @@
             checkStackIsNotEmpty(listener, MISSING_HOLDER, ENUMERATION_DATA, "", EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
                 case TYPE_DATA: {
                     YangType typeNode = (YangType) tmpNode;
                     typeNode.setDataTypeExtendedInfo((YangEnumeration) tmpEnumerationNode);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ImportListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ImportListener.java
index 1f5e113..bd120ad 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ImportListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ImportListener.java
@@ -23,13 +23,14 @@
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.IMPORT_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.*;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.IMPORT_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -69,8 +70,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (import), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processImportEntry(TreeWalkListener listener, GeneratedYangParser.ImportStatementContext ctx) {
 
@@ -88,8 +89,8 @@
      * It is called when parser exits from grammar rule (import), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processImportExit(TreeWalkListener listener, GeneratedYangParser.ImportStatementContext ctx) {
 
@@ -105,7 +106,7 @@
                                  EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
             case MODULE_DATA: {
                 YangModule module = (YangModule) tmpNode;
                 module.addImportedInfo((YangImport) tmpImportNode);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IncludeListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IncludeListener.java
index 533db1f..6e28ada 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IncludeListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/IncludeListener.java
@@ -23,13 +23,14 @@
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.INCLUDE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.*;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.INCLUDE_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -68,8 +69,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (include), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processIncludeEntry(TreeWalkListener listener, GeneratedYangParser.IncludeStatementContext ctx) {
 
@@ -87,8 +88,8 @@
      * It is called when parser exits from grammar rule (include), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processIncludeExit(TreeWalkListener listener, GeneratedYangParser.IncludeStatementContext ctx) {
 
@@ -104,7 +105,7 @@
                                  EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
             case MODULE_DATA: {
                 YangModule module = (YangModule) tmpNode;
                 module.addIncludedInfo((YangInclude) tmpIncludeNode);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/KeyListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/KeyListener.java
index 268d535..d3472aa 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/KeyListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/KeyListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.KEY_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.KEY_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
@@ -59,8 +59,8 @@
      * rule (key), perform validations and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processKeyEntry(TreeWalkListener listener,
                                          GeneratedYangParser.KeyStatementContext ctx) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java
index 1ada6dd..896e8ec 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListListener.java
@@ -19,21 +19,28 @@
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.parser.Parsable;
-import org.onosproject.yangutils.parser.ParsableDataType;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.LEAF_LIST_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CARDINALITY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinality;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityEqualsOne;
+import static org.onosproject.yangutils.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.LEAF_LIST_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MAX_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MIN_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.UNITS_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -68,8 +75,6 @@
  */
 public final class LeafListListener {
 
-    private static ParsableDataType yangConstruct;
-
     /**
      * Creates a new leaf list listener.
      */
@@ -77,23 +82,26 @@
     }
 
     /**
-     * It is called when parser receives an input matching the grammar
-     * rule (leaf-list), performs validation and updates the data model
-     * tree.
+     * It is called when parser receives an input matching the grammar rule
+     * (leaf-list), performs validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processLeafListEntry(TreeWalkListener listener,
-                                            GeneratedYangParser.LeafListStatementContext ctx) {
+            GeneratedYangParser.LeafListStatementContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, LEAF_LIST_DATA, ctx.IDENTIFIER().getText(), ENTRY);
 
-        boolean result = validateSubStatementsCardinality(ctx);
-        if (!result) {
-            throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY));
-        }
+        // Validate sub statement cardinality.
+        validateSubStatementsCardinality(ctx);
+
+        // Check for identifier collision
+        int line = ctx.IDENTIFIER().getSymbol().getLine();
+        int charPositionInLine = ctx.IDENTIFIER().getSymbol().getCharPositionInLine();
+        String identifierName = ctx.IDENTIFIER().getText();
+        detectCollidingChildUtil(listener, line, charPositionInLine, identifierName, LEAF_LIST_DATA);
 
         YangLeafList leafList = new YangLeafList();
         leafList.setLeafName(ctx.IDENTIFIER().getText());
@@ -106,7 +114,7 @@
             leaves.addLeafList(leafList);
         } else {
             throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LEAF_LIST_DATA,
-                            ctx.IDENTIFIER().getText(), ENTRY));
+                    ctx.IDENTIFIER().getText(), ENTRY));
         }
         listener.getParsedDataStack().push(leafList);
     }
@@ -115,11 +123,11 @@
      * It is called when parser exits from grammar rule (leaf-list), it performs
      * validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processLeafListExit(TreeWalkListener listener,
-                                           GeneratedYangParser.LeafListStatementContext ctx) {
+            GeneratedYangParser.LeafListStatementContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, LEAF_LIST_DATA, ctx.IDENTIFIER().getText(), EXIT);
@@ -136,59 +144,17 @@
      * Validates the cardinality of leaf-list sub-statements as per grammar.
      *
      * @param ctx context object of the grammar rule.
-     * @return true/false validation success or failure.
      */
-    private static boolean validateSubStatementsCardinality(GeneratedYangParser
-            .LeafListStatementContext ctx) {
+    private static void validateSubStatementsCardinality(GeneratedYangParser.LeafListStatementContext ctx) {
 
-        if (ctx.typeStatement().isEmpty()
-                || (ctx.typeStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.TYPE_DATA;
-            return false;
-        }
-
-        if ((!ctx.unitsStatement().isEmpty())
-                && (ctx.unitsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.UNITS_DATA;
-            return false;
-        }
-
-        if ((!ctx.configStatement().isEmpty())
-                && (ctx.configStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.CONFIG_DATA;
-            return false;
-        }
-
-        if ((!ctx.maxElementsStatement().isEmpty())
-                && (ctx.maxElementsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.MAX_ELEMENT_DATA;
-            return false;
-        }
-
-        if ((!ctx.minElementsStatement().isEmpty())
-                && (ctx.minElementsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.MIN_ELEMENT_DATA;
-            return false;
-        }
-
-        if ((!ctx.descriptionStatement().isEmpty())
-                && (ctx.descriptionStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.DESCRIPTION_DATA;
-            return false;
-        }
-
-        if ((!ctx.referenceStatement().isEmpty())
-                && (ctx.referenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.REFERENCE_DATA;
-            return false;
-        }
-
-        if ((!ctx.statusStatement().isEmpty())
-                && (ctx.statusStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.STATUS_DATA;
-            return false;
-        }
-
-        return true;
+        validateCardinalityEqualsOne(ctx.typeStatement(), TYPE_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.unitsStatement(), UNITS_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.configStatement(), CONFIG_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.maxElementsStatement(), MAX_ELEMENT_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.minElementsStatement(), MIN_ELEMENT_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.descriptionStatement(), DESCRIPTION_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.referenceStatement(), REFERENCE_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.statusStatement(), STATUS_DATA, LEAF_LIST_DATA, ctx.IDENTIFIER().getText());
+        //TODO ordered by
     }
-}
\ No newline at end of file
+}
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java
index 81e9e1c..226f621 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/LeafListener.java
@@ -21,23 +21,29 @@
 package org.onosproject.yangutils.parser.impl.listeners;
 
 import org.onosproject.yangutils.datamodel.YangLeaf;
+import org.onosproject.yangutils.datamodel.YangLeavesHolder;
 import org.onosproject.yangutils.parser.Parsable;
-import org.onosproject.yangutils.parser.ParsableDataType;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-import org.onosproject.yangutils.datamodel.YangLeavesHolder;
-import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.LEAF_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CARDINALITY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinality;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityEqualsOne;
+import static org.onosproject.yangutils.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.LEAF_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MANDATORY_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.UNITS_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -66,13 +72,11 @@
  */
 
 /**
- * Implements listener based call back function corresponding to the "leaf"
- * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
+ * Implements listener based call back function corresponding to the "leaf" rule
+ * defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
  */
 public final class LeafListener {
 
-    private static ParsableDataType yangConstruct;
-
     /**
      * Creates a new leaf listener.
      */
@@ -80,23 +84,26 @@
     }
 
     /**
-     * It is called when parser receives an input matching the grammar
-     * rule (leaf), performs validation and updates the data model
-     * tree.
+     * It is called when parser receives an input matching the grammar rule
+     * (leaf), performs validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processLeafEntry(TreeWalkListener listener,
-                                        GeneratedYangParser.LeafStatementContext ctx) {
+            GeneratedYangParser.LeafStatementContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, LEAF_DATA, ctx.IDENTIFIER().getText(), ENTRY);
 
-        boolean result = validateSubStatementsCardinality(ctx);
-        if (!result) {
-            throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY));
-        }
+        // Validate sub statement cardinality.
+        validateSubStatementsCardinality(ctx);
+
+        // Check for identifier collision
+        int line = ctx.IDENTIFIER().getSymbol().getLine();
+        int charPositionInLine = ctx.IDENTIFIER().getSymbol().getCharPositionInLine();
+        String identifierName = ctx.IDENTIFIER().getText();
+        detectCollidingChildUtil(listener, line, charPositionInLine, identifierName, LEAF_DATA);
 
         YangLeaf leaf = new YangLeaf();
         leaf.setLeafName(ctx.IDENTIFIER().getText());
@@ -123,7 +130,7 @@
      * @param ctx context object of the grammar rule.
      */
     public static void processLeafExit(TreeWalkListener listener,
-                                       GeneratedYangParser.LeafStatementContext ctx) {
+            GeneratedYangParser.LeafStatementContext ctx) {
 
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, LEAF_DATA, ctx.IDENTIFIER().getText(), EXIT);
@@ -132,7 +139,7 @@
             listener.getParsedDataStack().pop();
         } else {
             throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, LEAF_DATA,
-                            ctx.IDENTIFIER().getText(), EXIT));
+                    ctx.IDENTIFIER().getText(), EXIT));
         }
     }
 
@@ -140,53 +147,16 @@
      * Validates the cardinality of leaf sub-statements as per grammar.
      *
      * @param ctx context object of the grammar rule.
-     * @return true/false validation success or failure.
      */
-    private static boolean validateSubStatementsCardinality(GeneratedYangParser
-            .LeafStatementContext ctx) {
+    private static void validateSubStatementsCardinality(GeneratedYangParser.LeafStatementContext ctx) {
 
-        if (ctx.typeStatement().isEmpty()
-                || (ctx.typeStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.TYPE_DATA;
-            return false;
-        }
-
-        if ((!ctx.unitsStatement().isEmpty())
-                && (ctx.unitsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.UNITS_DATA;
-            return false;
-        }
-
-        if ((!ctx.configStatement().isEmpty())
-                && (ctx.configStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.CONFIG_DATA;
-            return false;
-        }
-
-        if ((!ctx.mandatoryStatement().isEmpty())
-                && (ctx.mandatoryStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.MANDATORY_DATA;
-            return false;
-        }
-
-        if ((!ctx.descriptionStatement().isEmpty())
-                && (ctx.descriptionStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.DESCRIPTION_DATA;
-            return false;
-        }
-
-        if ((!ctx.referenceStatement().isEmpty())
-                && (ctx.referenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.REFERENCE_DATA;
-            return false;
-        }
-
-        if ((!ctx.statusStatement().isEmpty())
-                && (ctx.statusStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.STATUS_DATA;
-            return false;
-        }
-
-        return true;
+        validateCardinalityEqualsOne(ctx.typeStatement(), TYPE_DATA, LEAF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.unitsStatement(), UNITS_DATA, LEAF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.configStatement(), CONFIG_DATA, LEAF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.mandatoryStatement(), MANDATORY_DATA, LEAF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.descriptionStatement(), DESCRIPTION_DATA, LEAF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.referenceStatement(), REFERENCE_DATA, LEAF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.statusStatement(), STATUS_DATA, LEAF_DATA, ctx.IDENTIFIER().getText());
+        //TODO when.
     }
-}
\ No newline at end of file
+}
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ListListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ListListener.java
index 2319b8e..7692025 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ListListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ListListener.java
@@ -16,31 +16,38 @@
 
 package org.onosproject.yangutils.parser.impl.listeners;
 
-import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangContainer;
+import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeType;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
-import org.onosproject.yangutils.parser.ParsableDataType;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
-import org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.LIST_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CARDINALITY;
+import org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinality;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityNonNull;
+import static org.onosproject.yangutils.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DATA_DEF_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.KEY_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.LIST_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MAX_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MIN_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -74,13 +81,11 @@
  */
 
 /**
- * Implements listener based call back function corresponding to the "list"
- * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
+ * Implements listener based call back function corresponding to the "list" rule
+ * defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
  */
 public final class ListListener {
 
-    private static ParsableDataType yangConstruct;
-
     /**
      * Creates a new list listener.
      */
@@ -88,30 +93,35 @@
     }
 
     /**
-     * It is called when parser receives an input matching the grammar
-     * rule (list), performs validation and updates the data model
-     * tree.
+     * It is called when parser receives an input matching the grammar rule
+     * (list), performs validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processListEntry(TreeWalkListener listener,
-                                             GeneratedYangParser.ListStatementContext ctx) {
+            GeneratedYangParser.ListStatementContext ctx) {
 
         YangNode curNode;
 
         checkStackIsNotEmpty(listener, MISSING_HOLDER, LIST_DATA, ctx.IDENTIFIER().getText(), ENTRY);
 
-        boolean result = validateSubStatementsCardinality(ctx);
-        if (!result) {
-            throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY));
-        }
+        // Validate sub statement cardinality.
+        validateSubStatementsCardinality(ctx);
+
+        // Check for identifier collision
+        int line = ctx.IDENTIFIER().getSymbol().getLine();
+        int charPositionInLine = ctx.IDENTIFIER().getSymbol().getCharPositionInLine();
+        String identifierName = ctx.IDENTIFIER().getText();
+        detectCollidingChildUtil(listener, line, charPositionInLine, identifierName, LIST_DATA);
 
         YangList yangList = new YangList(YangNodeType.LIST_NODE);
         yangList.setName(ctx.IDENTIFIER().getText());
 
-        /* If "config" is not specified, the default is the same as the parent
-           schema node's "config" value. */
+        /*
+         * If "config" is not specified, the default is the same as the parent
+         * schema node's "config" value.
+         */
         if (ctx.configStatement().isEmpty()) {
             boolean parentConfig = ListenerValidation.getParentNodeConfig(listener);
             yangList.setConfig(parentConfig);
@@ -130,7 +140,7 @@
             listener.getParsedDataStack().push(yangList);
         } else {
             throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, LIST_DATA,
-                            ctx.IDENTIFIER().getText(), ENTRY));
+                    ctx.IDENTIFIER().getText(), ENTRY));
         }
     }
 
@@ -138,11 +148,11 @@
      * It is called when parser exits from grammar rule (list), it performs
      * validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processListExit(TreeWalkListener listener,
-                                            GeneratedYangParser.ListStatementContext ctx) {
+            GeneratedYangParser.ListStatementContext ctx) {
 
         checkStackIsNotEmpty(listener, MISSING_HOLDER, LIST_DATA, ctx.IDENTIFIER().getText(), EXIT);
 
@@ -157,65 +167,25 @@
             listener.getParsedDataStack().pop();
         } else {
             throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, LIST_DATA,
-                            ctx.IDENTIFIER().getText(), EXIT));
+                    ctx.IDENTIFIER().getText(), EXIT));
         }
     }
 
     /**
      * Validates the cardinality of list sub-statements as per grammar.
      *
-     * @param ctx context object of the grammar rule.
-     * @return true/false validation success or failure.
+     * @param ctx context object of the grammar rule
      */
-    private static boolean validateSubStatementsCardinality(GeneratedYangParser.ListStatementContext ctx) {
+    private static void validateSubStatementsCardinality(GeneratedYangParser.ListStatementContext ctx) {
 
-        if ((!ctx.keyStatement().isEmpty())
-                && (ctx.keyStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.KEY_DATA;
-            return false;
-        }
-
-        if ((!ctx.configStatement().isEmpty())
-                && (ctx.configStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.CONFIG_DATA;
-            return false;
-        }
-
-        if ((!ctx.maxElementsStatement().isEmpty())
-                && (ctx.maxElementsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.MAX_ELEMENT_DATA;
-            return false;
-        }
-
-        if ((!ctx.minElementsStatement().isEmpty())
-                && (ctx.minElementsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.MIN_ELEMENT_DATA;
-            return false;
-        }
-
-        if ((!ctx.descriptionStatement().isEmpty())
-                && (ctx.descriptionStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.DESCRIPTION_DATA;
-            return false;
-        }
-
-        if ((!ctx.referenceStatement().isEmpty())
-                && (ctx.referenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.REFERENCE_DATA;
-            return false;
-        }
-
-        if ((!ctx.statusStatement().isEmpty())
-                && (ctx.statusStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = ParsableDataType.STATUS_DATA;
-            return false;
-        }
-
-        if (ctx.dataDefStatement().isEmpty()) {
-            yangConstruct = ParsableDataType.LIST_DATA;
-            return false;
-        }
-
-        return true;
+        validateCardinality(ctx.keyStatement(), KEY_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.configStatement(), CONFIG_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.maxElementsStatement(), MAX_ELEMENT_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.minElementsStatement(), MIN_ELEMENT_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.descriptionStatement(), DESCRIPTION_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.referenceStatement(), REFERENCE_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.statusStatement(), STATUS_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        validateCardinalityNonNull(ctx.dataDefStatement(), DATA_DEF_DATA, LIST_DATA, ctx.IDENTIFIER().getText());
+        //TODO when, typedef, grouping, unique
     }
-}
\ No newline at end of file
+}
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListener.java
index 2e118ce..ea33cd7 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MandatoryListener.java
@@ -22,7 +22,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.MANDATORY_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MANDATORY_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -62,8 +62,8 @@
      * rule (mandatory), performs validation and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processMandatoryEntry(TreeWalkListener listener,
                                           GeneratedYangParser.MandatoryStatementContext ctx) {
@@ -72,7 +72,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, MANDATORY_DATA, "", ENTRY);
 
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
             case LEAF_DATA:
                 YangLeaf leaf = (YangLeaf) tmpNode;
                 if (ctx.TRUE_KEYWORD() != null) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java
index bf59311..72ba44d 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MaxElementsListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.MAX_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MAX_ELEMENT_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -60,8 +60,8 @@
      * rule (max-elements), performs validation and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processMaxElementsEntry(TreeWalkListener listener,
                                              GeneratedYangParser.MaxElementsStatementContext ctx) {
@@ -77,7 +77,7 @@
         }
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getParsableDataType()) {
+        switch (tmpData.getYangConstructType()) {
             case LEAF_LIST_DATA:
                 YangLeafList leafList = (YangLeafList) tmpData;
                 leafList.setMaxElelements(maxElementsValue);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListener.java
index 8e1e2f7..a89c6ce 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/MinElementsListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.MIN_ELEMENT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.MIN_ELEMENT_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -61,8 +61,8 @@
      * rule (min-elements), performs validation and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processMinElementsEntry(TreeWalkListener listener,
                                                GeneratedYangParser.MinElementsStatementContext ctx) {
@@ -71,7 +71,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, MIN_ELEMENT_DATA, ctx.INTEGER().getText(), ENTRY);
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getParsableDataType()) {
+        switch (tmpData.getYangConstructType()) {
             case LEAF_LIST_DATA:
                 YangLeafList leafList = (YangLeafList) tmpData;
                 leafList.setMinElements(Integer.parseInt(ctx.INTEGER().getText()));
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
index 8e808a2..f4f6ef5 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ModuleListener.java
@@ -20,14 +20,15 @@
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.MODULE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.*;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.MODULE_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -63,8 +64,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (module), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processModuleEntry(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) {
 
@@ -74,6 +75,10 @@
         YangModule yangModule = new YangModule();
         yangModule.setName(ctx.IDENTIFIER().getText());
 
+        if (ctx.moduleBody(0).moduleHeaderStatement().yangVersionStatement() == null) {
+            yangModule.setVersion((byte) 1);
+        }
+
         listener.getParsedDataStack().push(yangModule);
     }
 
@@ -81,8 +86,8 @@
      * It is called when parser exits from grammar rule (module), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processModuleExit(TreeWalkListener listener, GeneratedYangParser.ModuleStatementContext ctx) {
 
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/NamespaceListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/NamespaceListener.java
index 4030ada..a2cf36c 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/NamespaceListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/NamespaceListener.java
@@ -25,7 +25,7 @@
 
 import java.net.URI;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.NAMESPACE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.NAMESPACE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -70,8 +70,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (namespace), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processNamespaceEntry(TreeWalkListener listener,
                                              GeneratedYangParser.NamespaceStatementContext ctx) {
@@ -80,7 +80,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, NAMESPACE_DATA, ctx.string().getText(), ENTRY);
 
         if (!validateUriValue(ctx.string().getText())) {
-            ParserException parserException = new ParserException("Invalid namespace URI");
+            ParserException parserException = new ParserException("YANG file error: Invalid namespace URI");
             parserException.setLine(ctx.string().STRING(0).getSymbol().getLine());
             parserException.setCharPosition(ctx.string().STRING(0).getSymbol().getCharPositionInLine());
             throw parserException;
@@ -88,7 +88,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
         case MODULE_DATA: {
             YangModule module = (YangModule) tmpNode;
             YangNameSpace uri = new YangNameSpace();
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/OrganizationListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/OrganizationListener.java
index ab8681c..d0525c0 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/OrganizationListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/OrganizationListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.ORGANIZATION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.ORGANIZATION_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -88,8 +88,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (organization), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processOrganizationEntry(TreeWalkListener listener,
                                                 GeneratedYangParser.OrganizationStatementContext ctx) {
@@ -100,7 +100,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
         case MODULE_DATA: {
             YangModule module = (YangModule) tmpNode;
             module.setOrganization(ctx.string().getText());
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PositionListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PositionListener.java
index 92b3e68..41835d6 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PositionListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PositionListener.java
@@ -36,7 +36,7 @@
 import org.onosproject.yangutils.datamodel.YangBit;
 import org.onosproject.yangutils.datamodel.YangBits;
 import org.onosproject.yangutils.parser.Parsable;
-import static org.onosproject.yangutils.parser.ParsableDataType.POSITION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.POSITION_DATA;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
@@ -65,8 +65,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (position), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processPositionEntry(TreeWalkListener listener,
                                             GeneratedYangParser.PositionStatementContext ctx) {
@@ -76,7 +76,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
             case BIT_DATA: {
                 YangBit bitNode = (YangBit) tmpNode;
                 if (!isBitPositionValid(listener, ctx)) {
@@ -97,8 +97,8 @@
     /**
      * Validates BITS position value correctness and uniqueness.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      * @return validation result
      */
     private static boolean isBitPositionValid(TreeWalkListener listener,
@@ -109,18 +109,18 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, POSITION_DATA, ctx.INTEGER().getText(), ENTRY);
 
         if (Integer.valueOf(ctx.INTEGER().getText()) < 0) {
-            errMsg = "Negative value of position is invalid";
+            errMsg = "YANG file error: Negative value of position is invalid.";
             listener.getParsedDataStack().push(bitNode);
             return false;
         }
 
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
             case BITS_DATA: {
                 YangBits yangBits = (YangBits) tmpNode;
                 for (YangBit curBit : yangBits.getBitSet()) {
                     if (Integer.valueOf(ctx.INTEGER().getText()) == curBit.getPosition()) {
-                        errMsg = "Duplicate value of position is invalid";
+                        errMsg = "YANG file error: Duplicate value of position is invalid.";
                         listener.getParsedDataStack().push(bitNode);
                         return false;
                     }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PrefixListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PrefixListener.java
index 6b6db62..e59cda0 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PrefixListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PrefixListener.java
@@ -24,7 +24,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.PREFIX_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.PREFIX_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -70,8 +70,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (prefix),perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processPrefixEntry(TreeWalkListener listener, GeneratedYangParser.PrefixStatementContext ctx) {
 
@@ -80,7 +80,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
         case MODULE_DATA: {
             YangModule module = (YangModule) tmpNode;
             module.setPrefix(ctx.IDENTIFIER().getText());
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PresenceListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PresenceListener.java
index a771307..74e40b1 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PresenceListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/PresenceListener.java
@@ -22,8 +22,8 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.PRESENCE_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.CONTAINER_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.PRESENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.CONTAINER_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -57,8 +57,8 @@
      * rule (presence), performs validation and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processPresenceEntry(TreeWalkListener listener,
                                              GeneratedYangParser.PresenceStatementContext ctx) {
@@ -67,7 +67,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, PRESENCE_DATA, ctx.string().getText(), ENTRY);
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        if (tmpData.getParsableDataType() == CONTAINER_DATA) {
+        if (tmpData.getYangConstructType() == CONTAINER_DATA) {
             YangContainer container = (YangContainer) tmpData;
             container.setPresence(ctx.string().getText());
         } else {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListener.java
index 6e83e86..aaca80c 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ReferenceListener.java
@@ -22,7 +22,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.REFERENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -56,8 +56,8 @@
      * rule (reference), performs validation and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processReferenceEntry(TreeWalkListener listener,
                                              GeneratedYangParser.ReferenceStatementContext ctx) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionDateListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionDateListener.java
index bef6f8e3..17fe6b7 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionDateListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionDateListener.java
@@ -27,7 +27,7 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.REVISION_DATE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REVISION_DATE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -79,8 +79,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (revision date),perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processRevisionDateEntry(TreeWalkListener listener,
                                                 GeneratedYangParser.RevisionDateStatementContext ctx) {
@@ -90,7 +90,7 @@
                              ENTRY);
 
         if (!isDateValid(ctx.DATE_ARG().getText())) {
-            ParserException parserException = new ParserException("Input date is not correct");
+            ParserException parserException = new ParserException("YANG file error: Input date is not correct");
             parserException.setLine(ctx.DATE_ARG().getSymbol().getLine());
             parserException.setCharPosition(ctx.DATE_ARG().getSymbol().getCharPositionInLine());
             throw parserException;
@@ -98,7 +98,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
         case IMPORT_DATA: {
             YangImport importNode = (YangImport) tmpNode;
             importNode.setRevision(ctx.DATE_ARG().getText());
@@ -118,8 +118,8 @@
     /**
      * Validates the revision date.
      *
-     * @param dateToValidate input revision date.
-     * @return validation result, true for success, false for failure.
+     * @param dateToValidate input revision date
+     * @return validation result, true for success, false for failure
      */
     private static boolean isDateValid(String dateToValidate) {
 
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionListener.java
index a135891..32675cd 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/RevisionListener.java
@@ -24,13 +24,19 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.REVISION_DATA;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.utils.YangConstructType.REVISION_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.*;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
  *
@@ -75,8 +81,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (revision),perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processRevisionEntry(TreeWalkListener listener,
                                             GeneratedYangParser.RevisionStatementContext ctx) {
@@ -91,6 +97,13 @@
             // TODO to be implemented.
         }
 
+        if (!isDateValid(ctx.DATE_ARG().getText())) {
+            ParserException parserException = new ParserException("YANG file error: Input date is not correct");
+            parserException.setLine(ctx.DATE_ARG().getSymbol().getLine());
+            parserException.setCharPosition(ctx.DATE_ARG().getSymbol().getCharPositionInLine());
+            throw parserException;
+        }
+
         YangRevision revisionNode = new YangRevision();
         revisionNode.setRevDate(ctx.DATE_ARG().getText());
 
@@ -101,8 +114,8 @@
      * It is called when parser exits from grammar rule (revision), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processRevisionExit(TreeWalkListener listener, GeneratedYangParser.RevisionStatementContext
             ctx) {
@@ -119,7 +132,7 @@
                                  EXIT);
 
             Parsable tmpNode = listener.getParsedDataStack().peek();
-            switch (tmpNode.getParsableDataType()) {
+            switch (tmpNode.getYangConstructType()) {
             case MODULE_DATA: {
                 YangModule module = (YangModule) tmpNode;
                 module.setRevision((YangRevision) tmpRevisionNode);
@@ -144,8 +157,8 @@
     /**
      * Validate revision.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      * @return validation result
      */
     private static boolean validateRevision(TreeWalkListener listener,
@@ -153,4 +166,29 @@
         // TODO to be implemented
         return true;
     }
+
+    /**
+     * Validates the revision date.
+     *
+     * @param dateToValidate input revision date
+     * @return validation result, true for success, false for failure
+     */
+    private static boolean isDateValid(String dateToValidate) {
+
+        if (dateToValidate == null) {
+            return false;
+        }
+
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        sdf.setLenient(false);
+
+        try {
+            //if not valid, it will throw ParseException
+            Date date = sdf.parse(dateToValidate);
+            System.out.println(date);
+        } catch (ParseException e) {
+            return false;
+        }
+        return true;
+    }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/StatusListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/StatusListener.java
index 82cdabd..379994e 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/StatusListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/StatusListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.STATUS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -62,8 +62,8 @@
      * rule (status), performs validation and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processStatusEntry(TreeWalkListener listener,
                                           GeneratedYangParser.StatusStatementContext ctx) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java
index b577bcf..4f8a64e 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/SubModuleListener.java
@@ -20,14 +20,15 @@
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-
-import static org.onosproject.yangutils.parser.ParsableDataType.SUB_MODULE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.*;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yangutils.utils.YangConstructType.SUB_MODULE_DATA;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -64,8 +65,8 @@
      * It is called when parser receives an input matching the grammar rule (sub
      * module), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processSubModuleEntry(TreeWalkListener listener,
                                              GeneratedYangParser.SubModuleStatementContext ctx) {
@@ -77,6 +78,10 @@
         YangSubModule yangSubModule = new YangSubModule();
         yangSubModule.setName(ctx.IDENTIFIER().getText());
 
+        if (ctx.submoduleBody(0).submoduleHeaderStatement().yangVersionStatement() == null) {
+            yangSubModule.setVersion((byte) 1);
+        }
+
         listener.getParsedDataStack().push(yangSubModule);
     }
 
@@ -84,8 +89,8 @@
      * It is called when parser exits from grammar rule (submodule), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processSubModuleExit(TreeWalkListener listener,
                                             GeneratedYangParser.SubModuleStatementContext ctx) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
index 5373232..5ba9780 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeDefListener.java
@@ -58,24 +58,23 @@
 import org.onosproject.yangutils.datamodel.YangTypeDef;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.parser.Parsable;
-import org.onosproject.yangutils.parser.ParsableDataType;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinality;
+import static org.onosproject.yangutils.parser.impl.parserutils.ListenerValidation.validateCardinalityEqualsOne;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
-import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.DEFAULT_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.DESCRIPTION_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.REFERENCE_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.STATUS_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.TYPEDEF_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA;
-import static org.onosproject.yangutils.parser.ParsableDataType.UNITS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DEFAULT_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.STATUS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPEDEF_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.UNITS_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_CARDINALITY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
@@ -88,8 +87,6 @@
  */
 public final class TypeDefListener {
 
-    private static ParsableDataType yangConstruct;
-
     /**
      * Creates a new typedef listener.
      */
@@ -100,8 +97,8 @@
      * It is called when parser enters grammar rule (typedef), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processTypeDefEntry(TreeWalkListener listener,
             GeneratedYangParser.TypedefStatementContext ctx) {
@@ -109,10 +106,8 @@
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), ENTRY);
 
-        boolean result = validateSubStatementsCardinality(ctx);
-        if (!result) {
-            throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY));
-        }
+        // Validate sub statement cardinality.
+        validateSubStatementsCardinality(ctx);
 
         /*
          * Create a derived type information, the base type must be set in type
@@ -150,8 +145,8 @@
      * It is called when parser exits from grammar rule (typedef), it perform
      * validations and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processTypeDefExit(TreeWalkListener listener,
             GeneratedYangParser.TypedefStatementContext ctx) {
@@ -178,45 +173,15 @@
     /**
      * Validates the cardinality of typedef sub-statements as per grammar.
      *
-     * @param ctx context object of the grammar rule.
-     * @return true/false validation success or failure.
+     * @param ctx context object of the grammar rule
      */
-    private static boolean validateSubStatementsCardinality(GeneratedYangParser.TypedefStatementContext ctx) {
+    private static void validateSubStatementsCardinality(GeneratedYangParser.TypedefStatementContext ctx) {
 
-        if ((!ctx.unitsStatement().isEmpty())
-                && (ctx.unitsStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = UNITS_DATA;
-            return false;
-        }
-
-        if ((!ctx.defaultStatement().isEmpty())
-                && (ctx.defaultStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = DEFAULT_DATA;
-            return false;
-        }
-
-        if (ctx.typeStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY) {
-            yangConstruct = TYPE_DATA;
-            return false;
-        }
-
-        if ((!ctx.descriptionStatement().isEmpty())
-                && (ctx.descriptionStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = DESCRIPTION_DATA;
-            return false;
-        }
-
-        if ((!ctx.referenceStatement().isEmpty())
-                && (ctx.referenceStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = REFERENCE_DATA;
-            return false;
-        }
-
-        if ((!ctx.statusStatement().isEmpty())
-                && (ctx.statusStatement().size() != YangUtilsParserManager.SUB_STATEMENT_CARDINALITY)) {
-            yangConstruct = STATUS_DATA;
-            return false;
-        }
-        return true;
+        validateCardinality(ctx.unitsStatement(), UNITS_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.defaultStatement(), DEFAULT_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinalityEqualsOne(ctx.typeStatement(), TYPE_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.descriptionStatement(), DESCRIPTION_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.referenceStatement(), REFERENCE_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
+        validateCardinality(ctx.statusStatement(), STATUS_DATA, TYPEDEF_DATA, ctx.IDENTIFIER().getText());
     }
 }
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
index 891a982..18a7aef 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/TypeListener.java
@@ -27,7 +27,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.TYPE_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
@@ -66,8 +66,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (type), performs validation and updates the data model tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processTypeEntry(TreeWalkListener listener,
             GeneratedYangParser.TypeStatementContext ctx) {
@@ -88,8 +88,8 @@
      * It is called when parser exits from grammar rule (type), it perform
      * validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processTypeExit(TreeWalkListener listener,
             GeneratedYangParser.TypeStatementContext ctx) {
@@ -107,7 +107,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPE_DATA, ctx.string().getText(), EXIT);
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getParsableDataType()) {
+        switch (tmpData.getYangConstructType()) {
             case LEAF_DATA:
                 YangLeaf leaf = (YangLeaf) tmpData;
                 leaf.setDataType((YangType) type);
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListener.java
index 6a83aaa..623b244 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/UnitsListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.UNITS_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.UNITS_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -57,8 +57,8 @@
      * rule (units), performs validation and updates the data model
      * tree.
      *
-     * @param listener listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processUnitsEntry(TreeWalkListener listener,
                                            GeneratedYangParser.UnitsStatementContext ctx) {
@@ -67,7 +67,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, UNITS_DATA, ctx.string().getText(), ENTRY);
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getParsableDataType()) {
+        switch (tmpData.getYangConstructType()) {
             case LEAF_DATA:
                 YangLeaf leaf = (YangLeaf) tmpData;
                 leaf.setUnits(ctx.string().getText());
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ValueListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ValueListener.java
index 7c050dc..80cf8a7 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ValueListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/ValueListener.java
@@ -29,7 +29,7 @@
 import org.onosproject.yangutils.datamodel.YangEnum;
 import org.onosproject.yangutils.datamodel.YangEnumeration;
 import org.onosproject.yangutils.parser.Parsable;
-import static org.onosproject.yangutils.parser.ParsableDataType.VALUE_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.VALUE_DATA;
 import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
@@ -55,8 +55,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (value), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processValueEntry(TreeWalkListener listener, GeneratedYangParser.ValueStatementContext ctx) {
 
@@ -65,7 +65,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
             case ENUM_DATA: {
                 YangEnum enumNode = (YangEnum) tmpNode;
                 if (!isEnumValueValid(listener, ctx)) {
@@ -86,8 +86,8 @@
     /**
      * Validates ENUM value uniqueness.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      * @return validation result
      */
     private static boolean isEnumValueValid(TreeWalkListener listener, GeneratedYangParser.ValueStatementContext ctx) {
@@ -97,7 +97,7 @@
         checkStackIsNotEmpty(listener, MISSING_HOLDER, VALUE_DATA, ctx.INTEGER().getText(), ENTRY);
 
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
             case ENUMERATION_DATA: {
                 YangEnumeration yangEnumeration = (YangEnumeration) tmpNode;
                 for (YangEnum curEnum : yangEnumeration.getEnumSet()) {
diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/VersionListener.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/VersionListener.java
index 021ae0d..9b9a388 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/VersionListener.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/parser/impl/listeners/VersionListener.java
@@ -23,7 +23,7 @@
 import org.onosproject.yangutils.parser.exceptions.ParserException;
 import org.onosproject.yangutils.parser.impl.TreeWalkListener;
 
-import static org.onosproject.yangutils.parser.ParsableDataType.VERSION_DATA;
+import static org.onosproject.yangutils.utils.YangConstructType.VERSION_DATA;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
 import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
@@ -78,8 +78,8 @@
      * It is called when parser receives an input matching the grammar rule
      * (version), perform validations and update the data model tree.
      *
-     * @param listener Listener's object.
-     * @param ctx context object of the grammar rule.
+     * @param listener Listener's object
+     * @param ctx context object of the grammar rule
      */
     public static void processVersionEntry(TreeWalkListener listener,
                                            GeneratedYangParser.YangVersionStatementContext ctx) {
@@ -89,7 +89,7 @@
 
         Integer version = Integer.valueOf(ctx.INTEGER().getText());
         if (!isVersionValid(version)) {
-            ParserException parserException = new ParserException("Input version not supported");
+            ParserException parserException = new ParserException("YANG file error: Input version not supported");
             parserException.setLine(ctx.INTEGER().getSymbol().getLine());
             parserException.setCharPosition(ctx.INTEGER().getSymbol().getCharPositionInLine());
             throw parserException;
@@ -97,7 +97,7 @@
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getParsableDataType()) {
+        switch (tmpNode.getYangConstructType()) {
         case MODULE_DATA: {
             YangModule module = (YangModule) tmpNode;
             module.setVersion((byte) 1);