[ONOS-4799],[ONOS-4351] Augment inter file linker and Generated Code refactored.

Change-Id: Id1f3ac9c90a632373f51cc75d499c3110216be17
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/ResolvableType.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/ResolvableType.java
index ad00cae..1be5cac 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/ResolvableType.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/ResolvableType.java
@@ -49,5 +49,10 @@
     /**
      * Identifies the identityref.
      */
-    YANG_IDENTITYREF
+    YANG_IDENTITYREF,
+
+    /**
+     * Identifies the augment.
+     */
+    YANG_AUGMENT
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
index ae9ff3a..9d37d46 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugment.java
@@ -20,6 +20,7 @@
 
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
 import org.onosproject.yangutils.datamodel.utils.Parsable;
+import org.onosproject.yangutils.datamodel.utils.ResolvableStatus;
 import org.onosproject.yangutils.datamodel.utils.YangConstructType;
 
 import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.detectCollidingChildUtil;
@@ -81,7 +82,8 @@
  */
 public class YangAugment
         extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangWhenHolder, YangIfFeatureHolder {
+        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentedInfo, Resolvable,
+        YangXPathResolver, YangWhenHolder, YangIfFeatureHolder  {
 
     private static final long serialVersionUID = 806201602L;
 
@@ -108,7 +110,7 @@
     /**
      * List of node identifiers.
      */
-    private List<YangNodeIdentifier> targetNode;
+    private List<YangAtomicPath> targetNode;
 
     /**
      * Reference of the YANG augment.
@@ -121,6 +123,19 @@
     private YangStatusType status;
 
     /**
+     * Resolved augmented node.
+     */
+    private YangNode augmentedNode;
+
+    /**
+     * Status of resolution. If completely resolved enum value is "RESOLVED",
+     * if not enum value is "UNRESOLVED", in case reference of grouping/typedef
+     * is added to uses/type but it's not resolved value of enum should be
+     * "INTRA_FILE_RESOLVED".
+     */
+    private ResolvableStatus resolvableStatus;
+
+    /**
      * When data of the node.
      */
     private YangWhen when;
@@ -135,6 +150,7 @@
      */
     public YangAugment() {
         super(YangNodeType.AUGMENT_NODE);
+        resolvableStatus = ResolvableStatus.UNRESOLVED;
     }
 
     /**
@@ -142,7 +158,7 @@
      *
      * @return the augmented node
      */
-    public List<YangNodeIdentifier> getTargetNode() {
+    public List<YangAtomicPath> getTargetNode() {
         return targetNode;
     }
 
@@ -151,7 +167,7 @@
      *
      * @param nodeIdentifiers the augmented node
      */
-    public void setTargetNode(List<YangNodeIdentifier> nodeIdentifiers) {
+    public void setTargetNode(List<YangAtomicPath> nodeIdentifiers) {
         targetNode = nodeIdentifiers;
     }
 
@@ -371,6 +387,24 @@
         this.name = name;
     }
 
+    /**
+     * Returns augmented node.
+     *
+     * @return augmented node
+     */
+    public YangNode getAugmentedNode() {
+        return augmentedNode;
+    }
+
+    /**
+     * Sets augmented node.
+     *
+     * @param augmentedNode augmented node
+     */
+    public void setAugmentedNode(YangNode augmentedNode) {
+        this.augmentedNode = augmentedNode;
+    }
+
     @Override
     public List<YangIfFeature> getIfFeatureList() {
         return ifFeatureList;
@@ -388,4 +422,20 @@
     public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
         this.ifFeatureList = ifFeatureList;
     }
+
+    @Override
+    public ResolvableStatus getResolvableStatus() {
+        return resolvableStatus;
+    }
+
+    @Override
+    public void setResolvableStatus(ResolvableStatus resolvableStatus) {
+        this.resolvableStatus = resolvableStatus;
+
+    }
+
+    @Override
+    public void resolve() throws DataModelException {
+        // Resolving of target node is being done in XPathLinker.
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentableNode.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentableNode.java
new file mode 100644
index 0000000..f3952c6
--- /dev/null
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentableNode.java
@@ -0,0 +1,46 @@
+/*
+ * 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.yangutils.datamodel;
+
+import java.util.List;
+
+/**
+ * Represents YANG constructs which can be augmented.
+ */
+public interface YangAugmentableNode {
+
+    /**
+     * Adds augment info to the augment info list.
+     *
+     * @param augmentInfo augment info of node
+     */
+    void addAugmentation(YangAugmentedInfo augmentInfo);
+
+    /**
+     * Removes augment info from the node.
+     *
+     * @param augmentInfo augment info of node
+     */
+    void removeAugmentation(YangAugmentedInfo augmentInfo);
+
+    /**
+     * Returns list of augment info.
+     *
+     * @return list of augment info
+     */
+    List<YangAugmentedInfo> getAugmentedInfoList();
+}
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentationHolder.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentedInfo.java
similarity index 86%
copy from utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentationHolder.java
copy to utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentedInfo.java
index aa2b678..b6e55e6 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentationHolder.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentedInfo.java
@@ -17,7 +17,7 @@
 package org.onosproject.yangutils.datamodel;
 
 /**
- * Represents YANG constructs which can be augmented.
+ * Abstraction of an entity which represents YANG augmented info.
  */
-public interface YangAugmentationHolder {
+public interface YangAugmentedInfo {
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
index eb7d6fd..bb3c3cc 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangCase.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.yangutils.datamodel;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -94,7 +95,7 @@
  */
 public class YangCase
         extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
+        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentableNode,
         YangWhenHolder, YangIfFeatureHolder {
 
     private static final long serialVersionUID = 806201603L;
@@ -141,6 +142,8 @@
      */
     private List<YangIfFeature> ifFeatureList;
 
+    private List<YangAugmentedInfo> yangAugmentedInfo = new ArrayList<>();
+
     /**
      * Creates a choice node.
      */
@@ -392,4 +395,19 @@
     public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
         this.ifFeatureList = ifFeatureList;
     }
+
+    @Override
+    public void addAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.add(augmentInfo);
+    }
+
+    @Override
+    public void removeAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.remove(augmentInfo);
+    }
+
+    @Override
+    public List<YangAugmentedInfo> getAugmentedInfoList() {
+        return yangAugmentedInfo;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java
index 5262119..5e78d55 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangChoice.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.yangutils.datamodel;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
@@ -63,8 +64,8 @@
  * Represents data model node to maintain information defined in YANG choice.
  */
 public class YangChoice extends YangNode
-        implements YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder, YangWhenHolder,
-        YangIfFeatureHolder {
+        implements YangCommonInfo, Parsable, CollisionDetector, YangAugmentableNode,
+        YangWhenHolder, YangIfFeatureHolder {
 
     private static final long serialVersionUID = 806201604L;
 
@@ -156,6 +157,8 @@
      */
     private List<YangIfFeature> ifFeatureList;
 
+    private List<YangAugmentedInfo> yangAugmentedInfo = new ArrayList<>();
+
     /**
      * Create a choice node.
      */
@@ -418,4 +421,18 @@
         this.ifFeatureList = ifFeatureList;
     }
 
+    @Override
+    public void addAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.add(augmentInfo);
+    }
+
+    @Override
+    public void removeAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.remove(augmentInfo);
+    }
+
+    @Override
+    public List<YangAugmentedInfo> getAugmentedInfoList() {
+        return yangAugmentedInfo;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
index 7bb34e2..65261cc 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangContainer.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yangutils.datamodel;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -89,8 +90,8 @@
  */
 public class YangContainer
         extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
-        YangMustHolder, YangWhenHolder, YangIfFeatureHolder {
+        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector,
+        YangAugmentableNode, YangMustHolder, YangWhenHolder, YangIfFeatureHolder {
 
     private static final long serialVersionUID = 806201605L;
 
@@ -130,6 +131,8 @@
      */
     private String reference;
 
+    private List<YangAugmentedInfo> yangAugmentedInfo = new ArrayList<>();
+
     /**
      * Status of the node.
      */
@@ -518,4 +521,18 @@
         getListOfMust().add(must);
     }
 
+    @Override
+    public void addAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.add(augmentInfo);
+    }
+
+    @Override
+    public void removeAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.remove(augmentInfo);
+    }
+
+    @Override
+    public List<YangAugmentedInfo> getAugmentedInfoList() {
+        return yangAugmentedInfo;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java
index 7238a3e..091a15f 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangInput.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yangutils.datamodel;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -70,7 +71,7 @@
  */
 public class YangInput
         extends YangNode
-        implements YangLeavesHolder, Parsable, CollisionDetector, YangAugmentationHolder {
+        implements YangLeavesHolder, Parsable, CollisionDetector, YangAugmentableNode {
 
     private static final long serialVersionUID = 806201608L;
 
@@ -89,6 +90,8 @@
      */
     private List<YangLeafList> listOfLeafList;
 
+    private List<YangAugmentedInfo> yangAugmentedInfo = new ArrayList<>();
+
     /**
      * Create a rpc input node.
      */
@@ -171,4 +174,19 @@
     public void setName(String name) {
         this.name = name;
     }
+
+    @Override
+    public void addAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.add(augmentInfo);
+    }
+
+    @Override
+    public void removeAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.remove(augmentInfo);
+    }
+
+    @Override
+    public List<YangAugmentedInfo> getAugmentedInfoList() {
+        return yangAugmentedInfo;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java
index 6b49fcd..0c3a98f 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeafRef.java
@@ -43,7 +43,8 @@
  *
  * @param <T> YANG leafref info
  */
-public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangIfFeatureHolder {
+public class YangLeafRef<T> implements Parsable, Resolvable, Serializable, YangIfFeatureHolder,
+        YangXPathResolver {
 
     private static final long serialVersionUID = 286201644L;
 
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangList.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
index d09f8d5..2d28525 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangList.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yangutils.datamodel;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -70,8 +71,8 @@
  */
 public class YangList
         extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
-        YangMustHolder, YangIfFeatureHolder, YangDataNode {
+        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector,
+        YangAugmentableNode, YangMustHolder, YangIfFeatureHolder, YangDataNode {
 
     private static final long serialVersionUID = 806201609L;
 
@@ -127,6 +128,8 @@
      */
     private List<YangLeafList> listOfLeafList;
 
+    private List<YangAugmentedInfo> yangAugmentedInfo = new ArrayList<>();
+
     /**
      * Reference RFC 6020.
      *
@@ -570,8 +573,7 @@
      * @throws DataModelException a violation of data model rules
      */
     private void validateKey(List<YangLeaf> leaves, List<YangLeafList> leafLists, List<String> keys)
-            throws
-            DataModelException {
+            throws DataModelException {
         boolean leafFound = false;
         List<YangLeaf> keyLeaves = new LinkedList<>();
         List<YangLeafList> keyLeafLists = new LinkedList<>();
@@ -713,4 +715,19 @@
         }
         getListOfMust().add(must);
     }
+
+    @Override
+    public void addAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.add(augmentInfo);
+    }
+
+    @Override
+    public void removeAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.remove(augmentInfo);
+    }
+
+    @Override
+    public List<YangAugmentedInfo> getAugmentedInfoList() {
+        return yangAugmentedInfo;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
index 6e515ad..81bbd41 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangModule.java
@@ -201,30 +201,34 @@
     private List<YangResolutionInfo> derivedTypeResolutionList;
 
     /**
-     * uses resolution list.
+     * Uses resolution list.
      */
     private List<YangResolutionInfo> usesResolutionList;
 
     /**
-     * if-feature resolution list.
+     * If-feature resolution list.
      */
     private List<YangResolutionInfo> ifFeatureResolutionList;
 
     /**
-     * leafref resolution list.
+     * Leafref resolution list.
      */
     private List<YangResolutionInfo> leafrefResolutionList;
 
     /**
-     * base resolution list.
+     * Base resolution list.
      */
     private List<YangResolutionInfo> baseResolutionList;
 
     /**
-     * identityref resolution list.
+     * Identityref resolution list.
      */
     private List<YangResolutionInfo> identityrefResolutionList;
 
+    /**
+     * Augment resolution list.
+     */
+    private List<YangResolutionInfo> augmentResolutionList;
 
     /**
      * Creates a YANG node of module type.
@@ -233,6 +237,7 @@
 
         super(YangNodeType.MODULE_NODE);
         derivedTypeResolutionList = new LinkedList<>();
+        augmentResolutionList = new LinkedList<>();
         usesResolutionList = new LinkedList<>();
         ifFeatureResolutionList = new LinkedList<>();
         leafrefResolutionList = new LinkedList<>();
@@ -608,6 +613,8 @@
             return derivedTypeResolutionList;
         } else if (type == ResolvableType.YANG_USES) {
             return usesResolutionList;
+        } else if (type == ResolvableType.YANG_AUGMENT) {
+            return augmentResolutionList;
         } else if (type == ResolvableType.YANG_IF_FEATURE) {
             return ifFeatureResolutionList;
         } else if (type == ResolvableType.YANG_LEAFREF) {
@@ -632,6 +639,8 @@
             leafrefResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList.add(resolutionInfo);
+        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+            augmentResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList.add(resolutionInfo);
         }
@@ -650,6 +659,8 @@
             leafrefResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList = resolutionList;
+        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+            augmentResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList = resolutionList;
         }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java
index 62ee584..b08fb03 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangNotification.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yangutils.datamodel;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -76,8 +77,8 @@
  */
 public class YangNotification
         extends YangNode
-        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector, YangAugmentationHolder,
-        YangIfFeatureHolder {
+        implements YangLeavesHolder, YangCommonInfo, Parsable, CollisionDetector,
+        YangAugmentableNode, YangIfFeatureHolder {
 
     private static final long serialVersionUID = 806201611L;
 
@@ -116,6 +117,8 @@
      */
     private List<YangIfFeature> ifFeatureList;
 
+    private List<YangAugmentedInfo> yangAugmentedInfo = new ArrayList<>();
+
     /**
      * Create a notification node.
      */
@@ -245,4 +248,19 @@
     public void setIfFeatureList(List<YangIfFeature> ifFeatureList) {
         this.ifFeatureList = ifFeatureList;
     }
+
+    @Override
+    public void addAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.add(augmentInfo);
+    }
+
+    @Override
+    public void removeAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.remove(augmentInfo);
+    }
+
+    @Override
+    public List<YangAugmentedInfo> getAugmentedInfoList() {
+        return yangAugmentedInfo;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java
index f06ca01..7e14bc8 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangOutput.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yangutils.datamodel;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -69,7 +70,7 @@
  */
 public class YangOutput
         extends YangNode
-        implements YangLeavesHolder, Parsable, CollisionDetector, YangAugmentationHolder {
+        implements YangLeavesHolder, Parsable, CollisionDetector, YangAugmentableNode {
 
     private static final long serialVersionUID = 806201612L;
 
@@ -88,6 +89,8 @@
      */
     private List<YangLeafList> listOfLeafList;
 
+    private List<YangAugmentedInfo> yangAugmentedInfo = new ArrayList<>();
+
     /**
      * Create a rpc output node.
      */
@@ -170,4 +173,19 @@
     public void setName(String name) {
         this.name = name;
     }
+
+    @Override
+    public void addAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.add(augmentInfo);
+    }
+
+    @Override
+    public void removeAugmentation(YangAugmentedInfo augmentInfo) {
+        yangAugmentedInfo.remove(augmentInfo);
+    }
+
+    @Override
+    public List<YangAugmentedInfo> getAugmentedInfoList() {
+        return yangAugmentedInfo;
+    }
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathArgType.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathArgType.java
index 5939829..26e1fb2 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathArgType.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathArgType.java
@@ -20,10 +20,13 @@
  */
 public enum YangPathArgType {
 
-    // Absolute path.
+    /**
+     * Absolute path.
+     */
     ABSOLUTE_PATH,
 
-    // Relative path.
+    /**
+     * Relative path.
+     */
     RELATIVE_PATH
-
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathOperator.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathOperator.java
index 718c30c..0594af8 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathOperator.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangPathOperator.java
@@ -20,6 +20,8 @@
  */
 public enum YangPathOperator {
 
-    // Path expression contains equal to.
+    /**
+     *  Path expression contains equal-to.
+     */
     EQUALTO
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
index 498f5e7..438dc1f 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSubModule.java
@@ -199,36 +199,42 @@
     private List<YangResolutionInfo> derivedTypeResolutionList;
 
     /**
-     * uses resolution list.
+     * Uses resolution list.
      */
     private List<YangResolutionInfo> usesResolutionList;
 
     /**
-     * if-feature resolution list.
+     * If-feature resolution list.
      */
     private List<YangResolutionInfo> ifFeatureResolutionList;
 
     /**
-     * leafref resolution list.
+     * Leafref resolution list.
      */
     private List<YangResolutionInfo> leafrefResolutionList;
 
     /**
-     * base resolution list.
+     * Base resolution list.
      */
     private List<YangResolutionInfo> baseResolutionList;
 
     /**
-     * identityref resolution list.
+     * Identityref resolution list.
      */
     private List<YangResolutionInfo> identityrefResolutionList;
 
     /**
+     * Augment resolution list.
+     */
+    private List<YangResolutionInfo> augmentResolutionList;
+
+    /**
      * Creates a sub module node.
      */
     public YangSubModule() {
         super(YangNodeType.SUB_MODULE_NODE);
         derivedTypeResolutionList = new LinkedList<>();
+        augmentResolutionList = new LinkedList<>();
         usesResolutionList = new LinkedList<>();
         ifFeatureResolutionList = new LinkedList<>();
         leafrefResolutionList = new LinkedList<>();
@@ -569,6 +575,8 @@
             return derivedTypeResolutionList;
         } else if (type == ResolvableType.YANG_USES) {
             return usesResolutionList;
+        } else if (type == ResolvableType.YANG_AUGMENT) {
+            return augmentResolutionList;
         } else if (type == ResolvableType.YANG_IF_FEATURE) {
             return ifFeatureResolutionList;
         } else if (type == ResolvableType.YANG_LEAFREF) {
@@ -593,6 +601,8 @@
             leafrefResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList.add(resolutionInfo);
+        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+            augmentResolutionList.add(resolutionInfo);
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList.add(resolutionInfo);
         }
@@ -611,6 +621,8 @@
             leafrefResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_BASE) {
             baseResolutionList = resolutionList;
+        } else if (type ==  ResolvableType.YANG_AUGMENT) {
+            augmentResolutionList = resolutionList;
         } else if (type == ResolvableType.YANG_IDENTITYREF) {
             identityrefResolutionList = resolutionList;
         }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentationHolder.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangXPathResolver.java
similarity index 86%
rename from utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentationHolder.java
rename to utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangXPathResolver.java
index aa2b678..db94660 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangAugmentationHolder.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangXPathResolver.java
@@ -17,7 +17,7 @@
 package org.onosproject.yangutils.datamodel;
 
 /**
- * Represents YANG constructs which can be augmented.
+ * Abstraction of an entity which can be resolved with x-path linker.
  */
-public interface YangAugmentationHolder {
+public interface YangXPathResolver {
 }
diff --git a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
index 489ac5c..410e025 100644
--- a/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
+++ b/utils/yangutils/datamodel/src/main/java/org/onosproject/yangutils/datamodel/utils/DataModelUtils.java
@@ -16,12 +16,17 @@
 
 package org.onosproject.yangutils.datamodel.utils;
 
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
 import org.onosproject.yangutils.datamodel.CollisionDetector;
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.YangIfFeature;
+import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangBase;
 import org.onosproject.yangutils.datamodel.YangIdentityRef;
 import org.onosproject.yangutils.datamodel.YangLeaf;
@@ -171,6 +176,10 @@
             resolutionNode.addToResolutionList(resolutionInfo,
                     ResolvableType.YANG_USES);
         } else if (resolutionInfo.getEntityToResolveInfo()
+                .getEntityToResolve() instanceof YangAugment) {
+            resolutionNode.addToResolutionList(resolutionInfo,
+                    ResolvableType.YANG_AUGMENT);
+        } else if (resolutionInfo.getEntityToResolveInfo()
                 .getEntityToResolve() instanceof YangIfFeature) {
             resolutionNode.addToResolutionList(resolutionInfo,
                     ResolvableType.YANG_IF_FEATURE);
@@ -272,4 +281,30 @@
          */
         return currentNode.getParent();
     }
+
+    /**
+     * Returns de-serializes YANG data-model nodes.
+     *
+     * @param serializableInfoSet YANG file info set
+     * @return de-serializes YANG data-model nodes
+     * @throws IOException when fails do IO operations
+     */
+    public static List<YangNode> deSerializeDataModel(List<String> serializableInfoSet) throws IOException {
+
+        List<YangNode> nodes = new ArrayList<>();
+        for (String fileInfo : serializableInfoSet) {
+            YangNode node = null;
+            try {
+                FileInputStream fileInputStream = new FileInputStream(fileInfo);
+                ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
+                node = (YangNode) objectInputStream.readObject();
+                nodes.add(node);
+                objectInputStream.close();
+                fileInputStream.close();
+            } catch (IOException | ClassNotFoundException e) {
+                throw new IOException(fileInfo + " not found.");
+            }
+        }
+        return nodes;
+    }
 }