diff --git a/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
index dfbb234..fcc52e8 100644
--- a/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
+++ b/src/main/java/org/onosproject/yangutils/utils/io/impl/YangIoUtils.java
@@ -16,12 +16,13 @@
 
 package org.onosproject.yangutils.utils.io.impl;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.io.FileUtils;
@@ -31,12 +32,16 @@
 import org.slf4j.Logger;
 import org.sonatype.plexus.build.incremental.BuildContext;
 
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Provides common utility functionalities for code generation.
  */
 public final class YangIoUtils {
 
     private static final Logger log = getLogger(YangIoUtils.class);
+    private static final String TARGET_RESOURCE_PATH = UtilConstants.SLASH + UtilConstants.TEMP + UtilConstants.SLASH
+            + UtilConstants.YANG_RESOURCES + UtilConstants.SLASH;
 
     /**
      * Default constructor.
@@ -67,9 +72,9 @@
      */
     public static void addPackageInfo(File path, String classInfo, String pack) throws IOException {
 
-        if (pack.contains(UtilConstants.YANG_GEN_DIR)) {
-            String[] strArray = pack.split(UtilConstants.YANG_GEN_DIR);
-            pack = strArray[1];
+        if (pack.contains(UtilConstants.ORG)) {
+            String[] strArray = pack.split(UtilConstants.ORG);
+            pack = UtilConstants.ORG + strArray[1];
         }
         try {
 
@@ -91,19 +96,13 @@
     /**
      * Cleans the generated directory if already exist in source folder.
      *
-     * @param baseDir generated directory in previous build
+     * @param dir generated directory in previous build
      */
-    public static void clean(String baseDir) {
-        File generatedDirectory = new File(baseDir + File.separator + UtilConstants.YANG_GEN_DIR
-                + UtilConstants.DEFAULT_BASE_PKG.replace(UtilConstants.PERIOD, UtilConstants.SLASH));
+    public static void clean(String dir) {
+
+        File generatedDirectory = new File(dir);
         if (generatedDirectory.exists()) {
-            List<String> javafiles;
             try {
-                javafiles = YangFileScanner.getJavaFiles(generatedDirectory.toString());
-                for (String file : javafiles) {
-                    File currentFile = new File(file);
-                    currentFile.delete();
-                }
                 FileUtils.deleteDirectory(generatedDirectory);
             } catch (IOException e) {
                 log.info("Failed to delete the generated files in " + generatedDirectory + " directory");
@@ -121,9 +120,6 @@
     public static void addToSource(String source, MavenProject project, BuildContext context) {
 
         project.addCompileSourceRoot(source);
-        Resource rsc = new Resource();
-        rsc.setDirectory(source);
-        project.addResource(rsc);
         context.refresh(project.getBasedir());
         log.info("Source directory added to compilation root: " + source);
     }
@@ -136,6 +132,7 @@
      * @return new string
      */
     public static String trimAtLast(String valueString, String removealStirng) {
+
         StringBuilder stringBuilder = new StringBuilder(valueString);
         int index = valueString.lastIndexOf(removealStirng);
         stringBuilder.deleteCharAt(index);
@@ -149,6 +146,7 @@
      * @return parted string
      */
     public static String partString(String partString) {
+
         String[] strArray = partString.split(UtilConstants.COMMA);
         String newString = "";
         for (int i = 0; i < strArray.length; i++) {
@@ -163,4 +161,91 @@
         return trimAtLast(newString, UtilConstants.COMMA);
     }
 
+    /**
+     * Returns backspaced string.
+     *
+     * @param charString char string
+     * @return backspace string
+     */
+    public static String deleteLastChar(String charString) {
+
+        return charString.substring(0, charString.length() - 1);
+    }
+
+    /**
+     * Get the directory path of the package in canonical form.
+     *
+     * @param baseCodeGenPath base path where the generated files needs to be
+     *            put.
+     * @param pathOfJavaPkg java package of the file being generated
+     * @return absolute path of the package in canonical form
+     */
+    public static String getDirectory(String baseCodeGenPath, String pathOfJavaPkg) {
+
+        if (pathOfJavaPkg.charAt(pathOfJavaPkg.length() - 1) == File.separatorChar) {
+            pathOfJavaPkg = trimAtLast(pathOfJavaPkg, UtilConstants.SLASH);
+        }
+        String[] strArray = pathOfJavaPkg.split(UtilConstants.SLASH);
+        if (strArray[0].equals(UtilConstants.EMPTY_STRING)) {
+            return pathOfJavaPkg;
+        } else {
+            return baseCodeGenPath + File.separator + pathOfJavaPkg;
+        }
+    }
+
+    /**
+     * Get the absolute path of the package in canonical form.
+     *
+     * @param baseCodeGenPath base path where the generated files needs to be
+     *            put.
+     * @param pathOfJavaPkg java package of the file being generated
+     * @return absolute path of the package in canonical form
+     */
+    public static String getAbsolutePackagePath(String baseCodeGenPath, String pathOfJavaPkg) {
+
+        return baseCodeGenPath + pathOfJavaPkg;
+    }
+
+    /**
+     * Copy YANG files to the current project's output directory.
+     *
+     * @param yangFiles list of YANG files
+     * @param outputDir project's output directory
+     * @param project maven project
+     * @throws IOException when fails to copy files to destination resource
+     *             directory
+     */
+    public static void copyYangFilesToTarget(List<String> yangFiles, String outputDir, MavenProject project)
+            throws IOException {
+
+        List<File> files = getListOfFile(yangFiles);
+
+        String path = outputDir + TARGET_RESOURCE_PATH;
+        File targetDir = new File(path);
+        targetDir.mkdirs();
+
+        for (File file : files) {
+            Files.copy(file.toPath(),
+                    new File(path + file.getName()).toPath(),
+                    StandardCopyOption.REPLACE_EXISTING);
+        }
+        Resource rsc = new Resource();
+        rsc.setDirectory(outputDir + UtilConstants.SLASH + UtilConstants.TEMP + UtilConstants.SLASH);
+        project.addResource(rsc);
+    }
+
+    /**
+     * Provides a list of files from list of strings.
+     *
+     * @param strings list of strings
+     * @return list of files
+     */
+    private static List<File> getListOfFile(List<String> strings) {
+
+        List<File> files = new ArrayList<>();
+        for (String file : strings) {
+            files.add(new File(file));
+        }
+        return files;
+    }
 }
