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/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/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/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/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/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/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/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);
