Deviation parser and data model

Change-Id: I3cb3da5748057d0c2c9c99d7c3495643bc1ea243
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java
index 42fe6ca..babe61e 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/TreeWalkListener.java
@@ -42,6 +42,10 @@
 import org.onosproject.yang.compiler.parser.impl.listeners.Decimal64Listener;
 import org.onosproject.yang.compiler.parser.impl.listeners.DefaultListener;
 import org.onosproject.yang.compiler.parser.impl.listeners.DescriptionListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviateAddListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviateDeleteListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviateReplaceListener;
+import org.onosproject.yang.compiler.parser.impl.listeners.DeviationListener;
 import org.onosproject.yang.compiler.parser.impl.listeners.EnumListener;
 import org.onosproject.yang.compiler.parser.impl.listeners.EnumerationListener;
 import org.onosproject.yang.compiler.parser.impl.listeners.ErrorAppTagListener;
@@ -1473,14 +1477,12 @@
 
     @Override
     public void enterDeviationStatement(DeviationStatementContext ctx) {
-        increaseUnsupportedYangConstructDepth();
-        ListenerUtil.handleUnsupportedYangConstruct(YangConstructType.DEVIATION_DATA, ctx, UtilConstants.UNSUPPORTED_YANG_CONSTRUCT,
-                                                    getFileName());
+        DeviationListener.processDeviationEntry(this, ctx);
     }
 
     @Override
     public void exitDeviationStatement(DeviationStatementContext ctx) {
-        decreaseUnsupportedYangConstructDepth();
+        DeviationListener.processDeviationExit(this, ctx);
     }
 
     @Override
@@ -1495,32 +1497,32 @@
 
     @Override
     public void enterDeviateAddStatement(DeviateAddStatementContext ctx) {
-        // do nothing.
+        DeviateAddListener.processDeviateAddEntry(this, ctx);
     }
 
     @Override
     public void exitDeviateAddStatement(DeviateAddStatementContext ctx) {
-        // do nothing.
+        DeviateAddListener.processDeviateAddExit(this, ctx);
     }
 
     @Override
     public void enterDeviateDeleteStatement(DeviateDeleteStatementContext ctx) {
-        // do nothing.
+        DeviateDeleteListener.processDeviateDeleteEntry(this, ctx);
     }
 
     @Override
     public void exitDeviateDeleteStatement(DeviateDeleteStatementContext ctx) {
-        // do nothing.
+        DeviateDeleteListener.processDeviateDeleteExit(this, ctx);
     }
 
     @Override
     public void enterDeviateReplaceStatement(DeviateReplaceStatementContext ctx) {
-        // do nothing.
+        DeviateReplaceListener.processDeviateReplaceEntry(this, ctx);
     }
 
     @Override
     public void exitDeviateReplaceStatement(DeviateReplaceStatementContext ctx) {
-        // do nothing.
+        DeviateReplaceListener.processDeviateReplaceExit(this, ctx);
     }
 
     @Override
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java
index 186e1c8..6c6b8da 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ConfigListener.java
@@ -16,28 +16,6 @@
 
 package org.onosproject.yang.compiler.parser.impl.listeners;
 
-import org.onosproject.yang.compiler.datamodel.YangContainer;
-import org.onosproject.yang.compiler.datamodel.YangLeaf;
-import org.onosproject.yang.compiler.datamodel.YangLeafList;
-import org.onosproject.yang.compiler.datamodel.YangList;
-import org.onosproject.yang.compiler.datamodel.utils.Parsable;
-import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
-import org.onosproject.yang.compiler.parser.exceptions.ParserException;
-import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation;
-
-import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.CONFIG_DATA;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.getValidBooleanValue;
-import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
-
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
  *
@@ -53,6 +31,20 @@
  * config          : string;
  */
 
+import org.onosproject.yang.compiler.datamodel.YangConfig;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.getValidBooleanValue;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
 /**
  * Represents listener based call back function corresponding to the "config"
  * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
@@ -78,30 +70,17 @@
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, CONFIG_DATA, "", ENTRY);
 
-        boolean isConfig = getValidBooleanValue(ctx.config().getText(), CONFIG_DATA, ctx);
+        boolean isConfig = getValidBooleanValue(ctx.config().getText(),
+                                                CONFIG_DATA, ctx);
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getYangConstructType()) {
-            case LEAF_DATA:
-                YangLeaf leaf = (YangLeaf) tmpData;
-                leaf.setConfig(isConfig);
-                break;
-            case CONTAINER_DATA:
-                YangContainer container = (YangContainer) tmpData;
-                container.setConfig(isConfig);
-                break;
-            case LEAF_LIST_DATA:
-                YangLeafList leafList = (YangLeafList) tmpData;
-                leafList.setConfig(isConfig);
-                break;
-            case LIST_DATA:
-                YangList yangList = (YangList) tmpData;
-                yangList.setConfig(isConfig);
-                break;
-            case CHOICE_DATA: // TODO
-                break;
-            default:
-                throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, CONFIG_DATA, "", ENTRY));
+        if (tmpData instanceof YangConfig) {
+            YangConfig config = ((YangConfig) tmpData);
+            config.setConfig(isConfig);
+        } else {
+            throw new ParserException(
+                    constructListenerErrorMessage(INVALID_HOLDER,
+                                                  CONFIG_DATA, "", ENTRY));
         }
     }
 }
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java
index 0000aff..043cacd 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DefaultListener.java
@@ -39,9 +39,7 @@
  * defaultStatement : DEFAULT_KEYWORD string STMTEND;
  */
 
-import org.onosproject.yang.compiler.datamodel.YangChoice;
-import org.onosproject.yang.compiler.datamodel.YangLeaf;
-import org.onosproject.yang.compiler.datamodel.YangTypeDef;
+import org.onosproject.yang.compiler.datamodel.YangDefault;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
@@ -77,28 +75,20 @@
                                            DefaultStatementContext ctx) {
 
         // Check for stack to be non empty.
-        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEFAULT_DATA, ctx.string().getText(), ENTRY);
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEFAULT_DATA,
+                             ctx.string().getText(), ENTRY);
+        String value = removeQuotesAndHandleConcat(ctx.string().getText());
 
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getYangConstructType()) {
-            case TYPEDEF_DATA: {
-                YangTypeDef typeDef = (YangTypeDef) tmpNode;
-                typeDef.setDefaultValueInString(removeQuotesAndHandleConcat(ctx.string().getText()));
-                break;
-            }
-            case LEAF_DATA: {
-                YangLeaf leaf = (YangLeaf) tmpNode;
-                leaf.setDefaultValueInString(removeQuotesAndHandleConcat(ctx.string().getText()));
-                break;
-            }
-            case CHOICE_DATA: {
-                YangChoice choice = (YangChoice) tmpNode;
-                choice.setDefaultValueInString(removeQuotesAndHandleConcat(ctx.string().getText()));
-                break;
-            }
-            default:
-                throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
-                                                                        DEFAULT_DATA, ctx.string().getText(), ENTRY));
+        if (tmpNode instanceof YangDefault) {
+            YangDefault defaultHolder = ((YangDefault) tmpNode);
+            defaultHolder.setDefaultValueInString(value);
+        } else {
+            throw new ParserException(
+                    constructListenerErrorMessage(INVALID_HOLDER,
+                                                  DEFAULT_DATA,
+                                                  ctx.string().getText(),
+                                                  ENTRY));
         }
     }
 }
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateAddListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateAddListener.java
new file mode 100644
index 0000000..1e78332
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateAddListener.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.compiler.parser.impl.listeners;
+
+
+import org.onosproject.yang.compiler.datamodel.YangDeviateAdd;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_ADD;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ *  deviate-add-stmt    = deviate-keyword sep add-keyword optsep
+ *                        (";" /
+ *                         "{" stmtsep
+ *                             [units-stmt stmtsep]
+ *                             *(must-stmt stmtsep)
+ *                             *(unique-stmt stmtsep)
+ *                             [default-stmt stmtsep]
+ *                             [config-stmt stmtsep]
+ *                             [mandatory-stmt stmtsep]
+ *                             [min-elements-stmt stmtsep]
+ *                             [max-elements-stmt stmtsep]
+ *                         "}")
+ *
+ * ANTLR grammar rule
+ *   deviateAddStatement: DEVIATE_KEYWORD ADD_KEYWORD (STMTEND
+ *           | LEFT_CURLY_BRACE (unitsStatement | mustStatement
+ *           | uniqueStatement| defaultStatement| configStatement
+ *           | mandatoryStatement | minElementsStatement
+ *           | maxElementsStatement)*
+ *           RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "deviate
+ * add" rule defined in ANTLR grammar file for corresponding ABNF rule in RFC
+ * 6020.
+ */
+public final class DeviateAddListener {
+
+    //No instantiation
+    private DeviateAddListener() {
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser receives an input matching the grammar rule(deviate add).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviateAddEntry(TreeWalkListener listener,
+                                              GeneratedYangParser.DeviateAddStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_ADD, null, ENTRY);
+
+        // TODO : Validate sub-statements cardinality
+
+        Parsable curData = listener.getParsedDataStack().peek();
+        if (curData instanceof YangDeviation) {
+            YangDeviation curNode = (YangDeviation) curData;
+            YangDeviateAdd deviationAdd = new YangDeviateAdd();
+            curNode.addDeviateAdd(deviationAdd);
+            listener.getParsedDataStack().push(deviationAdd);
+        } else {
+            throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
+                                                                    DEVIATE_ADD,
+                                                                    null,
+                                                                    ENTRY));
+        }
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser exits from grammar rule (deviate add).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviateAddExit(TreeWalkListener listener,
+                                             GeneratedYangParser.DeviateAddStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_ADD, null,
+                             EXIT);
+
+        if (listener.getParsedDataStack().peek() instanceof YangDeviateAdd) {
+            listener.getParsedDataStack().pop();
+        } else {
+            throw new ParserException(constructListenerErrorMessage
+                                              (MISSING_CURRENT_HOLDER, DEVIATE_ADD,
+                                               null, EXIT));
+        }
+    }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateDeleteListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateDeleteListener.java
new file mode 100644
index 0000000..2c84791
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateDeleteListener.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.compiler.parser.impl.listeners;
+
+
+import org.onosproject.yang.compiler.datamodel.YangDeviateDelete;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_DELETE;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ *  deviate-delete-stmt = deviate-keyword sep delete-keyword optsep
+ *                        (";" /
+ *                         "{" stmtsep
+ *                             [units-stmt stmtsep]
+ *                             *(must-stmt stmtsep)
+ *                             *(unique-stmt stmtsep)
+ *                               [default-stmt stmtsep]
+ *                           "}")
+ *
+ * ANTLR grammar rule
+ *   deviateDeleteStatement: DEVIATE_KEYWORD DELETE_KEYWORD (STMTEND
+ *           | LEFT_CURLY_BRACE (unitsStatement | mustStatement |
+ *           uniqueStatement | defaultStatement)* RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "deviate
+ * delete" rule defined in ANTLR grammar file for corresponding ABNF rule in RFC
+ * 6020.
+ */
+public final class DeviateDeleteListener {
+
+    // No instantiation
+    private DeviateDeleteListener() {
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser receives an input matching the grammar rule(deviate delete).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviateDeleteEntry(TreeWalkListener listener,
+                                                 GeneratedYangParser
+                                                         .DeviateDeleteStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_DELETE,
+                             null, ENTRY);
+
+        // TODO : Validate sub-statements cardinality
+
+        Parsable curData = listener.getParsedDataStack().peek();
+        if (curData instanceof YangDeviation) {
+            YangDeviation curNode = (YangDeviation) curData;
+            YangDeviateDelete deviateDelete = new YangDeviateDelete();
+            curNode.addDeviatedelete(deviateDelete);
+            listener.getParsedDataStack().push(deviateDelete);
+        } else {
+            throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
+                                                                    DEVIATE_DELETE,
+                                                                    null,
+                                                                    ENTRY));
+        }
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser exits from grammar rule (deviate delete).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviateDeleteExit(TreeWalkListener listener,
+                                                GeneratedYangParser
+                                                        .DeviateDeleteStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_DELETE, null,
+                             EXIT);
+
+        if (listener.getParsedDataStack().peek() instanceof YangDeviateDelete) {
+            listener.getParsedDataStack().pop();
+        } else {
+            throw new ParserException(constructListenerErrorMessage
+                                              (MISSING_CURRENT_HOLDER, DEVIATE_DELETE,
+                                               null, EXIT));
+        }
+    }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateReplaceListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateReplaceListener.java
new file mode 100644
index 0000000..962aa60
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviateReplaceListener.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.compiler.parser.impl.listeners;
+
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_REPLACE;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ *   deviate-replace-stmt = deviate-keyword sep replace-keyword optsep
+ *                         (";" /
+ *                          "{" stmtsep
+ *                              [type-stmt stmtsep]
+ *                              [units-stmt stmtsep]
+ *                              [default-stmt stmtsep]
+ *                              [config-stmt stmtsep]
+ *                              [mandatory-stmt stmtsep]
+ *                              [min-elements-stmt stmtsep]
+ *                              [max-elements-stmt stmtsep]
+ *                          "}")
+ *
+ * ANTLR grammar rule
+ *   deviateReplaceStatement: DEVIATE_KEYWORD REPLACE_KEYWORD (STMTEND
+ *           | LEFT_CURLY_BRACE (typeStatement | unitsStatement
+ *           | defaultStatement | configStatement
+ *           | mandatoryStatement | minElementsStatement
+ *           | maxElementsStatement)* RIGHT_CURLY_BRACE);
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "deviate
+ * replace" rule defined in ANTLR grammar file for corresponding ABNF rule in
+ * RFC 6020.
+ */
+public final class DeviateReplaceListener {
+
+    //No instantiation
+    private DeviateReplaceListener() {
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser receives an input matching the grammar rule(deviate replace).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviateReplaceEntry(TreeWalkListener listener,
+                                                  GeneratedYangParser
+                                                          .DeviateReplaceStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_REPLACE,
+                             null, ENTRY);
+
+        // TODO : Validate sub-statements cardinality
+
+        Parsable curData = listener.getParsedDataStack().peek();
+        if (curData instanceof YangDeviation) {
+            YangDeviation curNode = (YangDeviation) curData;
+            YangDeviateReplace deviationReplace = new YangDeviateReplace();
+            curNode.addDeviateReplace(deviationReplace);
+            listener.getParsedDataStack().push(deviationReplace);
+        } else {
+            throw new ParserException(constructListenerErrorMessage
+                                              (INVALID_HOLDER,
+                                               DEVIATE_REPLACE,
+                                               null,
+                                               ENTRY));
+        }
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser exits from grammar rule (deviate replace).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviateReplaceExit(TreeWalkListener listener,
+                                                 GeneratedYangParser.DeviateReplaceStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATE_REPLACE, null,
+                             EXIT);
+
+        if (listener.getParsedDataStack().peek() instanceof YangDeviateReplace) {
+            listener.getParsedDataStack().pop();
+        } else {
+            throw new ParserException(constructListenerErrorMessage
+                                              (MISSING_CURRENT_HOLDER, DEVIATE_REPLACE,
+                                               null, EXIT));
+        }
+    }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListener.java
new file mode 100644
index 0000000..97f9be2
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListener.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.compiler.parser.impl.listeners;
+
+/*
+ * Reference: RFC6020 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC6020
+ *
+ *  deviation-stmt      = deviation-keyword sep
+ *                        deviation-arg-str optsep
+ *                        "{" stmtsep
+ *                            ;; these stmts can appear in any order
+ *                            [description-stmt stmtsep]
+ *                            [reference-stmt stmtsep]
+ *                            (deviate-not-supported-stmt /
+ *                              1*(deviate-add-stmt /
+ *                                 deviate-replace-stmt /
+ *                                 deviate-delete-stmt))
+ *                        "}"
+ *
+ * ANTLR grammar rule
+ *   deviationStatement: DEVIATION_KEYWORD deviation LEFT_CURLY_BRACE (
+ *       descriptionStatement | referenceStatement | deviateNotSupportedStatement
+ *      | deviateAddStatement | deviateReplaceStatement
+ *      | deviateDeleteStatement)* RIGHT_CURLY_BRACE;
+ */
+
+import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.YangDeviationHolder;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.linker.impl.YangResolutionInfoImpl;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import java.util.List;
+
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.DEVIATION_NODE;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.addResolutionInfo;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_ADD;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_DELETE;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_NOT_SUPPORTED;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATE_REPLACE;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DEVIATION_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerCollisionDetector.detectCollidingChildUtil;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.EXIT;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructExtendedListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_CURRENT_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.getValidAbsoluteSchemaNodeId;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.validateCardinalityMutuallyExclusive;
+
+/**
+ * Represents listener based call back function corresponding to the "deviation"
+ * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 6020.
+ */
+public final class DeviationListener {
+
+    /**
+     * Creates a new deviation listener.
+     */
+    private DeviationListener() {
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser receives an input matching the grammar rule(deviation).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviationEntry(TreeWalkListener listener,
+                                             GeneratedYangParser.DeviationStatementContext ctx) {
+
+        String deviationArg = removeQuotesAndHandleConcat(ctx.deviation().getText());
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATION_DATA,
+                             deviationArg, ENTRY);
+
+        // Validates deviation argument string
+        List<YangAtomicPath> targetNode = getValidAbsoluteSchemaNodeId(deviationArg,
+                                                                       DEVIATION_DATA, ctx);
+
+        validateSubStatementsCardinality(ctx);
+
+        // Check for identifier collision
+        int line = ctx.getStart().getLine();
+        int charPositionInLine = ctx.getStart().getCharPositionInLine();
+        detectCollidingChildUtil(listener, line, charPositionInLine,
+                                 deviationArg, DEVIATION_DATA);
+
+        Parsable curData = listener.getParsedDataStack().peek();
+        if (curData instanceof YangDeviationHolder) {
+            YangDeviation deviation = new YangDeviation(DEVIATION_NODE, null);
+            deviation.setName(deviationArg);
+            deviation.setLineNumber(line);
+            deviation.setCharPosition(charPositionInLine);
+            deviation.setFileName(listener.getFileName());
+            deviation.setTargetNode(targetNode);
+            if (!ctx.deviateNotSupportedStatement().isEmpty()) {
+                deviation.setDeviateNotSupported(true);
+            }
+            YangNode curNode = (YangNode) curData;
+            try {
+                curNode.addChild(deviation);
+                ((YangDeviationHolder) curNode).setModuleForDeviation(true);
+            } catch (DataModelException e) {
+                throw new ParserException(
+                        constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
+                                                              DEVIATION_DATA,
+                                                              deviationArg,
+                                                              ENTRY, e.getMessage()));
+            }
+            listener.getParsedDataStack().push(deviation);
+
+            // Adds resolution info to the list
+            YangResolutionInfoImpl<YangDeviation> info =
+                    new YangResolutionInfoImpl<>(deviation, deviation.getParent(),
+                                                 line, charPositionInLine);
+            addToResolution(info, ctx);
+        } else {
+            throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER,
+                                                                    DEVIATION_DATA,
+                                                                    deviationArg,
+                                                                    ENTRY));
+        }
+    }
+
+    /**
+     * Performs validation and updates the data model tree. It is called when
+     * parser exits from grammar rule (deviation).
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processDeviationExit(TreeWalkListener listener,
+                                            GeneratedYangParser.DeviationStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, DEVIATION_DATA, ctx
+                .deviation().getText(), EXIT);
+
+        if (listener.getParsedDataStack().peek() instanceof YangDeviation) {
+            listener.getParsedDataStack().pop();
+        } else {
+            throw new ParserException(constructListenerErrorMessage
+                                              (MISSING_CURRENT_HOLDER, DEVIATION_DATA,
+                                               ctx.deviation().getText(), EXIT));
+        }
+    }
+
+    /**
+     * Validates the cardinality of deviation sub-statements as per grammar.
+     *
+     * @param ctx context object of the grammar rule
+     */
+    private static void validateSubStatementsCardinality(GeneratedYangParser
+                                                                 .DeviationStatementContext ctx) {
+        validateCardinalityMaxOne(ctx.descriptionStatement(),
+                                  DESCRIPTION_DATA, DEVIATION_DATA,
+                                  ctx.deviation().getText());
+        validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA,
+                                  DEVIATION_DATA, ctx.deviation().getText());
+        validateCardinalityMaxOne(ctx.deviateNotSupportedStatement(),
+                                  DEVIATE_NOT_SUPPORTED,
+                                  DEVIATION_DATA, ctx.deviation().getText());
+        validateCardinalityMutuallyExclusive(ctx.deviateNotSupportedStatement(),
+                                             DEVIATE_NOT_SUPPORTED,
+                                             ctx.deviateAddStatement(),
+                                             DEVIATE_ADD,
+                                             DEVIATION_DATA,
+                                             ctx.deviation().getText(),
+                                             ctx);
+        validateCardinalityMutuallyExclusive(ctx.deviateNotSupportedStatement(),
+                                             DEVIATE_NOT_SUPPORTED,
+                                             ctx.deviateReplaceStatement(),
+                                             DEVIATE_REPLACE,
+                                             DEVIATION_DATA,
+                                             ctx.deviation().getText(),
+                                             ctx);
+        validateCardinalityMutuallyExclusive(ctx.deviateNotSupportedStatement(),
+                                             DEVIATE_NOT_SUPPORTED,
+                                             ctx.deviateDeleteStatement(),
+                                             DEVIATE_DELETE,
+                                             DEVIATION_DATA,
+                                             ctx.deviation().getText(),
+                                             ctx);
+    }
+
+    /**
+     * Add to resolution list.
+     *
+     * @param info resolution info
+     * @param ctx  context object
+     */
+    private static void addToResolution(YangResolutionInfoImpl<YangDeviation> info,
+                                        GeneratedYangParser.DeviationStatementContext ctx) {
+        try {
+            addResolutionInfo(info);
+        } catch (DataModelException e) {
+            throw new ParserException(constructExtendedListenerErrorMessage(
+                    UNHANDLED_PARSED_DATA, DEVIATION_DATA,
+                    ctx.deviation().getText(), EXIT, e.getMessage()));
+        }
+    }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java
index b711592..5f21154 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MandatoryListener.java
@@ -16,7 +16,7 @@
 
 package org.onosproject.yang.compiler.parser.impl.listeners;
 
-import org.onosproject.yang.compiler.datamodel.YangLeaf;
+import org.onosproject.yang.compiler.datamodel.YangMandatory;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
@@ -73,18 +73,16 @@
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, MANDATORY_DATA, "", ENTRY);
 
-        boolean isMandatory = getValidBooleanValue(ctx.mandatory().getText(), MANDATORY_DATA, ctx);
+        boolean isMandatory = getValidBooleanValue(ctx.mandatory().getText(),
+                                                   MANDATORY_DATA, ctx);
 
         Parsable tmpNode = listener.getParsedDataStack().peek();
-        switch (tmpNode.getYangConstructType()) {
-            case LEAF_DATA:
-                YangLeaf leaf = (YangLeaf) tmpNode;
-                leaf.setMandatory(isMandatory);
-                break;
-            case CHOICE_DATA: // TODO
-                break;
-            default:
-                throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, MANDATORY_DATA, "", ENTRY));
+        if (tmpNode instanceof YangMandatory) {
+            YangMandatory yangMandatory = ((YangMandatory) tmpNode);
+            yangMandatory.setMandatory(isMandatory);
+        } else {
+            throw new ParserException(constructListenerErrorMessage(
+                    INVALID_HOLDER, MANDATORY_DATA, "", ENTRY));
         }
     }
 }
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java
index ee7f1ef..f46b606 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MaxElementsListener.java
@@ -16,9 +16,8 @@
 
 package org.onosproject.yang.compiler.parser.impl.listeners;
 
-import org.onosproject.yang.compiler.datamodel.YangLeafList;
-import org.onosproject.yang.compiler.datamodel.YangList;
 import org.onosproject.yang.compiler.datamodel.YangMaxElement;
+import org.onosproject.yang.compiler.datamodel.YangMaxElementHolder;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
@@ -85,17 +84,12 @@
         maxElement.setCharPosition(ctx.getStart().getCharPositionInLine());
         maxElement.setFileName(listener.getFileName());
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getYangConstructType()) {
-            case LEAF_LIST_DATA:
-                YangLeafList leafList = (YangLeafList) tmpData;
-                leafList.setMaxElements(maxElement);
-                break;
-            case LIST_DATA:
-                YangList yangList = (YangList) tmpData;
-                yangList.setMaxElements(maxElement);
-                break;
-            default:
-                throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, MAX_ELEMENT_DATA, "", ENTRY));
+        if (tmpData instanceof YangMaxElementHolder) {
+            YangMaxElementHolder holder = ((YangMaxElementHolder) tmpData);
+            holder.setMaxElements(maxElement);
+        } else {
+            throw new ParserException(constructListenerErrorMessage(
+                    INVALID_HOLDER, MAX_ELEMENT_DATA, "", ENTRY));
         }
     }
 
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java
index ed80c4c..ed07598 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/MinElementsListener.java
@@ -16,15 +16,11 @@
 
 package org.onosproject.yang.compiler.parser.impl.listeners;
 
-import org.onosproject.yang.compiler.datamodel.YangLeafList;
-import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangMinElementHolder;
 import org.onosproject.yang.compiler.datamodel.YangMinElement;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
 
 import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MIN_ELEMENT_DATA;
 import static org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.MinElementsStatementContext;
@@ -74,9 +70,11 @@
                                                MinElementsStatementContext ctx) {
 
         // Check for stack to be non empty.
-        checkStackIsNotEmpty(listener, MISSING_HOLDER, MIN_ELEMENT_DATA, ctx.minValue().getText(), ENTRY);
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, MIN_ELEMENT_DATA,
+                             ctx.minValue().getText(), ENTRY);
 
-        int minElementValue = getValidNonNegativeIntegerValue(ctx.minValue().getText(), MIN_ELEMENT_DATA, ctx);
+        int minElementValue = getValidNonNegativeIntegerValue(
+                ctx.minValue().getText(), MIN_ELEMENT_DATA, ctx);
 
         YangMinElement minElement = new YangMinElement();
 
@@ -84,19 +82,15 @@
         minElement.setLineNumber(ctx.getStart().getLine());
         minElement.setCharPosition(ctx.getStart().getCharPositionInLine());
         minElement.setFileName(listener.getFileName());
+
         Parsable tmpData = listener.getParsedDataStack().peek();
-        switch (tmpData.getYangConstructType()) {
-            case LEAF_LIST_DATA:
-                YangLeafList leafList = (YangLeafList) tmpData;
-                leafList.setMinElements(minElement);
-                break;
-            case LIST_DATA:
-                YangList yangList = (YangList) tmpData;
-                yangList.setMinElements(minElement);
-                break;
-            default:
-                throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, MIN_ELEMENT_DATA,
-                                                                        ctx.minValue().getText(), ENTRY));
+        if (tmpData instanceof YangMinElementHolder) {
+            YangMinElementHolder holder = ((YangMinElementHolder) tmpData);
+            holder.setMinElements(minElement);
+        } else {
+            throw new ParserException(constructListenerErrorMessage(
+                    INVALID_HOLDER, MIN_ELEMENT_DATA, ctx.minValue().getText(),
+                    ENTRY));
         }
     }
 }
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java
index 346e35c..fa3a6f9 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/ModuleListener.java
@@ -35,6 +35,7 @@
 import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_IF_FEATURE;
 import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_LEAFREF;
 import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_USES;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.validateMultipleDeviationStatement;
 import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
 import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MODULE_DATA;
 import static org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.ModuleStatementContext;
@@ -148,6 +149,16 @@
             linkerException.setFileName(listener.getFileName());
             throw linkerException;
         }
+
+        /*
+         * Validate whether all deviation statement xpath is referring to same
+         * module
+         */
+        try {
+            validateMultipleDeviationStatement(module);
+        } catch (DataModelException e) {
+            throw new ParserException(e.getMessage());
+        }
     }
 
     private static void throwError(ListenerErrorType type,
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java
index 7b18d5b..f1dbf66 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListener.java
@@ -25,12 +25,8 @@
 import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorMessageConstruction;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation;
 
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.validateMultipleDeviationStatement;
 import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
 import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MODULE_DATA;
 import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.SUB_MODULE_DATA;
@@ -154,5 +150,15 @@
             linkerException.setFileName(listener.getFileName());
             throw linkerException;
         }
+
+        /*
+         * Validate whether all deviation statement xpath is referring to same
+         * module
+         */
+        try {
+            validateMultipleDeviationStatement(subModule);
+        } catch (DataModelException e) {
+            throw new ParserException(e.getMessage());
+        }
     }
 }
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java
index 0b16af7..7a23e7a 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/TypeListener.java
@@ -17,6 +17,7 @@
 package org.onosproject.yang.compiler.parser.impl.listeners;
 
 import org.onosproject.yang.compiler.datamodel.YangDerivedInfo;
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
 import org.onosproject.yang.compiler.datamodel.YangLeaf;
 import org.onosproject.yang.compiler.datamodel.YangLeafList;
 import org.onosproject.yang.compiler.datamodel.YangNode;
@@ -32,7 +33,6 @@
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
 import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
 
 import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
 import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.UNRESOLVED;
@@ -247,8 +247,10 @@
                     addToResolutionList(resolutionInfo, ctx);
                 }
                 break;
-            //TODO: deviate replacement statement.
-
+            case DEVIATE_REPLACE:
+                YangDeviateReplace replace = (YangDeviateReplace) tmpData;
+                replace.setDataType(type);
+                break;
             default:
                 throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA,
                                                                         ctx.string().getText(), EXIT));
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java
index e222422..c97d272 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UniqueListener.java
@@ -16,15 +16,12 @@
 
 package org.onosproject.yang.compiler.parser.impl.listeners;
 
-import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangUniqueHolder;
 import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil;
 
 import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.UNIQUE_DATA;
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorLocation.ENTRY;
@@ -33,6 +30,7 @@
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.INVALID_HOLDER;
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.MISSING_HOLDER;
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType.UNHANDLED_PARSED_DATA;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.SPACE;
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerUtil.removeQuotesAndHandleConcat;
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
 
@@ -70,35 +68,43 @@
                                           GeneratedYangParser.UniqueStatementContext ctx) {
 
         // Check for stack to be non empty.
-        checkStackIsNotEmpty(listener, MISSING_HOLDER, UNIQUE_DATA, ctx.unique().getText(), ENTRY);
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, UNIQUE_DATA, ctx.unique()
+                .getText(), ENTRY);
 
         Parsable tmpData = listener.getParsedDataStack().peek();
-        if (listener.getParsedDataStack().peek() instanceof YangList) {
-            YangList yangList = (YangList) tmpData;
-            String tmpUniqueValue = removeQuotesAndHandleConcat(ctx.unique().getText());
+        if (listener.getParsedDataStack().peek() instanceof YangUniqueHolder) {
+            YangUniqueHolder uniqueHolder = (YangUniqueHolder) tmpData;
+            String tmpUniqueValue = removeQuotesAndHandleConcat(
+                    ctx.unique().getText());
 
-            if (tmpUniqueValue.contains(" ")) {
-                String[] uniqueValues = tmpUniqueValue.split(" ");
+            if (tmpUniqueValue.contains(SPACE)) {
+                String[] uniqueValues = tmpUniqueValue.split(SPACE);
                 for (String uniqueValue : uniqueValues) {
                     try {
-                        yangList.addUnique(uniqueValue);
+                        uniqueHolder.addUnique(uniqueValue);
                     } catch (DataModelException e) {
-                        throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
-                                UNIQUE_DATA,
-                                ctx.unique().getText(), ENTRY, e.getMessage()));
+                        throw new ParserException(
+                                constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA,
+                                                                      UNIQUE_DATA,
+                                                                      ctx.unique().getText(),
+                                                                      ENTRY, e.getMessage()));
                     }
                 }
             } else {
                 try {
-                    yangList.addUnique(tmpUniqueValue);
+                    uniqueHolder.addUnique(tmpUniqueValue);
                 } catch (DataModelException e) {
-                    throw new ParserException(constructExtendedListenerErrorMessage(UNHANDLED_PARSED_DATA, UNIQUE_DATA,
-                            ctx.unique().getText(), ENTRY, e.getMessage()));
+                    throw new ParserException(
+                            constructExtendedListenerErrorMessage(
+                                    UNHANDLED_PARSED_DATA, UNIQUE_DATA,
+                                    ctx.unique().getText(), ENTRY, e.getMessage()));
                 }
             }
         } else {
-            throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, UNIQUE_DATA, ctx.unique().getText(),
-                    ENTRY));
+            throw new ParserException(
+                    constructListenerErrorMessage(INVALID_HOLDER, UNIQUE_DATA,
+                                                  ctx.unique().getText(),
+                                                  ENTRY));
         }
     }
 }
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java
index f8db2cf..b5eb1f7 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/UnitsListener.java
@@ -16,12 +16,15 @@
 
 package org.onosproject.yang.compiler.parser.impl.listeners;
 
+import org.onosproject.yang.compiler.datamodel.YangDeviateAdd;
+import org.onosproject.yang.compiler.datamodel.YangDeviateDelete;
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
 import org.onosproject.yang.compiler.datamodel.YangLeaf;
 import org.onosproject.yang.compiler.datamodel.YangLeafList;
+import org.onosproject.yang.compiler.datamodel.YangTypeDef;
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.parser.exceptions.ParserException;
 import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
-import org.onosproject.yang.compiler.parser.impl.parserutils.ListenerErrorType;
 
 import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.UNITS_DATA;
 import static org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.UnitsStatementContext;
@@ -78,11 +81,27 @@
                 leafList.setUnits(ctx.string().getText());
                 break;
             case TYPEDEF_DATA:
-                // TODO
+                YangTypeDef typeDef = (YangTypeDef) tmpData;
+                typeDef.setUnits(ctx.string().getText());
+                break;
+            case DEVIATE_ADD:
+                YangDeviateAdd deviateAdd = (YangDeviateAdd) tmpData;
+                deviateAdd.setUnits(ctx.string().getText());
+                break;
+            case DEVIATE_DELETE:
+                YangDeviateDelete deviateDelete = (YangDeviateDelete) tmpData;
+                deviateDelete.setUnits(ctx.string().getText());
+                break;
+            case DEVIATE_REPLACE:
+                YangDeviateReplace replace = (YangDeviateReplace) tmpData;
+                replace.setUnits(ctx.string().getText());
                 break;
             default:
-                throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, UNITS_DATA,
-                                ctx.string().getText(), ENTRY));
+                throw new ParserException(
+                        constructListenerErrorMessage(INVALID_HOLDER,
+                                                      UNITS_DATA,
+                                                      ctx.string().getText(),
+                                                      ENTRY));
         }
     }
 }
\ No newline at end of file
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java
index e71eb98..328b6bc 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerUtil.java
@@ -90,6 +90,7 @@
     private static final String DATE_FORMAT = "yyyy-MM-dd";
     private static final String REGEX_EQUAL = "[=]";
     private static final String REGEX_OPEN_BRACE = "[(]";
+    public static final String SPACE = " ";
 
     // No instantiation.
     private ListenerUtil() {
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java
index eeb1dc9..4b45fcd 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/parserutils/ListenerValidation.java
@@ -240,4 +240,38 @@
             throw parserException;
         }
     }
+
+    /**
+     * Checks if a either of one construct occurrence.
+     *
+     * @param ctx1       first optional child's context
+     * @param type1      first child construct for whom cardinality is
+     *                   to be validated
+     * @param ctx2       second optional child's context
+     * @param type2      second child construct for whom cardinality is
+     *                   to be validated
+     * @param type       parent construct
+     * @param parentName parent name
+     * @param ctx        parents's context
+     * @throws ParserException exception if cardinality check fails
+     */
+    public static void validateCardinalityMutuallyExclusive(List<?> ctx1,
+                                                            YangConstructType type1,
+                                                            List<?> ctx2,
+                                                            YangConstructType type2,
+                                                            YangConstructType type,
+                                                            String parentName,
+                                                            ParserRuleContext ctx)
+            throws ParserException {
+
+        if (!ctx1.isEmpty() && !ctx2.isEmpty()) {
+            String error = "YANG file error: Either " + getYangConstructType(type1)
+                    + " or " + getYangConstructType(type2) + " should be present in "
+                    + getYangConstructType(type) + " " + parentName + ".";
+            ParserException parserException = new ParserException(error);
+            parserException.setLine(ctx.getStart().getLine());
+            parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
+            throw parserException;
+        }
+    }
 }
diff --git a/compiler/base/parser/src/main/resources/GeneratedYang.g4 b/compiler/base/parser/src/main/resources/GeneratedYang.g4
index 3ba1201..af16c05 100644
--- a/compiler/base/parser/src/main/resources/GeneratedYang.g4
+++ b/compiler/base/parser/src/main/resources/GeneratedYang.g4
@@ -1207,9 +1207,12 @@
      *                             [max-elements-stmt stmtsep]
      *                         "}")
      */
-    deviateAddStatement: DEVIATE_KEYWORD ADD_KEYWORD (STMTEND | (LEFT_CURLY_BRACE unitsStatement? mustStatement* uniqueStatement*
-                      defaultStatement? configStatement? mandatoryStatement? minElementsStatement? maxElementsStatement?
-                      RIGHT_CURLY_BRACE));
+    deviateAddStatement: DEVIATE_KEYWORD ADD_KEYWORD (STMTEND
+                       | LEFT_CURLY_BRACE (unitsStatement | mustStatement
+                         | uniqueStatement| defaultStatement| configStatement
+                         | mandatoryStatement | minElementsStatement
+                         | maxElementsStatement)*
+                       RIGHT_CURLY_BRACE);
 
     /**
      *  deviate-delete-stmt = deviate-keyword sep delete-keyword optsep
@@ -1222,7 +1225,8 @@
      *                           "}")
      */
     deviateDeleteStatement: DEVIATE_KEYWORD DELETE_KEYWORD (STMTEND
-                       | (LEFT_CURLY_BRACE  unitsStatement? mustStatement* uniqueStatement* defaultStatement? RIGHT_CURLY_BRACE));
+                       | LEFT_CURLY_BRACE (unitsStatement | mustStatement |
+                       uniqueStatement | defaultStatement)* RIGHT_CURLY_BRACE);
 
     /**
      *   deviate-replace-stmt = deviate-keyword sep replace-keyword optsep
@@ -1237,9 +1241,11 @@
      *                              [max-elements-stmt stmtsep]
      *                          "}")
      */
-    deviateReplaceStatement: DEVIATE_KEYWORD REPLACE_KEYWORD (STMTEND | (LEFT_CURLY_BRACE typeStatement? unitsStatement?
-                           defaultStatement? configStatement? mandatoryStatement? minElementsStatement?
-                           maxElementsStatement? RIGHT_CURLY_BRACE));
+    deviateReplaceStatement: DEVIATE_KEYWORD REPLACE_KEYWORD (STMTEND
+                           | LEFT_CURLY_BRACE (typeStatement | unitsStatement
+                             | defaultStatement | configStatement
+                             | mandatoryStatement | minElementsStatement
+                             | maxElementsStatement)* RIGHT_CURLY_BRACE);
 
     /**
      *   compiler-annotation-stmt = prefix:compiler-annotation-keyword string
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListenerTest.java
new file mode 100644
index 0000000..cca24d1
--- /dev/null
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/DeviationListenerTest.java
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.compiler.parser.impl.listeners;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
+import org.onosproject.yang.compiler.datamodel.YangDeviateAdd;
+import org.onosproject.yang.compiler.datamodel.YangDeviateDelete;
+import org.onosproject.yang.compiler.datamodel.YangDeviateReplace;
+import org.onosproject.yang.compiler.datamodel.YangDeviation;
+import org.onosproject.yang.compiler.datamodel.YangModule;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
+
+import java.io.IOException;
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.MODULE_NODE;
+import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.UNRESOLVED;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.INT8;
+
+/**
+ * Test cases for testing deviation listener.
+ */
+public class DeviationListenerTest {
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
+    private final YangUtilsParserManager manager = new YangUtilsParserManager();
+
+    /**
+     * Checks deviation statement as sub-statement of module.
+     */
+    @Test
+    public void processDeviationNotSupported() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel("src/test/resources/" +
+                                                     "ValidDeviationNotSupported.yang");
+
+        assertThat((node instanceof YangModule), is(true));
+
+        // Check whether the node type is set properly to module.
+        assertThat(node.getNodeType(), is(MODULE_NODE));
+
+        // Check whether the module name is set correctly.
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        // Check whether the container is child of module
+        YangDeviation deviation = (YangDeviation) yangNode.getChild();
+        assertThat(deviation.getName(), is("/base:system/base:daytime"));
+        assertThat(deviation.getDescription(), is("\"desc\""));
+        assertThat(deviation.getReference(), is("\"ref\""));
+        assertThat(deviation.isDeviateNotSupported(), is(true));
+        List<YangAtomicPath> targetNode = deviation.getTargetNode();
+        assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+                   is("system"));
+        assertThat(targetNode.get(1).getNodeIdentifier().getName(),
+                   is("daytime"));
+        assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+                   is("base"));
+        assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+    }
+
+    /**
+     * Checks deviation add statement as sub-statement of module.
+     */
+    @Test
+    public void processDeviationAddStatement() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel("src/test/resources/" +
+                                                     "ValidDeviateAdd.yang");
+
+        assertThat((node instanceof YangModule), is(true));
+        assertThat(node.getNodeType(), is(MODULE_NODE));
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        YangDeviation deviation = (YangDeviation) yangNode.getChild();
+        assertThat(deviation.getName(), is("/base:system/base:user/base:type"));
+        assertThat(deviation.isDeviateNotSupported(), is(false));
+        List<YangAtomicPath> targetNode = deviation.getTargetNode();
+        assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+                   is("system"));
+        assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+                   is("base"));
+        assertThat(targetNode.get(1).getNodeIdentifier().getName(),
+                   is("user"));
+        assertThat(targetNode.get(2).getNodeIdentifier().getName(),
+                   is("type"));
+
+        YangDeviateAdd deviateAdd = deviation.getDeviateAdd().get(0);
+        assertThat(deviateAdd.getUnits(), is("\"units\""));
+        assertThat(deviateAdd.getListOfMust().get(0).getConstraint(),
+                   is("/base:system"));
+        assertThat(deviateAdd.getUniqueList().get(0), is("id"));
+        assertThat(deviateAdd.getDefaultValueInString(), is("admin"));
+        assertThat(deviateAdd.isConfig(), is(true));
+        assertThat(deviateAdd.isMandatory(), is(true));
+        assertThat(deviateAdd.getMinElements().getMinElement(), is(0));
+        assertThat(deviateAdd.getMaxElements().getMaxElement(), is(12343));
+        assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+    }
+
+    /**
+     * Checks deviation delete statement as sub-statement of module.
+     */
+    @Test
+    public void processDeviationDeleteStatement() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel("src/test/resources/" +
+                                                     "ValidDeviateDelete.yang");
+
+        assertThat((node instanceof YangModule), is(true));
+        assertThat(node.getNodeType(), is(MODULE_NODE));
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        YangDeviation deviation = (YangDeviation) yangNode.getChild();
+        assertThat(deviation.getName(), is("/base:system"));
+        assertThat(deviation.isDeviateNotSupported(), is(false));
+        List<YangAtomicPath> targetNode = deviation.getTargetNode();
+        assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+                   is("system"));
+        assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+                   is("base"));
+
+        YangDeviateDelete deviateDelete = deviation.getDeviateDelete().get(0);
+        assertThat(deviateDelete.getUnits(), is("\"units\""));
+        assertThat(deviateDelete.getListOfMust().get(0).getConstraint(),
+                   is("daytime or time"));
+        assertThat(deviateDelete.getUniqueList().get(0), is("id"));
+        assertThat(deviateDelete.getDefaultValueInString(), is("defaultValue"));
+        assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+    }
+
+    /**
+     * Checks deviation replace statement as sub-statement of module.
+     */
+    @Test
+    public void processDeviationReplaceStatement() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel("src/test/resources/" +
+                                                     "ValidDeviateReplace.yang");
+
+        assertThat((node instanceof YangModule), is(true));
+        assertThat(node.getNodeType(), is(MODULE_NODE));
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        YangDeviation deviation = (YangDeviation) yangNode.getChild();
+        assertThat(deviation.getName(), is("/base:system/base:name-server"));
+        assertThat(deviation.isDeviateNotSupported(), is(false));
+        List<YangAtomicPath> targetNode = deviation.getTargetNode();
+        assertThat(targetNode.get(0).getNodeIdentifier().getName(),
+                   is("system"));
+        assertThat(targetNode.get(0).getNodeIdentifier().getPrefix(),
+                   is("base"));
+        assertThat(targetNode.get(1).getNodeIdentifier().getName(),
+                   is("name-server"));
+
+        YangDeviateReplace replace = deviation.getDeviateReplace().get(0);
+        assertThat(replace.getDataType().getDataType(), is(INT8));
+        assertThat(replace.getUnits(), is("\"units\""));
+        assertThat(replace.getDefaultValueInString(), is("0"));
+        assertThat(replace.isConfig(), is(true));
+        assertThat(replace.isMandatory(), is(true));
+        assertThat(replace.getMinElements().getMinElement(), is(0));
+        assertThat(replace.getMaxElements().getMaxElement(), is(3));
+        assertThat(deviation.getResolvableStatus(), is(UNRESOLVED));
+    }
+
+    /**
+     * Checks deviation unsupported statement and deviate add as
+     * sub-statement of module.
+     */
+    @Test
+    public void processInvalidDeviateStatement() throws
+            IOException, ParserException {
+        String error = "YANG file error: Either deviate-not-supported-stmt or" +
+                " deviate-replace should be present in deviation" +
+                " /base:system/base:daytime";
+        thrown.expect(ParserException.class);
+        thrown.expectMessage(error);
+        YangNode node = manager.getDataModel("src/test/resources/InvalidDeviateStatement.yang");
+    }
+}
+
diff --git a/compiler/base/parser/src/test/resources/InvalidDeviateStatement.yang b/compiler/base/parser/src/test/resources/InvalidDeviateStatement.yang
new file mode 100644
index 0000000..9068050
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/InvalidDeviateStatement.yang
@@ -0,0 +1,19 @@
+module Test {
+    yang-version 1;
+    namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+    prefix On;
+    deviation /base:system/base:daytime {
+        description "desc";
+        reference "ref";
+        deviate not-supported;
+        deviate replace {
+            type int8;
+            units "units";
+            default "0";
+            config "true";
+            mandatory "true";
+            min-elements 0;
+            max-elements 3;
+        }
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviateAdd.yang b/compiler/base/parser/src/test/resources/ValidDeviateAdd.yang
new file mode 100644
index 0000000..7915d54
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviateAdd.yang
@@ -0,0 +1,17 @@
+module Test {
+    yang-version 1;
+    namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+    prefix On;
+    deviation /base:system/base:user/base:type {
+        deviate add {
+            units "units";
+            must "/base:system";
+            unique "id";
+            default "admin";
+            config "true";
+            mandatory "true";
+            min-elements "0";
+            max-elements "12343";
+        }
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviateDelete.yang b/compiler/base/parser/src/test/resources/ValidDeviateDelete.yang
new file mode 100644
index 0000000..767f3de
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviateDelete.yang
@@ -0,0 +1,13 @@
+module Test {
+    yang-version 1;
+    namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+    prefix On;
+    deviation "/base:system" {
+        deviate delete {
+           units "units";
+           must "daytime or time";
+           unique "id";
+           default "defaultValue";
+        }
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviateReplace.yang b/compiler/base/parser/src/test/resources/ValidDeviateReplace.yang
new file mode 100644
index 0000000..dc7f0fb
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviateReplace.yang
@@ -0,0 +1,16 @@
+module Test {
+    yang-version 1;
+    namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+    prefix On;
+    deviation /base:system/base:name-server {
+        deviate replace {
+            type int8;
+            units "units";
+            default "0";
+            config "true";
+            mandatory "true";
+            min-elements 0;
+            max-elements 3;
+        }
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ValidDeviationNotSupported.yang b/compiler/base/parser/src/test/resources/ValidDeviationNotSupported.yang
new file mode 100644
index 0000000..979f29f
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ValidDeviationNotSupported.yang
@@ -0,0 +1,10 @@
+module Test {
+    yang-version 1;
+    namespace urn:ietf:params:xml:ns:yang:ietf-ospf;
+    prefix On;
+    deviation /base:system/base:daytime {
+        description "desc";
+        reference "ref";
+        deviate not-supported;
+    }
+}