diff --git a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
index 0cd359b..7df0de2 100644
--- a/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
+++ b/plugin/src/main/java/org/onosproject/yangutils/linker/impl/YangResolutionInfoImpl.java
@@ -21,7 +21,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Stack;
-
 import org.onosproject.yangutils.datamodel.Resolvable;
 import org.onosproject.yangutils.datamodel.ResolvableType;
 import org.onosproject.yangutils.datamodel.TraversalType;
@@ -29,6 +28,7 @@
 import org.onosproject.yangutils.datamodel.YangAugment;
 import org.onosproject.yangutils.datamodel.YangAugmentableNode;
 import org.onosproject.yangutils.datamodel.YangBase;
+import org.onosproject.yangutils.datamodel.YangCompilerAnnotation;
 import org.onosproject.yangutils.datamodel.YangDerivedInfo;
 import org.onosproject.yangutils.datamodel.YangEntityToResolveInfo;
 import org.onosproject.yangutils.datamodel.YangEntityToResolveInfoImpl;
@@ -44,6 +44,7 @@
 import org.onosproject.yangutils.datamodel.YangLeaf;
 import org.onosproject.yangutils.datamodel.YangLeafList;
 import org.onosproject.yangutils.datamodel.YangLeafRef;
+import org.onosproject.yangutils.datamodel.YangList;
 import org.onosproject.yangutils.datamodel.YangModule;
 import org.onosproject.yangutils.datamodel.YangNode;
 import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
@@ -308,9 +309,7 @@
 
         YangDerivedInfo derivedInfo = (YangDerivedInfo) yangType.getDataTypeExtendedInfo();
 
-        /*
-         * If the derived types referred type is not leafref/identityref return
-         */
+        // If the derived types referred type is not leafref/identityref return
         if ((derivedInfo.getEffectiveBuiltInType() != YangDataTypes.LEAFREF) &&
                 (derivedInfo.getEffectiveBuiltInType() != YangDataTypes.IDENTITYREF)) {
             return;
@@ -511,9 +510,7 @@
             return;
         }
 
-        /*
-         * In case prefix is not present it's a candidate for inter-file resolution via include list.
-         */
+        //In case prefix is not present it's a candidate for inter-file resolution via include list.
         if (getRefPrefix() == null) {
             ((Resolvable) getCurrentEntityToResolveFromStack()).setResolvableStatus(INTRA_FILE_RESOLVED);
         }
@@ -771,9 +768,8 @@
 
         if ((getCurrentEntityToResolveFromStack() instanceof YangIdentityRef) ||
                 (getCurrentEntityToResolveFromStack() instanceof YangBase)) {
-            /*
-             * Check if name of node name matches with the current reference node.
-             */
+
+            //Check if name of node name matches with the current reference node.
             return currentReferredNode.getName().contentEquals(nameOfIdentityRefBase);
         } else {
             throw new DataModelException("Data Model Exception: Entity to resolved is other than identityref");
@@ -967,9 +963,8 @@
     private void addUnresolvedRecursiveReferenceToStack(YangNode referredNode)
             throws DataModelException {
         if (getCurrentEntityToResolveFromStack() instanceof YangType) {
-            /*
-             * Checks if typedef type is derived
-             */
+
+            //Checks if typedef type is derived
             if (((YangTypeDef) referredNode).getTypeDefBaseType().getDataType() == YangDataTypes.DERIVED) {
 
                 YangEntityToResolveInfoImpl<YangType<?>> unResolvedEntityInfo = new YangEntityToResolveInfoImpl<>();
@@ -992,9 +987,8 @@
             throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses");
         } else if ((getCurrentEntityToResolveFromStack() instanceof YangBase) ||
                 (getCurrentEntityToResolveFromStack() instanceof YangIdentityRef)) {
-            /*
-             * Search if the identity has any un resolved base, if so return true, else return false.
-             */
+
+            //Search if the identity has any un resolved base, if so return true, else return false.
             addUnResolvedBaseToStack(referredNode);
         } else {
             throw new DataModelException("Data Model Exception: Entity to resolved is other than type/uses/" +
@@ -1009,9 +1003,7 @@
      */
     private void addUnResolvedUsesToStack(YangNode node) {
 
-        /**
-         * Search the grouping node's children for presence of uses node.
-         */
+        //Search the grouping node's children for presence of uses node.
         TraversalType curTraversal = ROOT;
         YangNode curNode = node.getChild();
         while (curNode != null) {
@@ -1222,7 +1214,7 @@
         YangXpathLinker<T> xPathLinker = new YangXpathLinker<T>();
 
         if (entityToResolve instanceof YangAugment) {
-            YangNode targetNode;
+            YangNode targetNode = null;
             YangAugment augment = (YangAugment) entityToResolve;
             targetNode = xPathLinker.processAugmentXpathLinking(augment.getTargetNode(),
                     (YangNode) root);
@@ -1240,6 +1232,25 @@
             } else {
                 throw new LinkerException("Failed to link " + augment.getName());
             }
+        } else if (entityToResolve instanceof YangCompilerAnnotation) {
+            YangNode targetNode;
+            YangCompilerAnnotation ca = (YangCompilerAnnotation) entityToResolve;
+
+            targetNode = xPathLinker.processAugmentXpathLinking(ca.getAtomicPathList(),
+                    (YangNode) root);
+            if (targetNode != null) {
+                if (targetNode instanceof YangList) {
+                    ((YangList) targetNode).setCompilerAnnotation(
+                            (YangCompilerAnnotation) entityToResolve);
+                    Resolvable resolvable = (Resolvable) entityToResolve;
+                    resolvable.setResolvableStatus(RESOLVED);
+                } else {
+                    throw new LinkerException("Invalid target node type " + targetNode.getNodeType() + " for compiler" +
+                            " annotation " + ca.getPath());
+                }
+            } else {
+                throw new LinkerException("Failed to link compiler annotation " + ca.getPath());
+            }
         } else if (entityToResolve instanceof YangLeafRef) {
             YangLeafRef leafRef = (YangLeafRef) entityToResolve;
             Object target = xPathLinker.processLeafRefXpathLinking(leafRef.getAtomicPath(),
@@ -1613,9 +1624,8 @@
      */
     private boolean resolveWithImport()
             throws DataModelException {
-        /*
-         * Run through import list to find the referred typedef/grouping.
-         */
+
+        // Run through import list to find the referred typedef/grouping.
         for (YangImport yangImport : getCurReferenceResolver().getImportList()) {
             /*
              * Match the prefix attached to entity under resolution with the
