Merge "Initial sketch of YANG runtime API."
diff --git a/datamodel/pom.xml b/datamodel/pom.xml
index 0d1aafe..cfcd714 100644
--- a/datamodel/pom.xml
+++ b/datamodel/pom.xml
@@ -21,11 +21,11 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-yang-utils</artifactId>
-        <version>1.10-SNAPSHOT</version>
+        <version>1.12-SNAPSHOT</version>
     </parent>
 
     <artifactId>onos-yang-datamodel</artifactId>
-    <version>1.10-SNAPSHOT</version>
+    <version>1.12-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <build>
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
index f8ebda1..5fc301d 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangLeaf.java
@@ -125,7 +125,7 @@
     /**
      * YANG Node in which the leaf is contained.
      */
-    private transient YangLeavesHolder containedIn;
+    private YangLeavesHolder containedIn;
 
     /**
      * List of must statement constraints.
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
index b138fc1..f2ff214 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
@@ -153,6 +153,7 @@
      * node type.
      *
      * @return true if empty data-type is present, false otherwise
+     * @throws DataModelException when fails to do data model operations
      */
     boolean isEmptyDataType() throws DataModelException;
 }
diff --git a/generator/pom.xml b/generator/pom.xml
index 36f6def..49c65b8 100644
--- a/generator/pom.xml
+++ b/generator/pom.xml
@@ -21,11 +21,11 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-yang-utils</artifactId>
-        <version>1.10-SNAPSHOT</version>
+        <version>1.12-SNAPSHOT</version>
     </parent>
 
     <artifactId>onos-yang-utils-generator</artifactId>
-    <version>1.10-SNAPSHOT</version>
+    <version>1.12-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <dependencies>
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
index 724c9cf..bde310d 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/JavaCodeGeneratorUtil.java
@@ -39,40 +39,12 @@
 public final class JavaCodeGeneratorUtil {
 
     /**
-     * Current YANG node.
-     */
-    private static YangNode curNode;
-
-    /**
-     * Root node.
-     */
-    private static YangNode rootNode;
-
-    /**
      * Creates a java code generator utility object.
      */
     private JavaCodeGeneratorUtil() {
     }
 
     /**
-     * Returns current YANG node.
-     *
-     * @return current YANG node
-     */
-    public static YangNode getCurNode() {
-        return curNode;
-    }
-
-    /**
-     * Sets current YANG node.
-     *
-     * @param node current YANG node
-     */
-    public static void setCurNode(YangNode node) {
-        curNode = node;
-    }
-
-    /**
      * Generates Java code files corresponding to the YANG schema.
      *
      * @param rootNode   root node of the data model tree
@@ -84,7 +56,6 @@
             throws TranslatorException, IOException {
 
         YangNode codeGenNode = rootNode;
-        setRootNode(rootNode);
         TraversalType curTraversal = ROOT;
 
         while (codeGenNode != null) {
@@ -94,9 +65,8 @@
                             codeGenNode.getName() + " in " + codeGenNode.getLineNumber() + " at "
                             + codeGenNode.getCharPosition() + " in " + codeGenNode.getFileName());
                 }
-                setCurNode(codeGenNode);
                 try {
-                    generateCodeEntry(codeGenNode, yangPlugin);
+                    generateCodeEntry(codeGenNode, yangPlugin, rootNode);
                     codeGenNode.setNameSpaceAndAddToParentSchemaMap();
                 } catch (InvalidNodeForTranslatorException e) {
                     if (codeGenNode.getNextSibling() != null) {
@@ -109,7 +79,7 @@
                     continue;
                 } catch (Exception e) {
                     e.printStackTrace();
-                    close(codeGenNode, yangPlugin);
+                    close(codeGenNode, yangPlugin, rootNode);
                     throw new TranslatorException(e.getMessage());
                 }
 
@@ -119,20 +89,20 @@
                 codeGenNode = codeGenNode.getChild();
             } else if (codeGenNode.getNextSibling() != null) {
                 try {
-                    generateCodeExit(codeGenNode, yangPlugin);
+                    generateCodeExit(codeGenNode, yangPlugin, rootNode);
                 } catch (Exception e) {
                     e.printStackTrace();
-                    close(codeGenNode, yangPlugin);
+                    close(codeGenNode, yangPlugin, rootNode);
                     throw new TranslatorException(e.getMessage());
                 }
                 curTraversal = SIBILING;
                 codeGenNode = codeGenNode.getNextSibling();
             } else {
                 try {
-                    generateCodeExit(codeGenNode, yangPlugin);
+                    generateCodeExit(codeGenNode, yangPlugin, rootNode);
                 } catch (Exception e) {
                     e.printStackTrace();
-                    close(codeGenNode, yangPlugin);
+                    close(codeGenNode, yangPlugin, rootNode);
                     throw new TranslatorException(e.getMessage());
                 }
                 curTraversal = PARENT;
@@ -146,16 +116,19 @@
      *
      * @param codeGenNode current data model node for which the code needs to be generated
      * @param yangPlugin  YANG plugin config
+     * @param rootNode    YANG root node
      * @throws TranslatorException when fails to generate java code file the current node
      * @throws IOException         when fails to do IO operations
      */
-    private static void generateCodeEntry(YangNode codeGenNode, YangPluginConfig yangPlugin)
+    private static void generateCodeEntry(YangNode codeGenNode,
+                                          YangPluginConfig yangPlugin,
+                                          YangNode rootNode)
             throws TranslatorException, IOException {
 
         if (codeGenNode instanceof JavaCodeGenerator) {
             ((JavaCodeGenerator) codeGenNode).generateCodeEntry(yangPlugin);
         } else {
-            close(codeGenNode, yangPlugin);
+            close(codeGenNode, yangPlugin, rootNode);
             throw new TranslatorException(
                     "Generated data model node cannot be translated to target language code for " +
                             codeGenNode.getName() + " in " + codeGenNode.getLineNumber()
@@ -168,16 +141,19 @@
      *
      * @param codeGenNode  current data model node for which the code needs to be generated
      * @param pluginConfig plugin configurations
+     * @param rootNode     YANG root node
      * @throws TranslatorException when fails to generate java code file the current node
      * @throws IOException         when fails to do IO operations
      */
-    private static void generateCodeExit(YangNode codeGenNode, YangPluginConfig pluginConfig)
+    private static void generateCodeExit(YangNode codeGenNode,
+                                         YangPluginConfig pluginConfig,
+                                         YangNode rootNode)
             throws TranslatorException, IOException {
 
         if (codeGenNode instanceof JavaCodeGenerator) {
             ((JavaCodeGenerator) codeGenNode).generateCodeExit();
         } else {
-            close(codeGenNode, pluginConfig);
+            close(codeGenNode, pluginConfig, rootNode);
             throw new TranslatorException(
                     "Generated data model node cannot be translated to target language code for " +
                             codeGenNode.getName() + " in " + codeGenNode.getLineNumber()
@@ -187,11 +163,12 @@
 
     /**
      * Free other YANG nodes of data-model tree when error occurs while file generation of current node.
+     *
+     * @param freedNode current data model node
      */
-    private static void freeRestResources() {
+    private static void freeRestResources(YangNode freedNode) {
 
-        YangNode freedNode = getCurNode();
-        if (getCurNode() != null) {
+        if (freedNode != null) {
             YangNode tempNode = freedNode;
             TraversalType curTraversal = ROOT;
 
@@ -246,18 +223,16 @@
             throws IOException {
 
         if (rootNode != null) {
-            //Free other resources where translator has failed.
-            freeRestResources();
 
             // Start removing all open files.
             YangNode tempNode = rootNode;
-            setCurNode(tempNode.getChild());
+            YangNode curNode = tempNode.getChild();
             TraversalType curTraversal = ROOT;
 
             while (tempNode != null) {
 
                 if (curTraversal != PARENT) {
-                    close(tempNode, yangPluginConfig);
+                    close(tempNode, yangPluginConfig, rootNode);
                 }
                 if (curTraversal != PARENT && tempNode.getChild() != null) {
                     curTraversal = CHILD;
@@ -271,7 +246,7 @@
                 }
             }
 
-            freeRestResources();
+            freeRestResources(curNode);
         }
     }
 
@@ -280,19 +255,21 @@
      *
      * @param node       current YANG node
      * @param yangPlugin plugin configurations
+     * @param rootNode   YANG root node
      * @throws IOException when fails to do IO operations
      */
-    private static void close(YangNode node, YangPluginConfig yangPlugin)
+    private static void close(YangNode node, YangPluginConfig yangPlugin,
+                              YangNode rootNode)
             throws IOException {
         if (node instanceof JavaCodeGenerator && ((TempJavaCodeFragmentFilesContainer) node)
                 .getTempJavaCodeFragmentFiles() != null) {
             ((TempJavaCodeFragmentFilesContainer) node).getTempJavaCodeFragmentFiles().freeTemporaryResources(true);
         }
-        if (getRootNode() != null) {
-            JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) getRootNode()).getJavaFileInfo();
+        if (rootNode != null) {
+            JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) rootNode).getJavaFileInfo();
             if (javaFileInfo.getPackage() != null) {
                 searchAndDeleteTempDir(javaFileInfo.getBaseCodeGenPath() +
-                        javaFileInfo.getPackageFilePath());
+                                               javaFileInfo.getPackageFilePath());
             } else {
                 searchAndDeleteTempDir(yangPlugin.getCodeGenDir());
             }
@@ -301,24 +278,6 @@
     }
 
     /**
-     * Returns root node.
-     *
-     * @return root node
-     */
-    private static YangNode getRootNode() {
-        return rootNode;
-    }
-
-    /**
-     * Sets root node.
-     *
-     * @param rootNode root node
-     */
-    private static void setRootNode(YangNode rootNode) {
-        JavaCodeGeneratorUtil.rootNode = rootNode;
-    }
-
-    /**
      * Searches child node in data model tree.
      *
      * @param parentNode parent node
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
index 6bcbb1b..39e75c1 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/javamodel/AttributesJavaDataType.java
@@ -320,7 +320,7 @@
                                                   + " in " + type.getFileName());
         }
 
-        if (!(((YangDerivedInfo<?>) var).getReferredTypeDef() != null)) {
+        if ((((YangDerivedInfo<?>) var).getReferredTypeDef() == null)) {
             throw new TranslatorException("derived info is not an instance of typedef. " +
                                                   type.getDataTypeName() + " in " +
                                                   type.getLineNumber() + " at " +
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
index fe6a40b..221f414 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/JavaFileGeneratorUtils.java
@@ -562,7 +562,7 @@
                                              List<String> importsList)
             throws IOException {
 
-        insertDataIntoJavaFile(file, CopyrightHeader.getCopyrightHeader());
+        insertDataIntoJavaFile(file, CopyrightHeader.parseCopyrightHeader());
         insertDataIntoJavaFile(file, pkg);
 
         /*
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index edf0216..e179903 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -1191,7 +1191,7 @@
      * @return interface of add augmentation
      */
     static String getAddAugmentInfoMethodInterface(String className) {
-        StringBuilder builder = new StringBuilder(generateForAddAugmentation());
+        StringBuilder builder = new StringBuilder(generateForAddAugmentation(className));
         LinkedHashMap<String, String> map = new LinkedHashMap<>();
         map.put(VALUE, OBJECT_STRING);
         map.put(CLASS + OBJECT_STRING, CLASS_STRING);
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
index 3e60817..d4904ae 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/SubtreeFilteringMethodsGenerator.java
@@ -1204,21 +1204,38 @@
         return "                    Class<?>[] classArray = " + call + "" +
                 ".getClass()" +
                 ".getInterfaces();\n" +
-                "                    Class<?> caseClass = classArray[0];\n" +
+                "                    Class<?> caseIntf = classArray[0];\n" +
                 "                    try {\n" +
-                "                        Object obj1 = caseClass.newInstance();\n" +
+                "                        ClassLoader classLoader = this" +
+                ".getClass().getClassLoader();\n" +
+                "                        String className = \"Default\" + " +
+                "caseIntf.getSimpleName();\n" +
+                "                        className = caseIntf.getPackage()" +
+                ".getName() + \".\" + className;\n" +
+                "                        Class<?> caseClass = classLoader" +
+                ".loadClass(className);\n" +
+                "                        java.lang.reflect.Constructor<?> " +
+                "constructor = caseClass.getDeclaredConstructor();\n" +
+                "                        constructor.setAccessible(true);\n" +
+                "                        Object obj1 = constructor" +
+                ".newInstance();\n" +
                 "                        java.lang.reflect.Method method =" +
-                " caseClass.getMethod(\"builder\", caseClass);\n" +
-                "                        Object obj = method.invoke(obj1," +
-                " (Object) null);\n" +
-                "                        method = caseClass.getMethod(\"build\", caseClass);\n" +
-                "                        Object obj2 = method.invoke(obj, " +
-                "(Object) null);\n" +
-                "                        method = caseClass.getMethod(\"processSubtreeFiltering\", caseClass);\n" +
+                " caseClass.getMethod(\"builder\");\n" +
+                "                        Object obj = method.invoke(obj1);\n" +
+                "                        Class<?> builderClass = obj.getClass();\n" +
+                "                        method = builderClass.getMethod(\"build\");\n" +
+                "                        Object obj2 = method.invoke(obj);\n" +
+                "                        Class<?> input = this.getClass()" +
+                ".getMethod(" + "\"" + name + "\").getReturnType();\n" +
+                "                        method = caseClass.getMethod" +
+                "(\"processSubtreeFiltering\", input,\n" +
+                "                                     boolean.class);\n" +
                 "                        result = (" + returnType + ") method.invoke" +
                 "(obj2, " + call + ", true);\n" +
                 "                    } catch (NoSuchMethodException | InstantiationException |\n" +
-                "                            IllegalAccessException | InvocationTargetException e) {\n" +
+                "                            IllegalAccessException | " +
+                "InvocationTargetException |\n" +
+                "                            ClassNotFoundException e) {\n" +
                 "                        e.printStackTrace();\n" +
                 "                    }\n";
     }
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index ecc70b6..cd359cd 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -228,6 +228,21 @@
     public static final String PERIOD = ".";
 
     /**
+     * Static attribute for lib.
+     */
+    public static final String LIB = "lib__";
+
+    /**
+     * Static attribute for lib path.
+     */
+    public static final String LIB_PATH = "//lib:";
+
+    /**
+     * Static attribute for output.
+     */
+    public static final String OUT = "__output";
+
+    /**
      * Static attribute for period.
      */
     public static final String ENTRY = "Entry";
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
index 5833de2..8b55768 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeader.java
@@ -37,9 +37,6 @@
     private static final String COPYRIGHTS_FIRST_LINE = "/*\n * Copyright " + Calendar.getInstance().get(Calendar.YEAR)
             + "-present Open Networking Laboratory\n";
     private static final String TEMP_FILE = "temp.txt";
-    private static ClassLoader classLoader = CopyrightHeader.class.getClassLoader();
-
-    private static String copyrightHeader;
 
     /**
      * Creates an instance of copyright header.
@@ -48,40 +45,18 @@
     }
 
     /**
-     * Returns copyright file header.
-     *
-     * @return copyright file header
-     * @throws IOException when fails to parse copyright header
-     */
-    public static String getCopyrightHeader() throws IOException {
-
-        if (copyrightHeader == null) {
-            parseCopyrightHeader();
-        }
-        return copyrightHeader;
-    }
-
-    /**
-     * Sets the copyright header.
-     *
-     * @param header copyright header
-     */
-    private static void setCopyrightHeader(String header) {
-
-        copyrightHeader = header;
-    }
-
-    /**
      * parses Copyright to the temporary file.
      *
+     * @return string of file.
      * @throws IOException when fails to get the copyright header
      */
-    private static void parseCopyrightHeader() throws IOException {
+    public static String parseCopyrightHeader() throws IOException {
 
         File temp = new File(TEMP_FILE);
 
         try {
-            InputStream stream = classLoader.getResourceAsStream(COPYRIGHT_HEADER_FILE);
+            InputStream stream = CopyrightHeader.class.getClassLoader()
+                    .getResourceAsStream(COPYRIGHT_HEADER_FILE);
             OutputStream out = new FileOutputStream(temp);
 
             int index;
@@ -91,8 +66,7 @@
             }
             out.close();
             stream.close();
-            getStringFileContent(temp);
-            setCopyrightHeader(getStringFileContent(temp));
+            return getStringFileContent(temp);
         } catch (IOException e) {
             throw new IOException("failed to parse the Copyright header");
         } finally {
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
index 5c499db..8c8e794 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -585,16 +585,17 @@
     /**
      * Generates javaDocs for add augmentation method.
      *
+     * @param name builder class name
      * @return javaDocs
      */
-    public static String generateForAddAugmentation() {
+    public static String generateForAddAugmentation(String name) {
         return getJavaDocStartLine(YANG_AUGMENTED_INFO_LOWER_CASE,
                                    JAVA_DOC_SETTERS_COMMON) +
                 getJavaDocEmptyAsteriskLine() +
                 getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, VALUE) +
                 getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, CLASS +
                         OBJECT_STRING) +
-                getJavaDocEndLine();
+                getJavaDocReturnLine(name) + getJavaDocEndLine();
     }
 
     /**
@@ -667,7 +668,9 @@
                     break;
             }
         }
-        javadoc.append(getJavaDocReturnLine(BUILDER_OBJECT + attribute))
+        javadoc.append(getJavaDocParamLine(
+                attribute, ADD_STRING + TO_CAPS))
+                .append(getJavaDocReturnLine(BUILDER_OBJECT + attribute))
                 .append(getJavaDocEndLine());
         return javadoc.toString();
     }
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
index a03ebb4..15051cb 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -68,7 +68,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.UNDER_SCORE;
 import static org.onosproject.yangutils.utils.UtilConstants.UNUSED;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_AUTO_PREFIX;
-import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
+import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.parseCopyrightHeader;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.appendFileContents;
 import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
 import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.PACKAGE_INFO;
@@ -134,7 +134,7 @@
             FileWriter fileWriter = new FileWriter(packageInfo);
             BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
 
-            bufferedWriter.write(getCopyrightHeader());
+            bufferedWriter.write(parseCopyrightHeader());
             //TODO: get the compiler annotations and pass the info
             bufferedWriter.write(getJavaDoc(PACKAGE_INFO, classInfo, isChildNode,
                                             null));
@@ -688,7 +688,8 @@
      * @param conflictResolver object of YANG to java naming conflict util
      * @return camel case rule checked string
      */
-    private static String applyCamelCaseRule(String[] stringArray, YangToJavaNamingConflictUtil conflictResolver) {
+    private static String applyCamelCaseRule(String[] stringArray,
+                                             YangToJavaNamingConflictUtil conflictResolver) {
 
         String ruleChecker = stringArray[0].toLowerCase();
         int i;
diff --git a/parser/pom.xml b/parser/pom.xml
index 8520981..993eb6a 100644
--- a/parser/pom.xml
+++ b/parser/pom.xml
@@ -21,11 +21,11 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-yang-utils</artifactId>
-        <version>1.10-SNAPSHOT</version>
+        <version>1.12-SNAPSHOT</version>
     </parent>
 
     <artifactId>onos-yang-utils-parser</artifactId>
-    <version>1.10-SNAPSHOT</version>
+    <version>1.12-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <dependencies>
diff --git a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
index 493ec09..17ec860 100644
--- a/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
+++ b/parser/src/main/java/org/onosproject/yangutils/parser/impl/parserutils/ListenerUtil.java
@@ -91,10 +91,6 @@
     private static final String REGEX_EQUAL = "[=]";
     private static final String REGEX_OPEN_BRACE = "[(]";
 
-    private static YangConstructType pathType;
-    private static PathStatementContext pathCtx;
-    private static YangLeafRef yangLeafRef;
-
     // No instantiation.
     private ListenerUtil() {
     }
@@ -124,7 +120,9 @@
      * @param ctx           yang construct's context to get the line number and character position
      * @return concatenated string after removing double quotes
      */
-    public static String getValidIdentifier(String identifier, YangConstructType yangConstruct, ParserRuleContext ctx) {
+    public static String getValidIdentifier(String identifier,
+                                            YangConstructType yangConstruct,
+                                            ParserRuleContext ctx) {
 
         String identifierString = removeQuotesAndHandleConcat(identifier);
         ParserException parserException;
@@ -713,33 +711,33 @@
                                     YangLeafRef leafRef) {
 
         String concatPath = removeQuotesAndHandleConcat(path);
-        pathType = type;
-        pathCtx = ctx;
-        yangLeafRef = leafRef;
         if (!concatPath.startsWith(SLASH_FOR_STRING) &&
                 !concatPath.startsWith(ANCESTOR)) {
-            throw getPathException();
+            throw getPathException(ctx, leafRef);
         }
         leafRef.setPath(concatPath);
         if (concatPath.startsWith(SLASH_FOR_STRING)) {
             List<YangAtomicPath> atomicList = new LinkedList<>();
-            valAbsPath(concatPath, atomicList);
+            valAbsPath(concatPath, atomicList, ctx, leafRef, type);
             leafRef.setPathType(ABSOLUTE_PATH);
             valPrefix(atomicList, leafRef);
             leafRef.setAtomicPath(atomicList);
             return;
         }
         leafRef.setPathType(RELATIVE_PATH);
-        valRelPath(concatPath, leafRef);
+        valRelPath(concatPath, leafRef, ctx, type);
     }
 
     /**
      * Validates relative path, parses the string and stores it in the leaf-ref.
      *
-     * @param path    leaf-ref path
-     * @param leafRef YANG leaf-ref
+     * @param path     leaf-ref path
+     * @param leafRef  YANG leaf-ref data model information
+     * @param pathType yang construct for creating error message
      */
-    private static void valRelPath(String path, YangLeafRef leafRef) {
+    private static void valRelPath(String path, YangLeafRef leafRef,
+                                   PathStatementContext pathCtx,
+                                   YangConstructType pathType) {
 
         YangRelativePath relPath = new YangRelativePath();
         int count = 0;
@@ -748,12 +746,13 @@
             count = count + 1;
         }
         if (path.isEmpty()) {
-            throw getPathException();
+            throw getPathException(pathCtx, leafRef);
         }
 
         List<YangAtomicPath> atomicList = new ArrayList<>();
         relPath.setAncestorNodeCount(count);
-        valAbsPath(SLASH_FOR_STRING + path, atomicList);
+        valAbsPath(SLASH_FOR_STRING + path, atomicList, pathCtx, leafRef,
+                   pathType);
         valPrefix(atomicList, leafRef);
         relPath.setAtomicPathList(atomicList);
         leafRef.setRelativePath(relPath);
@@ -762,23 +761,30 @@
     /**
      * Validates absolute path, parses the string and stores it in leaf-ref.
      *
-     * @param path    leaf-ref path
-     * @param atomics atomic content list
+     * @param path        leaf-ref path
+     * @param atomics     atomic content list
+     * @param pathCtx     path statement context
+     * @param yangLeafRef YANG leaf ref
+     * @param pathType    yang construct for creating error message
      */
-    private static void valAbsPath(String path, List<YangAtomicPath> atomics) {
+    private static void valAbsPath(String path, List<YangAtomicPath> atomics,
+                                   PathStatementContext pathCtx,
+                                   YangLeafRef yangLeafRef,
+                                   YangConstructType pathType) {
 
         String comPath = path;
         while (comPath != null) {
             comPath = comPath.substring(1);
             if (comPath.isEmpty()) {
-                throw getPathException();
+                throw getPathException(pathCtx, yangLeafRef);
             }
             int nodeId = comPath.indexOf(CHAR_OF_SLASH);
             int predicate = comPath.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
             if (predicate < nodeId && predicate != -1) {
-                comPath = getPathWithPredicate(comPath, atomics);
+                comPath = getPathWithPredicate(comPath, atomics,
+                                               pathCtx, yangLeafRef, pathType);
             } else {
-                comPath = getPath(comPath, atomics);
+                comPath = getPath(comPath, atomics, pathType, pathCtx);
             }
         }
     }
@@ -787,38 +793,53 @@
      * Returns the remaining path after parsing and the predicates of an atomic
      * content.
      *
-     * @param path    leaf-ref path
-     * @param atomics atomic content list
+     * @param path        leaf-ref path
+     * @param atomics     atomic content list
+     * @param pathCtx     yang construct's context to get the line number and
+     *                    character position
+     * @param yangLeafRef YANG leaf-ref data model information
+     * @param pathType    yang construct for creating error message
      * @return parsed path after removing one atomic content.
      */
     private static String getPathWithPredicate(String path,
-                                               List<YangAtomicPath> atomics) {
+                                               List<YangAtomicPath> atomics,
+                                               PathStatementContext pathCtx,
+                                               YangLeafRef yangLeafRef,
+                                               YangConstructType pathType) {
 
         String[] node = new String[2];
         int bracket = path.indexOf(CHAR_OF_OPEN_SQUARE_BRACKET);
         node[0] = path.substring(0, bracket);
         node[1] = path.substring(bracket);
-        return getParsedPath(node[0], node[1], atomics);
+        return getParsedPath(node[0], node[1], atomics, pathCtx, yangLeafRef,
+                             pathType);
     }
 
     /**
      * Returns the path after taking all the path predicates of an atomic
      * content.
      *
-     * @param nodeId  atomic content nodeId
-     * @param path    leaf-ref path
-     * @param atomics atomic content list
+     * @param nodeId      atomic content nodeId
+     * @param path        leaf-ref path
+     * @param atomics     atomic content list
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
+     * @param pathType    yang construct for creating error message
      * @return parsed path after removing one atomic content.
      */
     public static String getParsedPath(String nodeId, String path,
-                                       List<YangAtomicPath> atomics) {
+                                       List<YangAtomicPath> atomics,
+                                       PathStatementContext pathCtx,
+                                       YangLeafRef yangLeafRef,
+                                       YangConstructType pathType) {
 
         String comPath = path;
         List<String> predicateList = new ArrayList<>();
         while (comPath.startsWith(OPEN_SQUARE_BRACKET)) {
             String matchedVal = getMatchedPredicate(comPath);
             if (matchedVal == null || matchedVal.isEmpty()) {
-                throw getPathException();
+                throw getPathException(pathCtx, yangLeafRef);
             }
             predicateList.add(matchedVal);
             comPath = comPath.substring(matchedVal.length());
@@ -828,7 +849,9 @@
         YangNodeIdentifier validId =
                 getValidNodeIdentifier(nodeId, pathType, pathCtx);
 
-        List<YangPathPredicate> predicates = valPathPredicates(predicateList);
+        List<YangPathPredicate> predicates = valPathPredicates(predicateList,
+                                                               pathType,
+                                                               pathCtx, yangLeafRef);
         atomicPath.setNodeIdentifier(validId);
         atomicPath.setPathPredicatesList(predicates);
         atomics.add(atomicPath);
@@ -839,15 +862,22 @@
      * Validates the path predicates of an atomic content after parsing the
      * predicates and storing it in the leaf-ref.
      *
-     * @param predicates list of predicates
+     * @param predicates  list of predicates
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return list of path predicates of an atomic content
      */
-    private static List<YangPathPredicate> valPathPredicates(List<String> predicates) {
+    private static List<YangPathPredicate> valPathPredicates(List<String> predicates,
+                                                             YangConstructType pathType,
+                                                             PathStatementContext pathCtx,
+                                                             YangLeafRef yangLeafRef) {
 
         List<YangPathPredicate> result = new ArrayList<>();
         for (String p : predicates) {
             p = p.substring(1, p.length() - 1);
-            result.add(valPathEqualityExp(p.trim()));
+            result.add(valPathEqualityExp(p.trim(), pathType, pathCtx, yangLeafRef));
         }
         return result;
     }
@@ -856,15 +886,23 @@
      * Validates the path equality expression of a path predicate and after
      * parsing the string assigns it to the YANG path predicate.
      *
-     * @param predicate path predicate
+     * @param predicate   path predicate
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return YANG path predicate
      */
-    private static YangPathPredicate valPathEqualityExp(String predicate) {
+    private static YangPathPredicate valPathEqualityExp(String predicate,
+                                                        YangConstructType pathType,
+                                                        PathStatementContext pathCtx,
+                                                        YangLeafRef yangLeafRef) {
 
         String[] exp = predicate.split(REGEX_EQUAL);
         YangNodeIdentifier nodeId =
                 getValidNodeIdentifier(exp[0].trim(), pathType, pathCtx);
-        YangRelativePath relPath = valPathKeyExp(exp[1].trim());
+        YangRelativePath relPath = valPathKeyExp(exp[1].trim(), pathType,
+                                                 pathCtx, yangLeafRef);
 
         YangPathPredicate pathPredicate = new YangPathPredicate();
         pathPredicate.setNodeId(nodeId);
@@ -877,10 +915,17 @@
      * Validates the path key expression of the path-predicate and stores it
      * in the relative path of the leaf-ref.
      *
-     * @param relPath relative path
+     * @param relPath     relative path
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return YANG relative path
      */
-    private static YangRelativePath valPathKeyExp(String relPath) {
+    private static YangRelativePath valPathKeyExp(String relPath,
+                                                  YangConstructType pathType,
+                                                  PathStatementContext pathCtx,
+                                                  YangLeafRef yangLeafRef) {
 
         String[] relative = relPath.split(SLASH_FOR_STRING);
         int count = 0;
@@ -895,7 +940,9 @@
 
         YangRelativePath relativePath = new YangRelativePath();
         relativePath.setAncestorNodeCount(count);
-        relativePath.setAtomicPathList(valRelPathKeyExp(atomicContent));
+        relativePath.setAtomicPathList(valRelPathKeyExp(atomicContent,
+                                                        pathType,
+                                                        pathCtx, yangLeafRef));
         return relativePath;
     }
 
@@ -903,16 +950,23 @@
      * Validates relative path key expression in the right relative path of
      * the path predicate, by taking every atomic content in it.
      *
-     * @param content atomic content list
+     * @param content     atomic content list
+     * @param pathType    yang construct for creating error message
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return YANG atomic content list
      */
-    private static List<YangAtomicPath> valRelPathKeyExp(List<String> content) {
+    private static List<YangAtomicPath> valRelPathKeyExp(List<String> content,
+                                                         YangConstructType pathType,
+                                                         PathStatementContext pathCtx,
+                                                         YangLeafRef yangLeafRef) {
 
         String current = content.get(0);
         String[] curStr = (current.trim()).split(REGEX_OPEN_BRACE);
         if (!(curStr[0].trim().equals(CURRENT)) ||
                 !(curStr[1].trim().equals(CLOSE_PARENTHESIS))) {
-            throw getPathException();
+            throw getPathException(pathCtx, yangLeafRef);
         }
 
         content.remove(0);
@@ -933,9 +987,14 @@
      *
      * @param path       leaf-ref path
      * @param atomicList atomic content list
+     * @param pathType   yang construct for creating error message
+     * @param pathCtx    yang construct's context to get the line number
+     *                   and character position
      * @return remaining path after parsing one atomic content
      */
-    public static String getPath(String path, List<YangAtomicPath> atomicList) {
+    public static String getPath(String path, List<YangAtomicPath> atomicList,
+                                 YangConstructType pathType,
+                                 PathStatementContext pathCtx) {
 
         String comPath = path;
         String nodeId;
@@ -958,9 +1017,13 @@
     /**
      * Returns the path syntax parser exception.
      *
+     * @param pathCtx     yang construct's context to get the line number
+     *                    and character position
+     * @param yangLeafRef YANG leaf-ref data model information
      * @return parser exception
      */
-    private static ParserException getPathException() {
+    private static ParserException getPathException(PathStatementContext pathCtx,
+                                                    YangLeafRef yangLeafRef) {
         ParserException exception = new ParserException(
                 "YANG file error : Path " + yangLeafRef.getPath() +
                         " does not follow valid path syntax");
diff --git a/plugin/buck/pom.xml b/plugin/buck/pom.xml
index fd1cca9..783e897 100644
--- a/plugin/buck/pom.xml
+++ b/plugin/buck/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-yang-plugins</artifactId>
-        <version>1.10-SNAPSHOT</version>
+        <version>1.12-SNAPSHOT</version>
     </parent>
 
     <artifactId>onos-yang-buck-plugin</artifactId>
@@ -34,6 +34,11 @@
             <version>0.1-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-yang-tool</artifactId>
+            <version>1.12-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
index 583ecaf..b14a54a 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
@@ -16,41 +16,82 @@
 
 package org.onosproject.yangutils.plugin.buck;
 
+import org.onosproject.yangutils.datamodel.YangNode;
+import org.onosproject.yangutils.tool.CallablePlugin;
+import org.onosproject.yangutils.tool.YangToolManager;
+import org.onosproject.yangutils.utils.io.YangPluginConfig;
+
 import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
-import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
-import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorUtil;
-import org.onosproject.yangutils.utils.io.YangPluginConfig;
-import org.onosproject.yangutils.datamodel.YangNode;
+import static java.util.stream.Collectors.toList;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.parseJarFile;
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG_RESOURCES;
 
 /**
  * Generates Java sources from a Yang model.
  */
-public class YangGenerator {
+public class YangGenerator implements CallablePlugin {
 
     private final List<File> models;
+    private final List<String> depJar;
     private String outputDirectory;
+    private final String DEFAULT_JAR_RES_PATH = SLASH + YANG_RESOURCES + SLASH;
 
-    public YangGenerator(List<File> models, String outputDirectory) {
+    YangGenerator(List<File> models, String outputDirectory, List<String> depJar) {
         this.models = models;
-        this.outputDirectory = outputDirectory + "/";
+        this.depJar = depJar;
+        this.outputDirectory = outputDirectory + SLASH;
     }
 
     public void execute() throws YangParsingException {
-        for (File model : models) {
+        List<String> files = getListOfFile();
+        synchronized (files) {
             try {
                 YangPluginConfig config = new YangPluginConfig();
                 config.setCodeGenDir(outputDirectory);
-
-                YangNode yangNode = new YangUtilsParserManager()
-                        .getDataModel(model.toString());
-
-                JavaCodeGeneratorUtil.generateJavaCode(yangNode, config);
+                config.resourceGenDir(outputDirectory + DEFAULT_JAR_RES_PATH);
+                //for inter-jar linking.
+                List<YangNode> dependentSchema = new ArrayList<>();
+                for (String jar : depJar) {
+                    dependentSchema.addAll(parseJarFile(jar, outputDirectory));
+                }
+                //intra jar file linking.
+                YangToolManager manager = new YangToolManager();
+                manager.compileYangFiles(manager.createYangFileInfoSet(files),
+                                         dependentSchema, config, this);
             } catch (Exception e) {
                 throw new YangParsingException(e);
             }
         }
     }
 
+    private List<String> getListOfFile() {
+        List<String> files = new ArrayList<>();
+        if (models != null) {
+            synchronized (models) {
+                files.addAll(models.stream().map(File::toString)
+                                     .collect(toList()));
+            }
+        }
+        return files;
+    }
+
+    @Override
+    public void addGeneratedCodeToBundle() {
+        //TODO: add functionality.
+    }
+
+    @Override
+    public void addCompiledSchemaToBundle() throws IOException {
+        //TODO: add functionality.
+    }
+
+    @Override
+    public void addYangFilesToBundle() throws IOException {
+        //TODO: add functionality.
+    }
 }
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
index 8db806b..5d0550c 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
@@ -16,13 +16,6 @@
 
 package org.onosproject.yangutils.plugin.buck;
 
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.annotation.Nullable;
-
 import com.facebook.buck.jvm.java.JarDirectoryStep;
 import com.facebook.buck.model.BuildTargets;
 import com.facebook.buck.rules.AbstractBuildRule;
@@ -39,6 +32,16 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSortedSet;
 
+import javax.annotation.Nullable;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG;
+
 /**
  * Buck rule to define a library built form a Yang model.
  */
@@ -46,7 +49,8 @@
 
     @AddToRuleKey
     private final ImmutableSortedSet<SourcePath> srcs;
-    
+    private final BuildRuleParams params;
+
     private final Path genSrcsDirectory;
     private final Path outputDirectory;
     private final Path output;
@@ -57,7 +61,7 @@
             ImmutableSortedSet<SourcePath> srcs) {
         super(params, resolver);
         this.srcs = srcs;
-
+        this.params = params;
         genSrcsDirectory = BuildTargets.getGenPath(getProjectFilesystem(),
                                                    params.getBuildTarget(),
                                                    "%s__yang-gen");
@@ -91,7 +95,8 @@
                 .map(s -> getResolver().getRelativePath(s))
                 .collect(Collectors.toList());
 
-        steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory));
+        steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory,
+                               params.getDeps()));
 
         steps.add(new JarDirectoryStep(
                 getProjectFilesystem(),
@@ -108,4 +113,17 @@
     public Path getPathToOutput() {
         return output;
     }
+
+
+    /**
+     * Returns generated sources directory.
+     *
+     * @return generated sources directory
+     */
+    public Path getGenSrcsDirectory() {
+        File dir = new File(genSrcsDirectory.toString() + SLASH + YANG);
+        dir.mkdirs();
+        return genSrcsDirectory;
+    }
+
 }
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
index 29d4225..83b1370 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
@@ -16,10 +16,6 @@
 
 package org.onosproject.yangutils.plugin.buck;
 
-import java.nio.file.Path;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
 import com.facebook.buck.cli.BuckConfig;
 import com.facebook.buck.jvm.java.CalculateAbi;
 import com.facebook.buck.jvm.java.DefaultJavaLibrary;
@@ -43,6 +39,7 @@
 import com.facebook.buck.rules.BuildRuleType;
 import com.facebook.buck.rules.BuildTargetSourcePath;
 import com.facebook.buck.rules.Description;
+import com.facebook.buck.rules.PathSourcePath;
 import com.facebook.buck.rules.SourcePath;
 import com.facebook.buck.rules.SourcePathResolver;
 import com.facebook.buck.rules.SourcePaths;
@@ -53,6 +50,14 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedSet;
 
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG;
+
 /**
  * Description of a Buck Yang Library.
  */
@@ -94,7 +99,6 @@
         BuildRuleParams yangParams = params.copyWithBuildTarget(
                 BuildTargets.createFlavoredBuildTarget(
                         unflavoredBuildTarget, SOURCES));
-
         BuildRule yangLib = resolver.addToIndex(new YangLibrary(yangParams, pathResolver, args.srcs));
 
         if (params.getBuildTarget().getFlavors().contains(SOURCES)) {
@@ -126,13 +130,21 @@
 
         BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
 
+        //Add yang meta data resources to generated jar file resources.
+
+        Path rscRoot = ((YangLibrary) yangLib).getGenSrcsDirectory();
+        Path resPath = Paths.get(rscRoot + SLASH + YANG);
+
+        SourcePath path = new PathSourcePath(params.getProjectFilesystem(),
+                                             resPath);
+
         DefaultJavaLibrary library =
                 resolver.addToIndex(
                         new DefaultJavaLibrary(
                                 javaParams,
                                 pathResolver,
                                 ImmutableSet.of(SourcePaths.getToBuildTargetSourcePath().apply(yangLib)),
-                                /* resources */ ImmutableSet.<SourcePath>of(),
+                                /* resources */ImmutableSet.of(path),
                                 javacOptions.getGeneratedSourceFolderName(),
                                 /* proguardConfig */ Optional.<SourcePath>absent(),
                                 /* postprocessClassesCommands */ ImmutableList.<String>of(),
@@ -142,7 +154,7 @@
                                 javacOptions.trackClassUsage(),
                                 /* additionalClasspathEntries */ ImmutableSet.<Path>of(),
                                 new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
-                                /* resourcesRoot */ Optional.<Path>absent(),
+                                /* resourcesRoot */ Optional.<Path>of(rscRoot),
                                 /* manifestFile */ Optional.absent(),
                                 /* mavenCoords */ Optional.<String>absent(),
                                 /* tests */ ImmutableSortedSet.<BuildTarget>of(),
@@ -169,4 +181,5 @@
 
         //TODO other params here
     }
+
 }
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
index ae84cc3..d795d8c 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
@@ -15,16 +15,27 @@
  */
 package org.onosproject.yangutils.plugin.buck;
 
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.stream.Collectors;
-
 import com.facebook.buck.io.ProjectFilesystem;
+import com.facebook.buck.model.UnflavoredBuildTarget;
+import com.facebook.buck.rules.BuildRule;
 import com.facebook.buck.step.AbstractExecutionStep;
 import com.facebook.buck.step.ExecutionContext;
 import com.facebook.buck.step.StepExecutionResult;
+import com.google.common.collect.ImmutableSortedSet;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.JAR;
+import static org.onosproject.yangutils.utils.UtilConstants.LIB;
+import static org.onosproject.yangutils.utils.UtilConstants.LIB_PATH;
+import static org.onosproject.yangutils.utils.UtilConstants.OUT;
+import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
 
 /**
  * Buck build step to trigger Yang Java source file generation.
@@ -32,17 +43,18 @@
 public class YangStep extends AbstractExecutionStep {
 
     private static final String DESCRIPTION = "yang-compile";
-
+    private final ImmutableSortedSet<BuildRule> deps;
     private final ProjectFilesystem filesystem;
     private final List<Path> srcs;
     private final Path output;
 
     YangStep(ProjectFilesystem filesystem,
              List<Path> srcs,
-             Path genSourcesDirectory) {
+             Path genSourcesDirectory, ImmutableSortedSet<BuildRule> deps) {
         super(DESCRIPTION);
         this.filesystem = filesystem;
         this.srcs = srcs;
+        this.deps = deps;
         this.output = genSourcesDirectory;
     }
 
@@ -52,13 +64,42 @@
 
         List<File> sourceFiles = srcs.stream().map(Path::toFile)
                 .collect(Collectors.toList());
-
         try {
-            new YangGenerator(sourceFiles, output.toString()).execute();
+            new YangGenerator(sourceFiles, output.toString(), getJarPaths())
+                    .execute();
             return StepExecutionResult.SUCCESS;
-        } catch(YangParsingException e) {
+        } catch (YangParsingException e) {
             executionContext.getConsole().printErrorText(e.getMessage());
             return StepExecutionResult.ERROR;
         }
     }
+
+    private List<String> getJarPaths() {
+        StringBuilder builder;
+        List<String> depJarPaths = new ArrayList<>();
+        String[] array;
+        UnflavoredBuildTarget uBt;
+        if (deps != null) {
+            for (BuildRule rule : deps) {
+                if (!rule.getBuildTarget().getFullyQualifiedName()
+                        .contains(LIB_PATH)) {
+                    builder = new StringBuilder();
+                    //build absolute path for jar file
+                    builder.append(filesystem.getRootPath().toString()).append(SLASH)
+                            .append(filesystem.getBuckPaths().getGenDir())
+                            .append(SLASH);
+                    uBt = rule.getBuildTarget().getUnflavoredBuildTarget();
+                    array = uBt.getBaseName().split(SLASH);
+                    for (int i = 2; i < array.length; i++) {
+                        builder.append(array[i]).append(SLASH);
+                    }
+                    builder.append(LIB).append(uBt.getShortName())
+                            .append(OUT).append(SLASH)
+                            .append(uBt.getShortName()).append(PERIOD + JAR);
+                    depJarPaths.add(builder.toString());
+                }
+            }
+        }
+        return depJarPaths;
+    }
 }
diff --git a/plugin/maven/pom.xml b/plugin/maven/pom.xml
index 9ad8b88..db4920b 100644
--- a/plugin/maven/pom.xml
+++ b/plugin/maven/pom.xml
@@ -21,11 +21,11 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-yang-plugins</artifactId>
-        <version>1.10-SNAPSHOT</version>
+        <version>1.12-SNAPSHOT</version>
     </parent>
 
     <artifactId>onos-yang-maven-plugin</artifactId>
-    <version>1.10-SNAPSHOT</version>
+    <version>1.12-SNAPSHOT</version>
     <packaging>maven-plugin</packaging>
 
     <dependencies>
@@ -92,12 +92,12 @@
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-yang-tool</artifactId>
-            <version>1.10-SNAPSHOT</version>
+            <version>1.12-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-yang-utils-parser</artifactId>
-            <version>1.10-SNAPSHOT</version>
+            <version>1.12-SNAPSHOT</version>
         </dependency>
     </dependencies>
 
diff --git a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index 1e38d88..33e8f64 100644
--- a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -40,7 +40,6 @@
 import org.onosproject.yangutils.tool.exception.YangToolException;
 import org.onosproject.yangutils.utils.io.YangPluginConfig;
 import org.onosproject.yangutils.utils.io.YangToJavaNamingConflictUtil;
-import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
 import java.io.IOException;
@@ -69,6 +68,7 @@
 import static org.onosproject.yangutils.utils.UtilConstants.TEMP;
 import static org.onosproject.yangutils.utils.UtilConstants.VERSION_ERROR;
 import static org.onosproject.yangutils.utils.UtilConstants.YANG_RESOURCES;
+import static org.onosproject.yangutils.utils.io.impl.YangFileScanner.getYangFiles;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.deleteDirectory;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getDirectory;
 import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage;
@@ -222,19 +222,17 @@
              * Obtain the YANG files at a path mentioned in plugin and creates
              * YANG file information set.
              */
-            createYangFileInfoSet(YangFileScanner.getYangFiles(searchDir));
 
             YangToolManager toolManager = new YangToolManager();
+
+            yangFileInfoSet = toolManager.createYangFileInfoSet(
+                    getYangFiles(searchDir));
             List<YangNode> interJarResolvedNodes =
                     resolveInterJarDependencies(project, localRepository,
                                                 remoteRepository, outputDir);
-            System.out.println("going to call tool manager");
             toolManager.compileYangFiles(yangFileInfoSet,
                                          interJarResolvedNodes, yangPlugin,
                                          this);
-            System.out.println("called tool manager");
-
-
         } catch (YangToolException e) {
             String fileName = EMPTY_STRING;
             if (e.getCurYangFile() != null) {
diff --git a/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java b/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
index 40ac92c..d7da436 100644
--- a/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
+++ b/plugin/maven/src/test/java/org/onosproject/yangutils/utils/io/impl/CopyrightHeaderTest.java
@@ -33,7 +33,7 @@
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertThat;
-import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.getCopyrightHeader;
+import static org.onosproject.yangutils.utils.io.impl.CopyrightHeader.parseCopyrightHeader;
 
 /**
  * Unit Tests for the CopyrightHeader contents.
@@ -89,7 +89,7 @@
             out.write(c);
         }
 
-        String licenseHeader = getCopyrightHeader();
+        String licenseHeader = parseCopyrightHeader();
         File test = new File("target/TestCopyrightHeader.txt");
 
         FileWriter writer = new FileWriter(test);
diff --git a/plugin/pom.xml b/plugin/pom.xml
index d3526bd..d9f7d3f 100644
--- a/plugin/pom.xml
+++ b/plugin/pom.xml
@@ -21,11 +21,11 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-yang-utils</artifactId>
-        <version>1.10-SNAPSHOT</version>
+        <version>1.12-SNAPSHOT</version>
     </parent>
 
     <artifactId>onos-yang-plugins</artifactId>
-    <version>1.10-SNAPSHOT</version>
+    <version>1.12-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <properties>
diff --git a/plugin/tool/pom.xml b/plugin/tool/pom.xml
index b0209a2..dda6608 100644
--- a/plugin/tool/pom.xml
+++ b/plugin/tool/pom.xml
@@ -23,11 +23,11 @@
     <parent>
         <groupId>org.onosproject</groupId>
         <artifactId>onos-yang-plugins</artifactId>
-        <version>1.10-SNAPSHOT</version>
+        <version>1.12-SNAPSHOT</version>
     </parent>
 
     <artifactId>onos-yang-tool</artifactId>
-    <version>1.10-SNAPSHOT</version>
+    <version>1.12-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <dependencies>
diff --git a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
index 3f44863..21dd05b 100644
--- a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
+++ b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
@@ -23,6 +23,7 @@
  * will be used in by tool to be plugin agnostic.
  */
 public interface CallablePlugin {
+
     /**
      * Adds generated source directory to the compilation root.
      */
@@ -32,6 +33,7 @@
      * serialize the compiled schema and place it in the appropriate location
      * so that it will be part of the generated OSGi bundle.
      *
+     * @throws IOException when fails to do IO operations
      */
     void addCompiledSchemaToBundle()
             throws IOException;
@@ -41,6 +43,7 @@
      * Add the YANG files in the bundle, to support YANG display in protocols
      * like RESTCONF.
      *
+     * @throws IOException when fails to do IO operations
      */
     void addYangFilesToBundle() throws IOException;
 }
diff --git a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
index 0853775..4e5d44e 100644
--- a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
+++ b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
@@ -94,99 +94,121 @@
     }
 
     /**
+     * Creates a YANG file info set.
+     *
+     * @param yangFileList YANG files list
+     * @return yang file info set
+     */
+    public Set<YangFileInfo> createYangFileInfoSet(List<String> yangFileList) {
+        if (yangFileInfoSet == null) {
+            yangFileInfoSet = new HashSet<>();
+        }
+        for (String yangFile : yangFileList) {
+            YangFileInfo yangFileInfo = new YangFileInfo();
+            yangFileInfo.setYangFileName(yangFile);
+            yangFileInfoSet.add(yangFileInfo);
+        }
+        return yangFileInfoSet;
+    }
+
+    /**
      * Compile te YANG files and generate the corresponding Java files.
      * Update the generated bundle with the schema metadata.
      *
-     * @param yangFiles Application YANG files
-     * @param config    tool configuration
-     * @param plugin    invoking plugin
+     * @param yangFiles       Application YANG files
+     * @param dependentSchema inter jar linked schema nodes
+     * @param config          tool configuration
+     * @param plugin          invoking plugin
+     * @throws IOException when fails to do IO operations
      */
     public void compileYangFiles(Set<YangFileInfo> yangFiles,
                                  List<YangNode> dependentSchema,
                                  YangPluginConfig config,
                                  CallablePlugin plugin) throws IOException {
 
-        try {
+        synchronized (yangFiles) {
+            try {
 
-            if (config == null || yangFiles == null) {
-                throw new YangToolException(E_MISSING_INPUT);
-            }
-            yangFileInfoSet = yangFiles;
-
-            if (config.getCodeGenDir() == null) {
-                throw new YangToolException(E_CODE_GEN_PATH);
-            }
-
-            // Check if there are any file to translate, if not return.
-            if (yangFileInfoSet == null || yangFileInfoSet.isEmpty()) {
-                // No files to translate
-                return;
-            }
-
-            createDirectories(config.resourceGenDir());
-
-            // Resolve inter jar dependency.
-            addSchemaToFileSet(dependentSchema);
-
-
-            // Carry out the parsing for all the YANG files.
-            parseYangFileInfoSet();
-
-            // Resolve dependencies using linker.
-            resolveDependenciesUsingLinker();
-
-            // Perform translation to JAVA.
-            translateToJava(config);
-
-            // Serialize data model.
-            Set<YangNode> compiledSchemas = new HashSet<>();
-            for (YangFileInfo fileInfo : yangFileInfoSet) {
-                compiledSchemas.add(fileInfo.getRootNode());
-            }
-
-            String serFileName = config.resourceGenDir() + YANG_META_DATA + SERIALIZED_FILE_EXTENSION;
-            FileOutputStream fileOutputStream = new FileOutputStream(serFileName);
-            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
-            objectOutputStream.writeObject(compiledSchemas);
-            objectOutputStream.close();
-            fileOutputStream.close();
-
-
-            //add YANG files to JAR
-            List<File> files = getListOfFile(yangFileInfoSet);
-            String path = config.resourceGenDir();
-            File targetDir = new File(path);
-            targetDir.mkdirs();
-
-            for (File file : files) {
-                Files.copy(file.toPath(),
-                           new File(path + file.getName()).toPath(),
-                           StandardCopyOption.REPLACE_EXISTING);
-            }
-
-            if (plugin != null) {
-                plugin.addCompiledSchemaToBundle();
-                plugin.addGeneratedCodeToBundle();
-                plugin.addYangFilesToBundle();
-            }
-
-        } catch (IOException | ParserException e) {
-            YangToolException exception =
-                    new YangToolException(e.getMessage(), e);
-            exception.setCurYangFile(curYangFileInfo);
-
-            if (curYangFileInfo != null &&
-                    curYangFileInfo.getRootNode() != null) {
-                try {
-                    translatorErrorHandler(curYangFileInfo.getRootNode(),
-                                           config);
-                } catch (IOException ex) {
-                    e.printStackTrace();
-                    throw ex;
+                if (config == null) {
+                    throw new YangToolException(E_MISSING_INPUT);
                 }
-            }
+                yangFileInfoSet = yangFiles;
 
-            throw exception;
+                if (config.getCodeGenDir() == null) {
+                    throw new YangToolException(E_CODE_GEN_PATH);
+                }
+
+                // Check if there are any file to translate, if not return.
+                if (yangFileInfoSet == null || yangFileInfoSet.isEmpty()) {
+                    // No files to translate
+                    return;
+                }
+
+                createDirectories(config.resourceGenDir());
+
+                // Resolve inter jar dependency.
+                addSchemaToFileSet(dependentSchema);
+
+
+                // Carry out the parsing for all the YANG files.
+                parseYangFileInfoSet();
+
+                // Resolve dependencies using linker.
+                resolveDependenciesUsingLinker();
+
+                // Perform translation to JAVA.
+                translateToJava(config);
+
+                // Serialize data model.
+                Set<YangNode> compiledSchemas = new HashSet<>();
+                for (YangFileInfo fileInfo : yangFileInfoSet) {
+                    compiledSchemas.add(fileInfo.getRootNode());
+                }
+
+                String serFileName = config.resourceGenDir() + YANG_META_DATA + SERIALIZED_FILE_EXTENSION;
+                FileOutputStream fileOutputStream = new FileOutputStream(serFileName);
+                ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
+                objectOutputStream.writeObject(compiledSchemas);
+                objectOutputStream.close();
+                fileOutputStream.close();
+
+
+                //add YANG files to JAR
+                List<File> files = getListOfFile(yangFileInfoSet);
+                String path = config.resourceGenDir();
+                File targetDir = new File(path);
+                targetDir.mkdirs();
+
+                for (File file : files) {
+                    Files.copy(file.toPath(),
+                               new File(path + file.getName()).toPath(),
+                               StandardCopyOption.REPLACE_EXISTING);
+                }
+
+                if (plugin != null) {
+                    plugin.addCompiledSchemaToBundle();
+                    plugin.addGeneratedCodeToBundle();
+                    plugin.addYangFilesToBundle();
+                }
+
+            } catch (IOException | ParserException e) {
+                YangToolException exception =
+                        new YangToolException(e.getMessage(), e);
+                exception.setCurYangFile(curYangFileInfo);
+
+                if (curYangFileInfo != null &&
+                        curYangFileInfo.getRootNode() != null) {
+                    try {
+                        translatorErrorHandler(curYangFileInfo.getRootNode(),
+                                               config);
+                    } catch (IOException ex) {
+                        e.printStackTrace();
+                        throw ex;
+                    }
+                }
+
+                throw exception;
+            }
         }
     }
 
diff --git a/pom.xml b/pom.xml
index b571eea..4134f92 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,7 +26,7 @@
 
     <groupId>org.onosproject</groupId>
     <artifactId>onos-yang-utils</artifactId>
-    <version>1.10-SNAPSHOT</version>
+    <version>1.12-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <properties>