diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java
new file mode 100644
index 0000000..9a8ba06
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangAnydata.java
@@ -0,0 +1,375 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.datamodel;
+
+import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.SchemaContext;
+import org.onosproject.yang.model.SchemaId;
+import org.onosproject.yang.model.SingleInstanceNodeContext;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.E_ID;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.FMT_NOT_EXIST;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.errorMsg;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getNodeIdFromSchemaId;
+
+/*-
+ * Reference RFC 7950.
+ *
+ * The "anydata" statement defines an interior node in the schema tree.
+ * It takes one argument, which is an identifier, followed by a block of
+ * substatements that holds detailed anydata information.
+ *
+ * The "anydata" statement is used to represent an unknown set of nodes
+ * that can be modeled with YANG, except anyxml, but for which the data
+ * model is not known at module design time.  It is possible, though not
+ * required, for the data model for anydata content to become known
+ * through protocol signaling or other means that are outside the scope
+ * of this document.
+ *
+ * An example of where anydata can be useful is a list of received
+ * notifications where the specific notifications are not known at
+ * design time.
+ *
+ * An anydata node exists in zero or one instance in the data tree.
+ * An implementation may or may not know the data model used to model a
+ * specific instance of an anydata node.
+ *
+ * Since the use of anydata limits the manipulation of the content, the
+ * "anydata" statement SHOULD NOT be used to define configuration data.
+.*
+ * The anydata's Substatements
+ *
+ *               +--------------+---------+-------------+
+ *               | substatement | section | cardinality |
+ *               +--------------+---------+-------------+
+ *               | config       | 7.21.1  | 0..1        |
+ *               | description  | 7.21.3  | 0..1        |
+ *               | if-feature   | 7.20.2  | 0..n        |
+ *               | mandatory    | 7.6.5   | 0..1        |
+ *               | must         | 7.5.3   | 0..n        |
+ *               | reference    | 7.21.4  | 0..1        |
+ *               | status       | 7.21.2  | 0..1        |
+ *               | when         | 7.21.5  | 0..1        |
+ *               +--------------+---------+-------------+
+ */
+
+/**
+ * Represents data model node to maintain information defined in YANG anydata.
+ */
+public abstract class YangAnydata
+        extends YangNode
+        implements YangConfig, YangIfFeatureHolder, YangMandatory,
+        YangMustHolder, YangWhenHolder, YangCommonInfo, Parsable,
+        CollisionDetector, YangIsFilterContentNodes,
+        SingleInstanceNodeContext, SchemaDataNode {
+
+    private static final long serialVersionUID = -4962764560367658905L;
+
+    /**
+     * If anydata maintains config data.
+     */
+    private boolean isConfig;
+
+    /**
+     * Description of anydata.
+     */
+    private String description;
+
+    /**
+     * List of if-feature.
+     */
+    private List<YangIfFeature> ifFeatureList;
+
+    /**
+     * If anydata maintains mandatory data.
+     */
+    private boolean isMandatory;
+
+    /**
+     * List of must statement constraints.
+     */
+    private List<YangMust> mustConstraintList;
+
+    /**
+     * Reference of the module.
+     */
+    private String reference;
+
+    /**
+     * Status of the node.
+     */
+    private YangStatusType status = YangStatusType.CURRENT;
+
+    /**
+     * When data of the node.
+     */
+    private YangWhen when;
+
+    /**
+     * Create a anydata node.
+     */
+    public YangAnydata() {
+        super(YangNodeType.ANYDATA_NODE, new HashMap<>(),
+              DataNode.Type.SINGLE_INSTANCE_NODE);
+        mustConstraintList = new LinkedList<>();
+        ifFeatureList = new LinkedList<>();
+    }
+
+    @Override
+    public void addToChildSchemaMap(YangSchemaNodeIdentifier schemaNodeIdentifier,
+                                    YangSchemaNodeContextInfo yangSchemaNodeContextInfo) {
+        getYsnContextInfoMap().put(schemaNodeIdentifier, yangSchemaNodeContextInfo);
+    }
+
+    @Override
+    public void incrementMandatoryChildCount() {
+        // TODO
+    }
+
+    @Override
+    public void addToDefaultChildMap(YangSchemaNodeIdentifier yangSchemaNodeIdentifier, YangSchemaNode yangSchemaNode) {
+        // TODO
+    }
+
+    @Override
+    public YangSchemaNodeType getYangSchemaNodeType() {
+        return YangSchemaNodeType.YANG_SINGLE_INSTANCE_NODE;
+    }
+
+    /**
+     * Returns the when.
+     *
+     * @return the when
+     */
+    @Override
+    public YangWhen getWhen() {
+        return when;
+    }
+
+    /**
+     * Sets the when.
+     *
+     * @param when the when to set
+     */
+    @Override
+    public void setWhen(YangWhen when) {
+        this.when = when;
+    }
+
+    /**
+     * Returns the config flag.
+     *
+     * @return the isConfig
+     */
+    @Override
+    public boolean isConfig() {
+        return isConfig;
+    }
+
+    /**
+     * Sets the config flag.
+     *
+     * @param isConfig the config flag
+     */
+    @Override
+    public void setConfig(boolean isConfig) {
+        this.isConfig = isConfig;
+    }
+
+    /**
+     * Returns the description.
+     *
+     * @return the description
+     */
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * Sets the description.
+     *
+     * @param description set the description
+     */
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * Returns the textual reference.
+     *
+     * @return the reference
+     */
+    @Override
+    public String getReference() {
+        return reference;
+    }
+
+    /**
+     * Sets the textual reference.
+     *
+     * @param reference the reference to set
+     */
+    @Override
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * Returns the status.
+     *
+     * @return the status
+     */
+    @Override
+    public YangStatusType getStatus() {
+        return status;
+    }
+
+    /**
+     * Sets the status.
+     *
+     * @param status the status to set
+     */
+    @Override
+    public void setStatus(YangStatusType status) {
+        this.status = status;
+    }
+
+    /**
+     * Returns the type of the data.
+     *
+     * @return returns ANYDATA_DATA
+     */
+    @Override
+    public YangConstructType getYangConstructType() {
+        return YangConstructType.ANYDATA_DATA;
+    }
+
+    /**
+     * Validates the data on entering the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules
+     */
+    @Override
+    public void validateDataOnEntry()
+            throws DataModelException {
+        // TODO auto-generated method stub, to be implemented by parser
+    }
+
+    /**
+     * Validates the data on exiting the corresponding parse tree node.
+     *
+     * @throws DataModelException a violation of data model rules
+     */
+    @Override
+    public void validateDataOnExit()
+            throws DataModelException {
+        // TODO runtime validation is required.
+    }
+
+    @Override
+    public void detectCollidingChild(String identifierName,
+                                     YangConstructType dataType)
+            throws DataModelException {
+        // Asks helper to detect colliding child.
+        detectCollidingChildUtil(identifierName, dataType, this);
+    }
+
+    @Override
+    public void detectSelfCollision(String identifierName,
+                                    YangConstructType dataType)
+            throws DataModelException {
+        if (getName().equals(identifierName)) {
+            throw new DataModelException(
+                    "YANG file error: Duplicate input identifier detected," +
+                            " same as container \"" +
+                            getName() + " in " +
+                            getLineNumber() + " at " +
+                            getCharPosition() +
+                            " in " + getFileName() + "\"");
+        }
+    }
+
+    @Override
+    public List<YangIfFeature> getIfFeatureList() {
+        return ifFeatureList;
+    }
+
+    @Override
+    public void addIfFeatureList(YangIfFeature ifFeature) {
+        ifFeatureList.add(ifFeature);
+    }
+
+    @Override
+    public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
+        this.ifFeatureList = ifFeatureList;
+    }
+
+    @Override
+    public List<YangMust> getListOfMust() {
+        return mustConstraintList;
+    }
+
+    @Override
+    public void setListOfMust(List<YangMust> mustConstraintList) {
+        this.mustConstraintList = mustConstraintList;
+    }
+
+    @Override
+    public boolean isMandatory() {
+        return isMandatory;
+    }
+
+    @Override
+    public void setMandatory(boolean isReq) {
+        isMandatory = isReq;
+    }
+
+    @Override
+    public void addMust(YangMust must) {
+        mustConstraintList.add(must);
+    }
+
+    @Override
+    public SchemaContext getChildContext(SchemaId schemaId) {
+        checkNotNull(schemaId, E_ID);
+        YangSchemaNodeIdentifier id = getNodeIdFromSchemaId(
+                schemaId, getNameSpace().getModuleNamespace());
+        try {
+            YangSchemaNode node = getChildSchema(id).getSchemaNode();
+            if (node instanceof SchemaDataNode) {
+                return node;
+            } else {
+                throw new IllegalArgumentException(errorMsg(FMT_NOT_EXIST,
+                                                            schemaId.name(),
+                                                            getName()));
+            }
+        } catch (DataModelException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
index 17ac363..937d9f7 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
@@ -92,7 +92,7 @@
         implements YangLeavesHolder, YangDesc, YangReference, Parsable,
         CollisionDetector, YangReferenceResolver, RpcNotificationContainer,
         YangFeatureHolder, YangIsFilterContentNodes, YangNamespace,
-        YangDeviationHolder {
+        YangDeviationHolder, YangVersionHolder {
 
     private static final long serialVersionUID = 806201610L;
 
@@ -170,7 +170,7 @@
     /**
      * YANG version.
      */
-    private byte version;
+    private String version;
 
     /*-
      * Reference RFC 6020.
@@ -639,7 +639,7 @@
      *
      * @return the version
      */
-    public byte getVersion() {
+    public String getVersion() {
         return version;
     }
 
@@ -648,7 +648,7 @@
      *
      * @param version the version to set
      */
-    public void setVersion(byte version) {
+    public void setVersion(String version) {
         this.version = version;
     }
 
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
index a37d262..842bca1 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNode.java
@@ -29,6 +29,7 @@
 import static org.onosproject.yang.compiler.datamodel.TraversalType.CHILD;
 import static org.onosproject.yang.compiler.datamodel.TraversalType.PARENT;
 import static org.onosproject.yang.compiler.datamodel.TraversalType.SIBLING;
+import static org.onosproject.yang.compiler.datamodel.YangNodeType.ANYDATA_NODE;
 import static org.onosproject.yang.compiler.datamodel.YangNodeType.RPC_NODE;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.addUnresolvedAugment;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.cloneListOfLeaf;
@@ -1027,8 +1028,8 @@
         if (this instanceof SchemaDataNode) {
             parentContext = getParentSchemaContext(this.getParent());
 
-            // As rpc node is not leaf holder
-            if (this.nodeType != RPC_NODE) {
+            // As rpc and anydata node is not leaf holder
+            if (nodeType != RPC_NODE && nodeType != ANYDATA_NODE) {
                 ((YangLeavesHolder) this).setLeafParentContext();
             }
             // setting the schema Id
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java
index 190d85c..9bf0b88 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangNodeType.java
@@ -117,5 +117,10 @@
     /**
      * Deviation node.
      */
-    DEVIATION_NODE
+    DEVIATION_NODE,
+
+    /**
+     * Anydata node.
+     */
+    ANYDATA_NODE
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
index 42173f4..5c80900 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangSubModule.java
@@ -102,7 +102,7 @@
         implements YangLeavesHolder, YangDesc, YangReference, Parsable,
         CollisionDetector, YangReferenceResolver, RpcNotificationContainer,
         YangFeatureHolder, YangIsFilterContentNodes, YangNamespace,
-        YangDeviationHolder {
+        YangDeviationHolder, YangVersionHolder {
 
     private static final long serialVersionUID = 806201614L;
 
@@ -170,7 +170,7 @@
     /**
      * YANG version.
      */
-    private byte version;
+    private String version;
 
     /**
      * Prefix of parent module.
@@ -625,7 +625,7 @@
      *
      * @return the version
      */
-    public byte getVersion() {
+    public String getVersion() {
         return version;
     }
 
@@ -634,7 +634,7 @@
      *
      * @param version the version to set
      */
-    public void setVersion(byte version) {
+    public void setVersion(String version) {
         this.version = version;
     }
 
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java
new file mode 100644
index 0000000..a6f7233
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangVersionHolder.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.datamodel;
+
+/**
+ * Abstraction of YANG version entity. It is used categories the node which
+ * can hold the YANG version
+ */
+public interface YangVersionHolder {
+
+    /**
+     * Returns the version.
+     *
+     * @return the version
+     */
+    String getVersion();
+}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/javadatamodel/YangJavaAnydata.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/javadatamodel/YangJavaAnydata.java
new file mode 100644
index 0000000..3ff05d6
--- /dev/null
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/javadatamodel/YangJavaAnydata.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.datamodel.javadatamodel;
+
+import org.onosproject.yang.compiler.datamodel.YangAnydata;
+
+/**
+ * Represents YANG java anydata.
+ */
+public class YangJavaAnydata extends YangAnydata {
+
+    private static final long serialVersionUID = 208201434L;
+
+    protected JavaFileInfo javaFileInfo;
+
+    /**
+     * Returns java file info.
+     *
+     * @return java file info
+     */
+    public JavaFileInfo getJavaFileInfo() {
+        return javaFileInfo;
+    }
+
+    @Override
+    public String getJavaPackage() {
+        return getJavaFileInfo().getPackage();
+    }
+
+    @Override
+    public String getJavaClassNameOrBuiltInType() {
+        return getJavaFileInfo().getJavaName();
+    }
+
+    @Override
+    public String getJavaAttributeName() {
+        return getJavaFileInfo().getJavaAttributeName();
+    }
+}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java
index 28e7707..a196c2b 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/YangConstructType.java
@@ -437,7 +437,12 @@
     /**
      * Identifies unknown statement data.
      */
-    UNKNOWN_STATEMENT;
+    UNKNOWN_STATEMENT,
+
+    /**
+     * Identifies the YANG anydata element parsed data.
+     */
+    ANYDATA_DATA;
 
     /**
      * Returns the YANG construct keyword corresponding to enum values.
@@ -616,6 +621,8 @@
                 return "deviate-replace";
             case UNKNOWN_STATEMENT:
                 return "unknown-statement";
+            case ANYDATA_DATA:
+                return "anydata";
             default:
                 return "yang";
         }
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java
index cc7c0dc..432a122 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/antlrgencode/GeneratedYangListener.java
@@ -1758,4 +1758,18 @@
      * @param currentContext current context in the parsed tree
      */
     void exitUnknown2(Unknown2Context currentContext);
+    /**
+     * Enters a parse tree produced by GeneratedYangParser for grammar rule
+     * anydataStatement.
+     *
+     * @param currentContext current context in the parsed tree
+     */
+    void enterAnydataStatement(AnydataStatementContext currentContext);
+    /**
+     * Exits a parse tree produced by GeneratedYangParser for grammar rule
+     * anydataStatement.
+     *
+     * @param currentContext current context in the parsed tree
+     */
+    void exitAnydataStatement(AnydataStatementContext currentContext);
 }
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 dba4193..749843f 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
@@ -23,6 +23,8 @@
 import org.onosproject.yang.compiler.datamodel.utils.Parsable;
 import org.onosproject.yang.compiler.datamodel.utils.YangConstructType;
 import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangListener;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.AnydataStatementContext;
+import org.onosproject.yang.compiler.parser.impl.listeners.AnydataListener;
 import org.onosproject.yang.compiler.parser.impl.listeners.AppDataStructureListener;
 import org.onosproject.yang.compiler.parser.impl.listeners.AppExtendedNameListener;
 import org.onosproject.yang.compiler.parser.impl.listeners.ArgumentListener;
@@ -1952,4 +1954,14 @@
     public void exitUnknown2(Unknown2Context currentContext) {
         // do nothing
     }
+
+    @Override
+    public void enterAnydataStatement(AnydataStatementContext ctx) {
+        AnydataListener.processAnydataEntry(this, ctx);
+    }
+
+    @Override
+    public void exitAnydataStatement(AnydataStatementContext ctx) {
+        AnydataListener.processAnydataExit(this, ctx);
+    }
 }
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListener.java
new file mode 100644
index 0000000..b75cdf2
--- /dev/null
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListener.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.YangAnydata;
+import org.onosproject.yang.compiler.datamodel.YangAugment;
+import org.onosproject.yang.compiler.datamodel.YangCase;
+import org.onosproject.yang.compiler.datamodel.YangContainer;
+import org.onosproject.yang.compiler.datamodel.YangGrouping;
+import org.onosproject.yang.compiler.datamodel.YangInput;
+import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangModule;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangNotification;
+import org.onosproject.yang.compiler.datamodel.YangOutput;
+import org.onosproject.yang.compiler.datamodel.YangSubModule;
+import org.onosproject.yang.compiler.datamodel.YangVersionHolder;
+import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
+import org.onosproject.yang.compiler.datamodel.utils.Parsable;
+import org.onosproject.yang.compiler.parser.antlrgencode.GeneratedYangParser.AnydataStatementContext;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.TreeWalkListener;
+
+import static org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage.JAVA_GENERATION;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.ANYDATA_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.CONFIG_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.DESCRIPTION_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.MANDATORY_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.REFERENCE_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.STATUS_DATA;
+import static org.onosproject.yang.compiler.datamodel.utils.YangConstructType.WHEN_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.getValidIdentifier;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.getParentNodeConfig;
+import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.validateCardinalityMaxOne;
+import static org.onosproject.yang.compiler.translator.tojava.YangDataModelFactory.getYangAnydataNode;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE_DOT_ONE;
+
+/*
+ * Reference: RFC7950 and YANG ANTLR Grammar
+ *
+ * ABNF grammar as per RFC7950
+ * anydata-stmt        = anydata-keyword sep identifier-arg-str optsep
+ *                       (";" /
+ *                        "{" stmtsep
+ *                            ;; these stmts can appear in any order
+ *                            [when-stmt]
+ *                            *if-feature-stmt
+ *                            *must-stmt
+ *                            [config-stmt]
+ *                            [mandatory-stmt]
+ *                            [status-stmt]
+ *                            [description-stmt]
+ *                            [reference-stmt]
+ *                         "}") stmtsep
+ *
+ * ANTLR grammar rule
+ *  anydataStatement : ANYDATA_KEYWORD identifier (STMTEND |
+ *             LEFT_CURLY_BRACE stmtSep (whenStatement | ifFeatureStatement
+ *             | mustStatement | configStatement | mandatoryStatement
+ *             | statusStatement | descriptionStatement | referenceStatement)*
+ *             RIGHT_CURLY_BRACE) stmtSep;
+ */
+
+/**
+ * Represents listener based call back function corresponding to the "anydata"
+ * rule defined in ANTLR grammar file for corresponding ABNF rule in RFC 7950.
+ */
+public final class AnydataListener {
+
+    /**
+     * Creates a new anydata listener.
+     */
+    private AnydataListener() {
+    }
+
+    /**
+     * It is called when parser receives an input matching the grammar rule
+     * (anydata), performs validation and updates the data model tree.
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processAnydataEntry(TreeWalkListener listener,
+                                           AnydataStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, ANYDATA_DATA, ctx.identifier()
+                .getText(), ENTRY);
+
+        String identifier = getValidIdentifier(ctx.identifier().getText(), ANYDATA_DATA, ctx);
+
+        // Validate sub statement cardinality.
+        validateSubStatementsCardinality(ctx);
+
+        // Check for identifier collision
+        int line = ctx.getStart().getLine();
+        int charPositionInLine = ctx.getStart().getCharPositionInLine();
+        detectCollidingChildUtil(listener, line, charPositionInLine, identifier, ANYDATA_DATA);
+
+        YangAnydata anyData = getYangAnydataNode(JAVA_GENERATION);
+        anyData.setName(identifier);
+
+        anyData.setLineNumber(line);
+        anyData.setCharPosition(charPositionInLine);
+        anyData.setFileName(listener.getFileName());
+        /*
+         * If "config" is not specified, the default is the same as the parent
+         * schema node's "config" value.
+         */
+        if (ctx.configStatement().isEmpty()) {
+            boolean parentConfig = getParentNodeConfig(listener);
+            anyData.setConfig(parentConfig);
+        }
+
+        Parsable curData = listener.getParsedDataStack().peek();
+        // Module/Submodule yang version check to make sure anydata supported
+        // version
+        if (!((YangVersionHolder) listener.getParsedDataStack().get(0))
+                .getVersion().equals(ONE_DOT_ONE)) {
+            throw new ParserException("YANG file error : anydata with name " + ctx.identifier()
+                    .getText() + " at line number " + line + " in " + listener
+                    .getFileName() + " is feature of YANG version 1.1");
+        }
+        if (curData instanceof YangModule || curData instanceof YangSubModule
+                || curData instanceof YangContainer || curData instanceof YangList
+                || curData instanceof YangCase || curData instanceof YangNotification
+                || curData instanceof YangInput || curData instanceof YangOutput
+                || curData instanceof YangAugment || curData instanceof YangGrouping) {
+            YangNode curNode = (YangNode) curData;
+            try {
+                curNode.addChild(anyData);
+            } catch (DataModelException e) {
+                throw new ParserException(constructExtendedListenerErrorMessage(
+                        UNHANDLED_PARSED_DATA, ANYDATA_DATA,
+                        ctx.identifier().getText(), ENTRY, e.getMessage()));
+            }
+            listener.getParsedDataStack().push(anyData);
+        } else {
+            throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, ANYDATA_DATA,
+                                                                    ctx.identifier().getText(), ENTRY));
+        }
+    }
+
+    /**
+     * It is called when parser exits from grammar rule (anydata), it perform
+     * validations and updates the data model tree.
+     *
+     * @param listener listener's object
+     * @param ctx      context object of the grammar rule
+     */
+    public static void processAnydataExit(TreeWalkListener listener,
+                                          AnydataStatementContext ctx) {
+
+        // Check for stack to be non empty.
+        checkStackIsNotEmpty(listener, MISSING_HOLDER, ANYDATA_DATA, ctx.identifier().getText(), EXIT);
+
+        if (listener.getParsedDataStack().peek() instanceof YangAnydata) {
+            listener.getParsedDataStack().pop();
+        } else {
+            throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, ANYDATA_DATA,
+                                                                    ctx.identifier().getText(), EXIT));
+        }
+    }
+
+    /**
+     * Validates the cardinality of anydata sub-statements as per grammar.
+     *
+     * @param ctx context object of the grammar rule
+     */
+    private static void validateSubStatementsCardinality(AnydataStatementContext ctx) {
+
+        String text = ctx.identifier().getText();
+        validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, ANYDATA_DATA, text);
+        validateCardinalityMaxOne(ctx.configStatement(), CONFIG_DATA, ANYDATA_DATA, text);
+        validateCardinalityMaxOne(ctx.mandatoryStatement(), MANDATORY_DATA, ANYDATA_DATA, text);
+        validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA, ANYDATA_DATA, text);
+        validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA, ANYDATA_DATA, text);
+        validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA, ANYDATA_DATA, text);
+    }
+}
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java
index dbe46a8..5183cb0 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/AugmentListener.java
@@ -197,21 +197,22 @@
      */
     private static void valSubStatCardinality(AugmentStatementContext ctx) {
 
+        String text = ctx.augment().getText();
         validateCardinalityMaxOne(ctx.statusStatement(), STATUS_DATA,
-                                  AUGMENT_DATA, ctx.augment().getText());
+                                  AUGMENT_DATA, text);
 
         validateCardinalityMaxOne(ctx.descriptionStatement(), DESCRIPTION_DATA,
-                                  AUGMENT_DATA, ctx.augment().getText());
+                                  AUGMENT_DATA, text);
 
         validateCardinalityMaxOne(ctx.referenceStatement(), REFERENCE_DATA,
-                                  AUGMENT_DATA, ctx.augment().getText());
+                                  AUGMENT_DATA, text);
 
         validateCardinalityMaxOne(ctx.whenStatement(), WHEN_DATA, AUGMENT_DATA,
-                                  ctx.augment().getText());
+                                  text);
 
         validateCardinalityEitherOne(ctx.dataDefStatement(), DATA_DEF_DATA,
                                      ctx.caseStatement(), CASE_DATA,
-                                     AUGMENT_DATA, ctx.augment().getText(),
+                                     AUGMENT_DATA, text,
                                      ctx);
     }
 
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 7185cb2..b182e12 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
@@ -50,6 +50,7 @@
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
 import static org.onosproject.yang.compiler.translator.tojava.YangDataModelFactory.getYangModuleNode;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -103,7 +104,7 @@
         yangModule.setFileName(listener.getFileName());
 
         if (ctx.moduleBody().moduleHeaderStatement().yangVersionStatement() == null) {
-            yangModule.setVersion((byte) 1);
+            yangModule.setVersion(ONE);
         }
 
         listener.getParsedDataStack().push(yangModule);
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 678aa64..cc45272 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
@@ -41,6 +41,7 @@
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsEmpty;
 import static org.onosproject.yang.compiler.parser.impl.parserutils.ListenerValidation.checkStackIsNotEmpty;
 import static org.onosproject.yang.compiler.translator.tojava.YangDataModelFactory.getYangSubModuleNode;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE;
 
 /*
  * Reference: RFC6020 and YANG ANTLR Grammar
@@ -96,7 +97,7 @@
         yangSubModule.setCharPosition(ctx.getStart().getCharPositionInLine());
         yangSubModule.setFileName(listener.getFileName());
         if (ctx.submoduleBody().submoduleHeaderStatement().yangVersionStatement() == null) {
-            yangSubModule.setVersion((byte) 1);
+            yangSubModule.setVersion(ONE);
         }
 
         listener.getParsedDataStack().push(yangSubModule);
diff --git a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java
index 69808e4..1110aae 100644
--- a/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java
+++ b/compiler/base/parser/src/main/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListener.java
@@ -89,7 +89,7 @@
         // Check for stack to be non empty.
         checkStackIsNotEmpty(listener, MISSING_HOLDER, VERSION_DATA, ctx.version().getText(), ENTRY);
 
-        byte version = getValidVersion(ctx);
+        String version = getValidVersion(ctx);
 
         // Obtain the node of the stack.
         Parsable tmpNode = listener.getParsedDataStack().peek();
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 25ec87b..538e863 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
@@ -72,6 +72,8 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.FALSE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.IN;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INVALID_TREE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE_DOT_ONE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_SQUARE_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.QUOTES;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
@@ -100,7 +102,6 @@
     private static final Pattern PREDICATE =
             Pattern.compile("\\[(.*?)\\]");
     private static final String XML = "xml";
-    private static final String ONE = "1";
     private static final int IDENTIFIER_LENGTH = 64;
     private static final String DATE_FORMAT = "yyyy-MM-dd";
     private static final String REGEX_EQUAL = "[=]";
@@ -201,17 +202,16 @@
      * @param ctx version context object of the grammar rule
      * @return valid version
      */
-    public static byte getValidVersion(YangVersionStatementContext ctx) {
+    public static String getValidVersion(YangVersionStatementContext ctx) {
 
         String value = removeQuotesAndHandleConcat(ctx.version().getText());
-        if (!value.equals(ONE)) {
-            ParserException parserException = new ParserException("YANG file error: Input version not supported");
-            parserException.setLine(ctx.getStart().getLine());
-            parserException.setCharPosition(ctx.getStart().getCharPositionInLine());
-            throw parserException;
+        if (value.equals(ONE) || value.equals(ONE_DOT_ONE)) {
+            return value;
         }
-
-        return Byte.valueOf(value);
+        ParserException parserException = new ParserException("YANG file error: Input version not supported");
+        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 7167f7b..e30e150 100644
--- a/compiler/base/parser/src/main/resources/GeneratedYang.g4
+++ b/compiler/base/parser/src/main/resources/GeneratedYang.g4
@@ -370,7 +370,8 @@
      *                       list-stmt /
      *                       choice-stmt /
      *                       anyxml-stmt /
-     *                       uses-stmt
+     *                       uses-stmt /
+     *                       anydata-stmt
      */
     dataDefStatement : containerStatement
                     | leafStatement
@@ -378,7 +379,8 @@
                     | listStatement
                     | choiceStatement
                     | anyxmlStatement
-                    | usesStatement;
+                    | usesStatement
+                    | anydataStatement;
 
     /**
      *  if-feature-stmt     = if-feature-keyword sep identifier-ref-arg-str
@@ -951,7 +953,7 @@
      *                        anyxml-stmt
      */
     shortCaseStatement : containerStatement | leafStatement | leafListStatement
-            | listStatement | anyxmlStatement;
+            | listStatement | anyxmlStatement | anydataStatement;
 
     /**
      *  case-stmt           = case-keyword sep identifier-arg-str optsep
@@ -1357,6 +1359,28 @@
      */
     defaultDenyAllStatement : DEFAULT_DENY_ALL STMTEND;
 
+
+   /**
+    * anydata-stmt        = anydata-keyword sep identifier-arg-str optsep
+    *                       (";" /
+    *                        "{" stmtsep
+    *                            ;; these stmts can appear in any order
+    *                            [when-stmt]
+    *                            *if-feature-stmt
+    *                            *must-stmt
+    *                            [config-stmt]
+    *                            [mandatory-stmt]
+    *                            [status-stmt]
+    *                            [description-stmt]
+    *                            [reference-stmt]
+    *                         "}") stmtsep
+    */
+    anydataStatement : ANYDATA_KEYWORD identifier (STMTEND |
+               LEFT_CURLY_BRACE stmtSep (whenStatement | ifFeatureStatement
+               | mustStatement | configStatement | mandatoryStatement
+               | statusStatement | descriptionStatement | referenceStatement)*
+               RIGHT_CURLY_BRACE) stmtSep;
+
     /**
      * unknown-statement   = prefix ":" identifier [sep string] optsep
      *                        (";" / "{" *unknown-statement2 "}")
@@ -1456,4 +1480,5 @@
                   | FALSE_KEYWORD | MAX_KEYWORD | MIN_KEYWORD | NOT_SUPPORTED_KEYWORD | OBSOLETE_KEYWORD
                   | REPLACE_KEYWORD | SYSTEM_KEYWORD | TRUE_KEYWORD | UNBOUNDED_KEYWORD | USER_KEYWORD
                   | COMPILER_ANNOTATION_KEYWORD | APP_DATA_STRUCTURE_KEYWORD | DATA_STRUCTURE_KEYWORD
-                  | APP_EXTENDED_KEYWORD | DEFAULT_DENY_WRITE_KEYWORD | DEFAULT_DENY_ALL_KEYWORD;
+                  | APP_EXTENDED_KEYWORD | DEFAULT_DENY_WRITE_KEYWORD | DEFAULT_DENY_ALL_KEYWORD
+                  | ANYDATA_KEYWORD;
diff --git a/compiler/base/parser/src/main/resources/YangLexer.g4 b/compiler/base/parser/src/main/resources/YangLexer.g4
index 4f190b9..7a5e79c 100644
--- a/compiler/base/parser/src/main/resources/YangLexer.g4
+++ b/compiler/base/parser/src/main/resources/YangLexer.g4
@@ -118,6 +118,7 @@
     DEFAULT_DENY_WRITE : IDENTIFIER COLON DEFAULT_DENY_WRITE_KEYWORD;
     DEFAULT_DENY_ALL_KEYWORD : 'default-deny-all';
     DEFAULT_DENY_ALL : IDENTIFIER COLON DEFAULT_DENY_ALL_KEYWORD;
+    ANYDATA_KEYWORD : 'anydata';
 
     // Lexer tokens to be skipped
     COMMENT
diff --git a/compiler/base/parser/src/main/resources/YangLexer.tokens b/compiler/base/parser/src/main/resources/YangLexer.tokens
deleted file mode 100644
index 3192512..0000000
--- a/compiler/base/parser/src/main/resources/YangLexer.tokens
+++ /dev/null
@@ -1,199 +0,0 @@
-ANYXML_KEYWORD=1
-ARGUMENT_KEYWORD=2
-AUGMENT_KEYWORD=3
-BASE_KEYWORD=4
-BELONGS_TO_KEYWORD=5
-BIT_KEYWORD=6
-CASE_KEYWORD=7
-CHOICE_KEYWORD=8
-CONFIG_KEYWORD=9
-CONTACT_KEYWORD=10
-CONTAINER_KEYWORD=11
-DEFAULT_KEYWORD=12
-DESCRIPTION_KEYWORD=13
-ENUM_KEYWORD=14
-ERROR_APP_TAG_KEYWORD=15
-ERROR_MESSAGE_KEYWORD=16
-EXTENSION_KEYWORD=17
-DEVIATION_KEYWORD=18
-DEVIATE_KEYWORD=19
-FEATURE_KEYWORD=20
-FRACTION_DIGITS_KEYWORD=21
-GROUPING_KEYWORD=22
-IDENTITY_KEYWORD=23
-IF_FEATURE_KEYWORD=24
-IMPORT_KEYWORD=25
-INCLUDE_KEYWORD=26
-INPUT_KEYWORD=27
-KEY_KEYWORD=28
-LEAF_KEYWORD=29
-LEAF_LIST_KEYWORD=30
-LENGTH_KEYWORD=31
-LIST_KEYWORD=32
-MANDATORY_KEYWORD=33
-MAX_ELEMENTS_KEYWORD=34
-MIN_ELEMENTS_KEYWORD=35
-MODULE_KEYWORD=36
-MUST_KEYWORD=37
-NAMESPACE_KEYWORD=38
-NOTIFICATION_KEYWORD=39
-ORDERED_BY_KEYWORD=40
-ORGANIZATION_KEYWORD=41
-OUTPUT_KEYWORD=42
-PATH_KEYWORD=43
-PATTERN_KEYWORD=44
-POSITION_KEYWORD=45
-PREFIX_KEYWORD=46
-PRESENCE_KEYWORD=47
-RANGE_KEYWORD=48
-REFERENCE_KEYWORD=49
-REFINE_KEYWORD=50
-REQUIRE_INSTANCE_KEYWORD=51
-REVISION_KEYWORD=52
-REVISION_DATE_KEYWORD=53
-RPC_KEYWORD=54
-STATUS_KEYWORD=55
-SUBMODULE_KEYWORD=56
-TYPE_KEYWORD=57
-TYPEDEF_KEYWORD=58
-UNIQUE_KEYWORD=59
-UNITS_KEYWORD=60
-USES_KEYWORD=61
-VALUE_KEYWORD=62
-WHEN_KEYWORD=63
-YANG_VERSION_KEYWORD=64
-YIN_ELEMENT_KEYWORD=65
-ADD_KEYWORD=66
-CURRENT_KEYWORD=67
-DELETE_KEYWORD=68
-DEPRECATED_KEYWORD=69
-FALSE_KEYWORD=70
-MAX_KEYWORD=71
-MIN_KEYWORD=72
-NOT_SUPPORTED_KEYWORD=73
-OBSOLETE_KEYWORD=74
-REPLACE_KEYWORD=75
-SYSTEM_KEYWORD=76
-TRUE_KEYWORD=77
-UNBOUNDED_KEYWORD=78
-USER_KEYWORD=79
-COMPILER_ANNOTATION_KEYWORD=80
-COMPILER_ANNOTATION=81
-APP_DATA_STRUCTURE_KEYWORD=82
-APP_DATA_STRUCTURE=83
-DATA_STRUCTURE_KEYWORD=84
-DATA_STRUCTURE=85
-DATA_STRUCTURE_KEY=86
-APP_EXTENDED_KEYWORD=87
-APP_EXTENDED=88
-DEFAULT_DENY_WRITE_KEYWORD=89
-DEFAULT_DENY_WRITE=90
-DEFAULT_DENY_ALL_KEYWORD=91
-DEFAULT_DENY_ALL=92
-COMMENT=93
-WS=94
-LINE_COMMENT=95
-INTEGER=96
-DATE_ARG=97
-LEFT_CURLY_BRACE=98
-RIGHT_CURLY_BRACE=99
-IDENTIFIER=100
-STMTEND=101
-DQUOTE=102
-COLON=103
-PLUS=104
-MINUS=105
-UNKNOWN_STATEMENT=106
-STRING=107
-'anyxml'=1
-'argument'=2
-'augment'=3
-'base'=4
-'belongs-to'=5
-'bit'=6
-'case'=7
-'choice'=8
-'config'=9
-'contact'=10
-'container'=11
-'default'=12
-'description'=13
-'enum'=14
-'error-app-tag'=15
-'error-message'=16
-'extension'=17
-'deviation'=18
-'deviate'=19
-'feature'=20
-'fraction-digits'=21
-'grouping'=22
-'identity'=23
-'if-feature'=24
-'import'=25
-'include'=26
-'input'=27
-'key'=28
-'leaf'=29
-'leaf-list'=30
-'length'=31
-'list'=32
-'mandatory'=33
-'max-elements'=34
-'min-elements'=35
-'module'=36
-'must'=37
-'namespace'=38
-'notification'=39
-'ordered-by'=40
-'organization'=41
-'output'=42
-'path'=43
-'pattern'=44
-'position'=45
-'prefix'=46
-'presence'=47
-'range'=48
-'reference'=49
-'refine'=50
-'require-instance'=51
-'revision'=52
-'revision-date'=53
-'rpc'=54
-'status'=55
-'submodule'=56
-'type'=57
-'typedef'=58
-'unique'=59
-'units'=60
-'uses'=61
-'value'=62
-'when'=63
-'yang-version'=64
-'yin-element'=65
-'add'=66
-'current'=67
-'delete'=68
-'deprecated'=69
-'false'=70
-'max'=71
-'min'=72
-'not-supported'=73
-'obsolete'=74
-'replace'=75
-'system'=76
-'true'=77
-'unbounded'=78
-'user'=79
-'compiler-annotation'=80
-'app-data-structure'=82
-'data-structure'=84
-'app-extended-name'=87
-'default-deny-write'=89
-'default-deny-all'=91
-'{'=98
-'}'=99
-';'=101
-'"'=102
-':'=103
-'+'=104
-'-'=105
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListenerTest.java
new file mode 100644
index 0000000..d3ed0eb
--- /dev/null
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/AnydataListenerTest.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.YangAnydata;
+import org.onosproject.yang.compiler.datamodel.YangList;
+import org.onosproject.yang.compiler.datamodel.YangModule;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangNodeType;
+import org.onosproject.yang.compiler.datamodel.YangStatusType;
+import org.onosproject.yang.compiler.parser.exceptions.ParserException;
+import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+
+/**
+ * Test cases for testing anydata listener.
+ */
+public class AnydataListenerTest {
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+
+    private final YangUtilsParserManager manager = new YangUtilsParserManager();
+
+    /**
+     * Checks anydata statement as sub-statement of module.
+     */
+    @Test
+    public void processModuleSubStatementAnydata() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel(
+                "src/test/resources/ModuleSubStatementAnydata.yang");
+
+        assertThat((node instanceof YangModule), is(true));
+
+        // Check whether the node type is set properly to module.
+        assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
+
+        // Check whether the module name is set correctly.
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        // Check whether the anydata is child of module
+        YangAnydata anyData = (YangAnydata) yangNode.getChild();
+        assertThat(anyData.getName(), is("valid"));
+    }
+
+    /**
+     * Checks if anydata identifier in module is duplicate.
+     */
+    @Test(expected = ParserException.class)
+    public void processModuleDuplicateAnydata() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel(
+                "src/test/resources/ModuleDuplicateAnydata.yang");
+    }
+
+    /**
+     * Checks if anydata identifier in list is duplicate.
+     */
+    @Test(expected = ParserException.class)
+    public void processListDuplicateAnydata() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel(
+                "src/test/resources/ListDuplicateAnydata.yang");
+    }
+
+    /**
+     * Checks if anydata identifier collides with list at same level.
+     */
+    @Test(expected = ParserException.class)
+    public void processDuplicateAnydataAndList() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel(
+                "src/test/resources/DuplicateAnydataAndList.yang");
+    }
+
+    /**
+     * Checks anydata statement as sub-statement of list.
+     */
+    @Test
+    public void processListSubStatementAnydata() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel(
+                "src/test/resources/ListSubStatementAnydata.yang");
+
+        assertThat((node instanceof YangModule), is(true));
+
+        // Check whether the node type is set properly to module.
+        assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
+
+        // Check whether the module name is set correctly.
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        // Check whether the list is child of module
+        YangList yangList1 = (YangList) yangNode.getChild();
+        assertThat(yangList1.getName(), is("ospf"));
+
+        Iterator<String> keyList = yangList1.getKeyList().iterator();
+        assertThat(keyList.next(), is("process-id"));
+
+        // Check whether the list is child of list
+        YangAnydata yangAnydata = (YangAnydata) yangList1.getChild();
+        assertThat(yangAnydata.getName(), is("interface"));
+    }
+
+    /**
+     * Checks anydata with all its sub-statements.
+     */
+    @Test
+    public void processAnydataSubStatements() throws IOException,
+            ParserException {
+
+        YangNode node = manager.getDataModel(
+                "src/test/resources/AnydataSubStatements.yang");
+
+        assertThat((node instanceof YangModule), is(true));
+
+        // Check whether the node type is set properly to module.
+        assertThat(node.getNodeType(), is(YangNodeType.MODULE_NODE));
+
+        // Check whether the module name is set correctly.
+        YangModule yangNode = (YangModule) node;
+        assertThat(yangNode.getName(), is("Test"));
+
+        // Check whether the anydata is child of module
+        YangAnydata yangAnydata = (YangAnydata) yangNode.getChild();
+
+        // Check whether anydata properties as set correctly.
+        assertThat(yangAnydata.getName(), is("ospf"));
+
+        assertThat(yangAnydata.isConfig(), is(true));
+        assertThat(yangAnydata.getDescription(), is("\"anydata description\""));
+        assertThat(yangAnydata.getStatus(), is(YangStatusType.CURRENT));
+        assertThat(yangAnydata.getReference(), is("\"anydata reference\""));
+    }
+
+    /**
+     * Checks cardinality of sub-statements of anydata.
+     */
+    @Test
+    public void processAnydataSubStatementCardinality() throws IOException,
+            ParserException {
+        thrown.expect(ParserException.class);
+        thrown.expectMessage("YANG file error: \"reference\" is defined more" +
+                                     " than once in \"anydata valid\".");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/AnydataSubStatementCardinality.yang");
+    }
+
+    /**
+     * Checks anydata as root node.
+     */
+    @Test
+    public void processAnydataRootNode() throws IOException, ParserException {
+        thrown.expect(ParserException.class);
+        thrown.expectMessage("no viable alternative at input 'anydata'");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/AnydataRootNode.yang");
+    }
+
+    /**
+     * Checks invalid identifier for anydata statement.
+     */
+    @Test
+    public void processAnydataInvalidIdentifier() throws IOException,
+            ParserException {
+        thrown.expect(ParserException.class);
+        thrown.expectMessage(
+                "YANG file error : anydata name 1valid is not valid.");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/AnydataInvalidIdentifier.yang");
+    }
+
+    /**
+     * Checks invalid identifier for anydata statement.
+     */
+    @Test
+    public void processAnydataInvalidVersionTest() throws IOException,
+            ParserException {
+        thrown.expect(ParserException.class);
+        thrown.expectMessage(
+                "YANG file error : anydata with name valid at line number 5 " +
+                        "in src/test/resources/AnydataInvalidVersion.yang is feature of YANG version 1.1");
+        YangNode node = manager.getDataModel(
+                "src/test/resources/AnydataInvalidVersion.yang");
+    }
+}
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java
index 19fdd5f..8371e88 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/SubModuleListenerTest.java
@@ -53,7 +53,7 @@
         // Check whether the module name is set correctly.
         assertThat(yangNode.getName(), is("Test"));
         // Checks for the version value in data model tree.
-        assertThat(yangNode.getVersion(), is((byte) 1));
+        assertThat(yangNode.getVersion(), is("1"));
         // Checks identifier of belongsto in data model tree.
         assertThat(yangNode.getBelongsTo().getBelongsToModuleName(), is("ONOS"));
         // Checks for the version value in data model tree.
@@ -79,7 +79,7 @@
         // Check whether the module name is set correctly.
         assertThat(yangNode.getName(), is("Test"));
         // Checks for the version value in data model tree.
-        assertThat(yangNode.getVersion(), is((byte) 1));
+        assertThat(yangNode.getVersion(), is("1"));
         // Checks identifier of belongsto in data model tree.
         assertThat(yangNode.getBelongsTo().getBelongsToModuleName(), is("ONOS"));
         // Checks for the version value in data model tree.
diff --git a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java
index 21bd740..bd775c8 100644
--- a/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java
+++ b/compiler/base/parser/src/test/java/org/onosproject/yang/compiler/parser/impl/listeners/VersionListenerTest.java
@@ -52,7 +52,7 @@
         YangNode node = manager.getDataModel("src/test/resources/VersionValidEntry.yang");
 
         // Checks for the version value in data model tree.
-        assertThat(((YangModule) node).getVersion(), is((byte) 1));
+        assertThat(((YangModule) node).getVersion(), is("1"));
     }
 
     /**
@@ -64,7 +64,7 @@
         YangNode node = manager.getDataModel("src/test/resources/ValidVersionWithDoubleQuotes.yang");
 
         // Checks for the version value in data model tree.
-        assertThat(((YangModule) node).getVersion(), is((byte) 1));
+        assertThat(((YangModule) node).getVersion(), is("1"));
     }
 
     /**
@@ -76,7 +76,7 @@
         YangNode node = manager.getDataModel("src/test/resources/VersionNotPresent.yang");
 
         // Checks for the version value in data model tree.
-        assertThat(((YangModule) node).getVersion(), is((byte) 1));
+        assertThat(((YangModule) node).getVersion(), is("1"));
     }
 
     /**
@@ -97,7 +97,7 @@
         YangNode node = manager.getDataModel("src/test/resources/VersionOrder.yang");
 
         // Checks for the version value in data model tree.
-        assertThat(((YangModule) node).getVersion(), is((byte) 1));
+        assertThat(((YangModule) node).getVersion(), is("1"));
     }
 
     /**
diff --git a/compiler/base/parser/src/test/resources/AnydataInvalidIdentifier.yang b/compiler/base/parser/src/test/resources/AnydataInvalidIdentifier.yang
new file mode 100644
index 0000000..83b7547
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataInvalidIdentifier.yang
@@ -0,0 +1,9 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    anydata 1valid {
+            status current;
+            reference "RFC 7950";
+    }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataInvalidVersion.yang b/compiler/base/parser/src/test/resources/AnydataInvalidVersion.yang
new file mode 100644
index 0000000..74d1d3c
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataInvalidVersion.yang
@@ -0,0 +1,9 @@
+module Test {
+    yang-version 1;
+    namespace http://huawei.com;
+    prefix Ant;
+    anydata valid {
+            status current;
+            reference "RFC 7950";
+    }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataRootNode.yang b/compiler/base/parser/src/test/resources/AnydataRootNode.yang
new file mode 100644
index 0000000..393e8e3
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataRootNode.yang
@@ -0,0 +1,4 @@
+anydata valid {
+    status current;
+    reference "RFC 7950";
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataSubStatementCardinality.yang b/compiler/base/parser/src/test/resources/AnydataSubStatementCardinality.yang
new file mode 100644
index 0000000..84c8f06
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataSubStatementCardinality.yang
@@ -0,0 +1,10 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    anydata valid {
+        reference "RFC 7950";
+        reference "RFC 7950";
+        status current;
+    }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/AnydataSubStatements.yang b/compiler/base/parser/src/test/resources/AnydataSubStatements.yang
new file mode 100644
index 0000000..fb075c4
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/AnydataSubStatements.yang
@@ -0,0 +1,11 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    anydata ospf {
+        config true;
+        description "anydata description";
+        status current;
+        reference "anydata reference";
+    }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/DuplicateAnydataAndList.yang b/compiler/base/parser/src/test/resources/DuplicateAnydataAndList.yang
new file mode 100644
index 0000000..5574243
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/DuplicateAnydataAndList.yang
@@ -0,0 +1,25 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    container ospf {
+        anydata valid {
+            status current;
+            reference "RFC 7950";
+        }
+        list valid {
+            key "process-id";
+            container interface {
+                leaf invalid-interval {
+                    type "uint16";
+                    units "seconds";
+                    status current;
+                    reference "RFC 6020";
+                }
+            }
+            leaf process-id {
+                type "string";
+            }
+        }
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ListDuplicateAnydata.yang b/compiler/base/parser/src/test/resources/ListDuplicateAnydata.yang
new file mode 100644
index 0000000..6313c69
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ListDuplicateAnydata.yang
@@ -0,0 +1,19 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    list ospf {
+        key "process-id";
+        anydata interface {
+            status current;
+            reference "RFC 7950";
+        }
+        leaf process-id {
+            type "string";
+        }
+        anydata interface {
+            status current;
+            reference "RFC 7950";
+        }
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ListSubStatementAnydata.yang b/compiler/base/parser/src/test/resources/ListSubStatementAnydata.yang
new file mode 100644
index 0000000..375c42a
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ListSubStatementAnydata.yang
@@ -0,0 +1,15 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    list ospf {
+        key "process-id";
+        anydata interface {
+            status current;
+            reference "RFC 7950";
+        }
+        leaf process-id {
+            type "string";
+        }
+    }
+}
\ No newline at end of file
diff --git a/compiler/base/parser/src/test/resources/ModuleDuplicateAnydata.yang b/compiler/base/parser/src/test/resources/ModuleDuplicateAnydata.yang
new file mode 100644
index 0000000..16fe694
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ModuleDuplicateAnydata.yang
@@ -0,0 +1,17 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    anydata valid {
+        status current;
+        reference "RFC 7950";
+    }
+    anydata invalid {
+        status current;
+        reference "RFC 7950";
+    }
+    anydata valid {
+        status current;
+        reference "RFC 7950";
+    }
+}
diff --git a/compiler/base/parser/src/test/resources/ModuleSubStatementAnydata.yang b/compiler/base/parser/src/test/resources/ModuleSubStatementAnydata.yang
new file mode 100644
index 0000000..947f420
--- /dev/null
+++ b/compiler/base/parser/src/test/resources/ModuleSubStatementAnydata.yang
@@ -0,0 +1,9 @@
+module Test {
+    yang-version 1.1;
+    namespace http://huawei.com;
+    prefix Ant;
+    anydata valid {
+        status current;
+        reference "RFC 7950";
+    }
+}
\ No newline at end of file
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java
index 87492b3..42ce3b5 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangDataModelFactory.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.yang.compiler.translator.tojava;
 
+import org.onosproject.yang.compiler.datamodel.YangAnydata;
 import org.onosproject.yang.compiler.datamodel.YangAugment;
 import org.onosproject.yang.compiler.datamodel.YangCase;
 import org.onosproject.yang.compiler.datamodel.YangChoice;
@@ -36,6 +37,7 @@
 import org.onosproject.yang.compiler.datamodel.YangUses;
 import org.onosproject.yang.compiler.datamodel.utils.GeneratedLanguage;
 import org.onosproject.yang.compiler.translator.exception.TranslatorException;
+import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAnydataTranslator;
 import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAugmentTranslator;
 import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaCaseTranslator;
 import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaChoiceTranslator;
@@ -165,6 +167,25 @@
      * generated
      * @return the corresponding inherited node based on the target language
      */
+    public static YangAnydata getYangAnydataNode(GeneratedLanguage
+                                                      targetLanguage) {
+        switch (targetLanguage) {
+            case JAVA_GENERATION: {
+                return new YangJavaAnydataTranslator();
+            }
+            default: {
+                throw new TranslatorException("Only YANG to Java is supported.");
+            }
+        }
+    }
+
+    /**
+     * Returns based on the target language generate the inherited data model node.
+     *
+     * @param targetLanguage target language in which YANG mapping needs to be
+     * generated
+     * @return the corresponding inherited node based on the target language
+     */
     public static YangIdentity getYangIdentityNode(GeneratedLanguage targetLanguage) {
         switch (targetLanguage) {
             case JAVA_GENERATION: {
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
index c99e0ff..563ef1a 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yang.compiler.translator.tojava;
 
+import org.onosproject.yang.compiler.datamodel.ConflictResolveNode;
 import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
 import org.onosproject.yang.compiler.datamodel.YangAtomicPath;
 import org.onosproject.yang.compiler.datamodel.YangAugment;
@@ -38,10 +39,10 @@
 import org.onosproject.yang.compiler.datamodel.YangTranslatorOperatorNode;
 import org.onosproject.yang.compiler.datamodel.YangType;
 import org.onosproject.yang.compiler.datamodel.YangTypeHolder;
-import org.onosproject.yang.compiler.datamodel.ConflictResolveNode;
 import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
 import org.onosproject.yang.compiler.translator.exception.TranslatorException;
 import org.onosproject.yang.compiler.translator.tojava.javamodel.JavaLeafInfoContainer;
+import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAnydataTranslator;
 import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaAugmentTranslator;
 import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaEnumerationTranslator;
 import org.onosproject.yang.compiler.translator.tojava.javamodel.YangJavaInputTranslator;
@@ -289,6 +290,10 @@
              */
             translator.getEnumTempFiles()
                     .addEnumAttributeToTempFiles((YangNode) info, config);
+        } else if (info instanceof YangJavaAnydataTranslator) {
+            // TODO remove this check if anydata code generation is not
+            // supported.
+            // Do nothing
         } else if (!(info instanceof YangChoice) && !(info instanceof
                 YangRpc)) {
             /*Do nothing, only the interface needs to be generated for choice*/
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java
new file mode 100644
index 0000000..9ac00e5
--- /dev/null
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaAnydataTranslator.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.translator.tojava.javamodel;
+
+import org.onosproject.yang.compiler.datamodel.javadatamodel.YangJavaAnydata;
+import org.onosproject.yang.compiler.translator.exception.TranslatorException;
+import org.onosproject.yang.compiler.translator.tojava.JavaCodeGenerator;
+import org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorInfo;
+import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoTranslator;
+import org.onosproject.yang.compiler.translator.tojava.TempJavaCodeFragmentFiles;
+import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
+
+import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
+
+/**
+ * Represents container information extended to support java code generation.
+ */
+public class YangJavaAnydataTranslator
+        extends YangJavaAnydata
+        implements JavaCodeGeneratorInfo, JavaCodeGenerator {
+
+    private static final long serialVersionUID = 806201630L;
+
+    /**
+     * File handle to maintain temporary java code fragments as per the code
+     * snippet types.
+     */
+    private transient TempJavaCodeFragmentFiles tempFileHandle;
+
+    /**
+     * Creates YANG java anydata object.
+     */
+    public YangJavaAnydataTranslator() {
+        super();
+        setJavaFileInfo(new JavaFileInfoTranslator());
+        getJavaFileInfo().setGeneratedFileTypes(GENERATE_INTERFACE_WITH_BUILDER);
+    }
+
+    /**
+     * Returns the generated java file information.
+     *
+     * @return generated java file information
+     */
+    @Override
+    public JavaFileInfoTranslator getJavaFileInfo() {
+        if (javaFileInfo == null) {
+            throw new TranslatorException("Missing java info in java datamodel node " +
+                                                  getName() + " in " +
+                                                  getLineNumber() + " at " +
+                                                  getCharPosition()
+                                                  + " in " + getFileName());
+        }
+        return (JavaFileInfoTranslator) javaFileInfo;
+    }
+
+    /**
+     * Sets the java file info object.
+     *
+     * @param javaInfo java file info object
+     */
+    @Override
+    public void setJavaFileInfo(JavaFileInfoTranslator javaInfo) {
+        javaFileInfo = javaInfo;
+    }
+
+    /**
+     * Returns the temporary file handle.
+     *
+     * @return temporary file handle
+     */
+    @Override
+    public TempJavaCodeFragmentFiles getTempJavaCodeFragmentFiles() {
+        return tempFileHandle;
+    }
+
+    /**
+     * Sets temporary file handle.
+     *
+     * @param fileHandle temporary file handle
+     */
+    @Override
+    public void setTempJavaCodeFragmentFiles(TempJavaCodeFragmentFiles fileHandle) {
+        tempFileHandle = fileHandle;
+    }
+
+    /**
+     * Prepare the information for java code generation corresponding to YANG
+     * anydata info.
+     *
+     * @param yangPlugin YANG plugin config
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeEntry(YangPluginConfig yangPlugin) throws TranslatorException {
+        // TODO uncomment this part if code needs to be generated for anydata
+        //        try {
+//            generateCodeAndUpdateInParent(this, yangPlugin, false);
+//        } catch (IOException e) {
+//            throw new TranslatorException(
+//                    "Failed to prepare generate code entry for anydata node " +
+//                            getName() + " in " +
+//                            getLineNumber() + " at " +
+//                            getCharPosition()
+//                            + " in " + getFileName() + " " + e.getLocalizedMessage());
+//        }
+    }
+
+    /**
+     * Create a java file using the YANG anydata info.
+     *
+     * @throws TranslatorException translator operation fail
+     */
+    @Override
+    public void generateCodeExit() throws TranslatorException {
+        // TODO uncomment this part if code needs to be generated for anydata
+//        try {
+//            generateJava(GENERATE_INTERFACE_WITH_BUILDER, this);
+//        } catch (IOException e) {
+//            throw new TranslatorException("Failed to generate code for " +
+//                                                  "anydata node " +
+//                                                  getName() + " in " +
+//                                                  getLineNumber() + " at " +
+//                                                  getCharPosition()
+//                                                  + " in " + getFileName() +
+//                                                  " " + e.getLocalizedMessage());
+//        }
+    }
+}
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
index 9c2dc06..8c530f1 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaIdentityTranslator.java
@@ -211,7 +211,7 @@
      */
     public static String getDerivedPackage(YangIdentity id) {
         String derPkg;
-        byte version;
+        String version;
         String moduleName;
         YangRevision revision;
         String nodeName;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java
index 2fed4fb..9e14b5b 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntax.java
@@ -36,6 +36,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.COLON;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_BASE_PKG;
 import static org.onosproject.yang.compiler.utils.UtilConstants.HYPHEN;
+import static org.onosproject.yang.compiler.utils.UtilConstants.ONE_DOT_ONE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
 import static org.onosproject.yang.compiler.utils.UtilConstants.REGEX_WITH_ALL_SPECIAL_CHAR;
 import static org.onosproject.yang.compiler.utils.UtilConstants.REVISION_PREFIX;
@@ -75,7 +76,7 @@
      * @param resolver object of YANG to java naming conflict util
      * @return the root package string
      */
-    public static String getRootPackage(byte version, String name,
+    public static String getRootPackage(String version, String name,
                                         YangRevision revision,
                                         YangToJavaNamingConflictUtil resolver) {
 
@@ -97,7 +98,10 @@
      * @param ver YANG version
      * @return version
      */
-    private static String getYangVersion(byte ver) {
+    private static String getYangVersion(String ver) {
+        if (ver.equals(ONE_DOT_ONE)) {
+            ver = "11";
+        }
         return VERSION_PREFIX + ver;
     }
 
diff --git a/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java b/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java
index a364a9d..6ef2d3a 100644
--- a/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java
+++ b/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaIdentifierSyntaxTest.java
@@ -147,7 +147,8 @@
     public void getRootPackageTest()
             throws ParseException {
         conflictResolver.setPrefixForIdentifier(null);
-        String rootPackage = getRootPackage((byte) 1, CHILD_PACKAGE, getYangRevision(DATE1), conflictResolver);
+        String rootPackage = getRootPackage("1", CHILD_PACKAGE,
+                                            getYangRevision(DATE1), conflictResolver);
         assertThat(rootPackage.equals(UtilConstants.DEFAULT_BASE_PKG + UtilConstants.PERIOD + VERSION_NUMBER
                                               + UtilConstants.PERIOD + CHILD_WITH_PERIOD +
                                               UtilConstants.PERIOD + DATE_WITH_REV1), is(true));
@@ -162,7 +163,8 @@
         thrown.expect(ArrayIndexOutOfBoundsException.class);
         thrown.expectMessage("The given prefix in pom.xml is invalid.");
         conflictResolver.setPrefixForIdentifier(INVALID_PREFIX);
-        String rootPackage1 = getRootPackage((byte) 1, INVALID_NAME_SPACE_FOR_INVALID_PREFIX, getYangRevision(DATE1),
+        String rootPackage1 = getRootPackage("1",
+                                             INVALID_NAME_SPACE_FOR_INVALID_PREFIX, getYangRevision(DATE1),
                                              conflictResolver);
     }
 
@@ -173,7 +175,8 @@
     public void getRootPackageWithRevTest()
             throws ParseException {
         Date date = simpleDateFormat.parse(DATE2);
-        String rootPkgWithRev = getRootPackage((byte) 1, CHILD_PACKAGE, getYangRevision(DATE2), null);
+        String rootPkgWithRev = getRootPackage("1", CHILD_PACKAGE,
+                                               getYangRevision(DATE2), null);
         assertThat(rootPkgWithRev.equals(
                 UtilConstants.DEFAULT_BASE_PKG + UtilConstants.PERIOD + VERSION_NUMBER + UtilConstants.PERIOD +
                         CHILD_WITH_PERIOD + UtilConstants.PERIOD + DATE_WITH_REV2), is(true));
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
index 5592395..b165204 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
@@ -1133,32 +1133,32 @@
      */
     public static final Set<String> JAVA_KEY_WORDS =
             Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
-                 "abstract", "assert", "boolean", "break", "byte",
-                 "case", "catch", "char", "class", "const", "continue",
-                 "default", "do", "double", "else", "extends", "false",
-                 "final", "finally", "float", "for", "goto", "if",
-                 "implements", "import", "instanceof", "enum", "int",
-                 "interface", "long", "native", "new", "null",
-                 "package", "private", "protected", "public", "return",
-                 "short", "static", "strictfp", "super", "switch",
-                 "synchronized", "this", "throw", "throws", "transient",
-                 "true", "try", "void", "volatile", "while",
-                 "list", // Not a Java keyword
-                 "map", // Not a Java keyword
-                 "arrayList", // Not a Java keyword
-                 "hashMap", // Not a Java keyword
-                 "linkedList", // Not a Java keyword
-                 "notify", // method on Object
-                 "notifyAll", // method on Object
-                 "wait", // method on Object
-                 "getClass", // method on Object
-                 "hashCode", // method on Object
-                 "equals", // method on Object
-                 "toString", // method on Object
-                 "clone", // method on Object
-                 "finalize", // method on Object
-                 "Method", // Not a Java keyword
-                 "collections") // Not a Java keyword
+                    "abstract", "assert", "boolean", "break", "byte",
+                    "case", "catch", "char", "class", "const", "continue",
+                    "default", "do", "double", "else", "extends", "false",
+                    "final", "finally", "float", "for", "goto", "if",
+                    "implements", "import", "instanceof", "enum", "int",
+                    "interface", "long", "native", "new", "null",
+                    "package", "private", "protected", "public", "return",
+                    "short", "static", "strictfp", "super", "switch",
+                    "synchronized", "this", "throw", "throws", "transient",
+                    "true", "try", "void", "volatile", "while",
+                    "list", // Not a Java keyword
+                    "map", // Not a Java keyword
+                    "arrayList", // Not a Java keyword
+                    "hashMap", // Not a Java keyword
+                    "linkedList", // Not a Java keyword
+                    "notify", // method on Object
+                    "notifyAll", // method on Object
+                    "wait", // method on Object
+                    "getClass", // method on Object
+                    "hashCode", // method on Object
+                    "equals", // method on Object
+                    "toString", // method on Object
+                    "clone", // method on Object
+                    "finalize", // method on Object
+                    "Method", // Not a Java keyword
+                    "collections") // Not a Java keyword
             ));
 
     /**
@@ -1633,6 +1633,11 @@
     public static final String ONE = "1";
 
     /**
+     * Static attribute for 1.1 keyword.
+     */
+    public static final String ONE_DOT_ONE = "1.1";
+
+    /**
      * Static attribute for YANG node operation type attribute.
      */
     public static final String OPERATION_TYPE_ATTRIBUTE =
@@ -1958,6 +1963,7 @@
 
     public static final String IDENTITY = "_identity";
     public static final String TYPEDEF = "_typedef";
+
     // No instantiation.
     private UtilConstants() {
     }
