[ONOS-6764][ONOS-6673] YANG Runtime: GET API's for YANG Models and YANG Compiler & Runtime: Identification of YANG Model with a name.

Change-Id: I01d6ed970b98125d3ae9f8b42f51d25d7087a69a
diff --git a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilationParam.java b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilationParam.java
index b44814f..1c49050 100644
--- a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilationParam.java
+++ b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilationParam.java
@@ -33,14 +33,6 @@
     Set<Path> getYangFiles();
 
     /**
-     * Adds YANG file path. This could be a directory in which YANG files are
-     * available.
-     *
-     * @param path YANG file path
-     */
-    void addYangFile(Path path);
-
-    /**
      * Returns set of dependent metadata paths.
      *
      * @return set of dependent metadata path
@@ -48,13 +40,6 @@
     Set<Path> getDependentSchemas();
 
     /**
-     * Adds dependent metadata path.
-     *
-     * @param path metadata path
-     */
-    void addDependentSchema(Path path);
-
-    /**
      * Returns the desired path of generated code. If its not specified default
      * path will be taken.
      *
@@ -63,13 +48,6 @@
     Path getCodeGenDir();
 
     /**
-     * Sets code generation directory.
-     *
-     * @param path expected code generation directory
-     */
-    void setCodeGenDir(Path path);
-
-    /**
      * Returns the desired path of metadata. If its not specified default
      * path will be taken.
      *
@@ -78,9 +56,9 @@
     Path getMetadataGenDir();
 
     /**
-     * Sets metadata generation directory.
+     * Returns the model identifier.
      *
-     * @param path expected metadata generation directory
+     * @return model identifier
      */
-    void setMetadataGenDir(Path path);
+    String getModelId();
 }
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
index 9bf8b2d..71f7238 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
@@ -432,7 +432,7 @@
     /**
      * Adds a unique holder to a unique holder list.
      *
-     * @param uniqueHolder
+     * @param uniqueHolder unique holder
      */
     @Override
     public void addToUniqueHolderList(YangUniqueHolder uniqueHolder) {
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
index 6b74df1..9ebb194 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
@@ -67,11 +67,9 @@
 import org.onosproject.yang.model.SchemaId;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.ObjectInputStream;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -398,30 +396,6 @@
     }
 
     /**
-     * Returns de-serializes YANG data-model nodes.
-     *
-     * @param serializedFileInfo serialized File Info
-     * @return de-serializes YANG data-model nodes
-     * @throws IOException when fails do IO operations
-     */
-    public static Set<YangNode> deSerializeDataModel(String serializedFileInfo)
-            throws IOException {
-
-        Set<YangNode> nodes;
-        try {
-            FileInputStream fileInputStream = new FileInputStream(serializedFileInfo);
-            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
-            nodes = (Set<YangNode>) objectInputStream.readObject();
-            objectInputStream.close();
-            fileInputStream.close();
-        } catch (IOException | ClassNotFoundException e) {
-            throw new IOException(serializedFileInfo + " failed to fetch " +
-                                          "nodes due to " + e.getLocalizedMessage());
-        }
-        return nodes;
-    }
-
-    /**
      * Adds the list of leaf present under a node to resolution list, after
      * cloning. Under the cloned node, with cloned leaf, attributes are set
      * and added to resolution list.
@@ -864,57 +838,6 @@
      * @return list of serialized files
      * @throws IOException when fails to do IO operations
      */
-    public static List<YangNode> parseJarFile(String jarFile, String directory)
-            throws IOException {
-
-        List<YangNode> nodes = new ArrayList<>();
-        JarFile jar = new JarFile(jarFile);
-        Enumeration<?> enumEntries = jar.entries();
-
-        while (enumEntries.hasMoreElements()) {
-            JarEntry file = (JarEntry) enumEntries.nextElement();
-            if (file.getName().endsWith(".ser")) {
-
-                if (file.getName().contains(SLASH)) {
-                    String[] strArray = file.getName().split(SLASH);
-                    String tempPath = "";
-                    for (int i = 0; i < strArray.length - 1; i++) {
-                        tempPath = SLASH + tempPath + SLASH + strArray[i];
-                    }
-                    File dir = new File(directory + tempPath);
-                    dir.mkdirs();
-                }
-                File serializedFile = new File(directory + SLASH + file.getName());
-                if (file.isDirectory()) {
-                    serializedFile.mkdirs();
-                    continue;
-                }
-                InputStream inputStream = jar.getInputStream(file);
-
-                FileOutputStream fileOutputStream = new FileOutputStream(serializedFile);
-                while (inputStream.available() > 0) {
-                    fileOutputStream.write(inputStream.read());
-                }
-                fileOutputStream.close();
-                inputStream.close();
-                nodes.addAll(deSerializeDataModel(serializedFile.toString()));
-                //As of now only one metadata files will be there so if we
-                // found one then we should break the loop.
-                break;
-            }
-        }
-        jar.close();
-        return nodes;
-    }
-
-    /**
-     * Parses jar file and returns list of serialized file names.
-     *
-     * @param jarFile   jar file to be parsed
-     * @param directory directory where to search
-     * @return list of serialized files
-     * @throws IOException when fails to do IO operations
-     */
     public static File parseDepSchemaPath(String jarFile, String directory)
             throws IOException {
         JarFile jar = new JarFile(jarFile);
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java
index f5f981a..5a86c88 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java
@@ -24,23 +24,35 @@
 import java.util.Set;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static java.util.Collections.unmodifiableSet;
 
 /**
  * Represents default YANG compilation parameter.
  */
-public class DefaultYangCompilationParam implements YangCompilationParam {
+public final class DefaultYangCompilationParam implements YangCompilationParam {
 
     private final Set<Path> yangFiles;
     private final Set<Path> dependentSchemas;
     private Path codeGenDir;
     private Path metaDataPath;
+    private String modelId;
 
     /**
      * Creates an instance of YANG compilation parameter.
+     *
+     * @param files    yang files path
+     * @param schemas  dependent schema path
+     * @param metaPath metadata path
+     * @param id       model id
+     * @param path     generated code directory path
      */
-    public DefaultYangCompilationParam() {
-        yangFiles = new LinkedHashSet<>();
-        dependentSchemas = new LinkedHashSet<>();
+    private DefaultYangCompilationParam(Set<Path> files, Set<Path>
+            schemas, Path metaPath, String id, Path path) {
+        yangFiles = unmodifiableSet(files);
+        dependentSchemas = unmodifiableSet(schemas);
+        modelId = id;
+        codeGenDir = path;
+        metaDataPath = metaPath;
     }
 
     @Override
@@ -49,44 +61,29 @@
     }
 
     @Override
-    public void addYangFile(Path path) {
-        yangFiles.add(path);
-    }
-
-    @Override
     public Set<Path> getDependentSchemas() {
         return dependentSchemas;
     }
 
     @Override
-    public void addDependentSchema(Path path) {
-        dependentSchemas.add(path);
-    }
-
-    @Override
     public Path getCodeGenDir() {
         return codeGenDir;
     }
 
     @Override
-    public void setCodeGenDir(Path path) {
-        codeGenDir = path;
-    }
-
-    @Override
     public Path getMetadataGenDir() {
         return metaDataPath;
     }
 
     @Override
-    public void setMetadataGenDir(Path path) {
-        metaDataPath = path;
+    public String getModelId() {
+        return modelId;
     }
 
     @Override
     public int hashCode() {
         return Objects.hash(yangFiles, dependentSchemas, codeGenDir,
-                            metaDataPath);
+                            metaDataPath, modelId);
     }
 
     @Override
@@ -101,7 +98,8 @@
                 yangFiles.containsAll(that.yangFiles) &&
                 dependentSchemas.containsAll(that.dependentSchemas) &&
                 Objects.equals(codeGenDir, that.codeGenDir) &&
-                Objects.equals(metaDataPath, that.metaDataPath);
+                Objects.equals(metaDataPath, that.metaDataPath) &&
+                Objects.equals(modelId, that.modelId);
     }
 
     @Override
@@ -111,6 +109,103 @@
                 .add("dependentSchemas", dependentSchemas)
                 .add("codeGenDir", codeGenDir)
                 .add("metaDataPath", metaDataPath)
+                .add("modelId", modelId)
                 .toString();
     }
+
+    /**
+     * Retrieves a new YANG compilation param builder.
+     *
+     * @return YANG compilation param builder
+     */
+    public static DefaultYangCompilationParam.Builder builder() {
+        return new DefaultYangCompilationParam.Builder();
+    }
+
+    /**
+     * Builder to construct compilation param.
+     */
+    public static class Builder {
+        private final Set<Path> yangFiles;
+        private final Set<Path> dependentSchemas;
+        private Path codeGenDir;
+        private Path metaDataPath;
+        private String modelId;
+
+        /**
+         * Creates an instance of YANG compilation parameter builder.
+         */
+        public Builder() {
+            yangFiles = new LinkedHashSet<>();
+            dependentSchemas = new LinkedHashSet<>();
+        }
+
+        /**
+         * Sets metadata generation directory.
+         *
+         * @param path expected metadata generation directory
+         * @return updated builder with metadata generated schema
+         */
+        public Builder setMetadataGenDir(Path path) {
+            metaDataPath = path;
+            return this;
+        }
+
+        /**
+         * Sets yang model identifier.
+         *
+         * @param id model identifier
+         * @return updated builder with YANG model id
+         * instance
+         */
+        public Builder setModelId(String id) {
+            modelId = id;
+            return this;
+        }
+
+        /**
+         * Sets code generation directory.
+         *
+         * @param path expected code generation directory
+         * @return updated builder with generated code path value instance
+         */
+        public Builder setCodeGenDir(Path path) {
+            codeGenDir = path;
+            return this;
+        }
+
+        /**
+         * Adds dependent metadata path.
+         *
+         * @param path metadata path
+         * @return updated builder with dependent schema path value instance
+         */
+        public Builder addDependentSchema(Path path) {
+            dependentSchemas.add(path);
+            return this;
+        }
+
+        /**
+         * Adds YANG file path. This could be a directory in which YANG files are
+         * available.
+         *
+         * @param path YANG file path
+         * @return updated builder with YANG files path
+         */
+        public Builder addYangFile(Path path) {
+            yangFiles.add(path);
+            return this;
+        }
+
+        /**
+         * Builds a YangCompilationParam.
+         *
+         * @return built YangCompilationParam
+         */
+        public DefaultYangCompilationParam build() {
+            return new DefaultYangCompilationParam(
+                    yangFiles, dependentSchemas, metaDataPath, modelId,
+                    codeGenDir);
+        }
+    }
 }
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
index 2763004..d7dcfb5 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
@@ -32,7 +32,6 @@
 import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 import org.onosproject.yang.model.DefaultYangModel;
-import org.onosproject.yang.model.DefaultYangModule;
 import org.onosproject.yang.model.DefaultYangModuleId;
 import org.onosproject.yang.model.YangModel;
 import org.onosproject.yang.model.YangModule;
@@ -40,17 +39,23 @@
 import org.slf4j.Logger;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
 
 import static java.nio.file.Files.copy;
 import static java.nio.file.Paths.get;
@@ -58,13 +63,11 @@
 import static java.util.Collections.sort;
 import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_DERIVED_DATA_TYPE;
 import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_IDENTITYREF;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
 import static org.onosproject.yang.compiler.linker.impl.YangLinkerUtils.resolveGroupingInDefinationScope;
 import static org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorUtil.generateJavaCode;
 import static org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorUtil.translatorErrorHandler;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
 import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_META_DATA;
 import static org.onosproject.yang.compiler.utils.io.impl.YangFileScanner.getJavaFiles;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.createDirectories;
@@ -84,41 +87,65 @@
     private Set<YangFileInfo> yangFileInfoSet; //initialize in tool invocation;
     private YangFileInfo curYangFileInfo = new YangFileInfo();
     private Set<Path> genJavaPath = new LinkedHashSet<>();
+    private YangModel model;
+    private static final String SLASH = File.separator;
 
     @Override
     public YangCompiledOutput compileYangFiles(YangCompilationParam param)
             throws IOException, YangCompilerException {
         synchronized (YangCompilerManager.class) {
-
-            YangPluginConfig config = new YangPluginConfig();
-            config.setCodeGenDir(param.getCodeGenDir().toString() + SLASH);
-            config.resourceGenDir(param.getMetadataGenDir().toString() +
-                                          SLASH);
-
-            processYangFiles(createYangFileInfoSet(param.getYangFiles()),
-                             dependentSchema(param.getDependentSchemas()), config);
-
-            return new DefaultYangCompiledOutput(
-                    processYangModel(config.resourceGenDir()), genJavaPath);
+            processYangFiles(param);
+            return new DefaultYangCompiledOutput(model, genJavaPath);
         }
     }
 
     /**
      * Returns YANG model for application.
      *
-     * @param path path for metadata file
+     * @param path    path for metadata file
+     * @param list    list of YANG node
+     * @param modelId model id
+     * @param fromUt  if method is called from unit test
      * @return YANG model
+     * @throws IOException when fails to IO operations
      */
-    private YangModel processYangModel(String path) {
+    public static YangModel processYangModel(
+            String path, List<YangNode> list, String modelId, boolean fromUt)
+            throws IOException {
         YangModel.Builder b = DefaultYangModel.builder();
         YangModuleId id;
-        for (YangNode node : yangNodeSet) {
+        for (YangNode node : list) {
             id = processModuleId(node);
-            YangModule module =
-                    new DefaultYangModule(id, get(node.getFileName()), get(path));
+            String serFile = path + id.moduleName() + id.revision() + ".ser";
+            if (!fromUt) {
+                serializeModuleMetaData(serFile, node);
+            }
+            YangModule module = new YangModuleExtendedInfo(
+                    id, new File(node.getFileName()), new File(serFile));
+            ((YangModuleExtendedInfo) module).setSchema(node);
             b.addModule(id, module);
         }
-        return b.build();
+        return b.addModelId(modelId).build();
+    }
+
+    /**
+     * Serializes YANG Node.
+     *
+     * @param serFileName path of resource directory
+     * @param node        YangNode
+     * @throws IOException when fails to IO operations
+     */
+    private static void serializeModuleMetaData(String serFileName, YangNode node)
+            throws IOException {
+        try {
+            FileOutputStream outStream = new FileOutputStream(serFileName);
+            ObjectOutputStream objOutStream = new ObjectOutputStream(outStream);
+            objOutStream.writeObject(node);
+            objOutStream.close();
+            outStream.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
     }
 
     /**
@@ -127,7 +154,7 @@
      * @param module YANG module
      * @return YANG module id for a given YANG module node
      */
-    private YangModuleId processModuleId(YangNode module) {
+    public static YangModuleId processModuleId(YangNode module) {
         String rev = getDateInStringFormat(module);
         return new DefaultYangModuleId(module.getName(), rev);
     }
@@ -163,19 +190,18 @@
      * Compile te YANG files and generate the corresponding Java files.
      * Update the generated bundle with the schema metadata.
      *
-     * @param yangFiles       Application YANG files
-     * @param dependentSchema inter jar linked schema nodes
-     * @param config          tool configurations
+     * @param param YANG compilation parameters
      * @throws IOException when fails to do IO operations
      */
-    private void processYangFiles(Set<YangFileInfo> yangFiles,
-                                  Set<YangNode> dependentSchema,
-                                  YangPluginConfig config) throws IOException {
-
+    private void processYangFiles(YangCompilationParam param) throws IOException {
+        YangPluginConfig config = new YangPluginConfig();
         synchronized (YangCompilerManager.class) {
             try {
-
-                yangFileInfoSet = yangFiles;
+                String codeGenDir = param.getCodeGenDir() + SLASH;
+                String resourceGenDir = param.getMetadataGenDir() + SLASH;
+                config.setCodeGenDir(codeGenDir);
+                config.resourceGenDir(resourceGenDir);
+                yangFileInfoSet = createYangFileInfoSet(param.getYangFiles());
 
                 // Check if there are any file to translate, if not return.
                 if (yangFileInfoSet.isEmpty()) {
@@ -184,16 +210,19 @@
                 }
 
                 //Create resource directory.
-                createDirectories(config.resourceGenDir());
+                createDirectories(resourceGenDir);
 
                 // Resolve inter jar dependency.
-                addSchemaToFileSet(dependentSchema);
+                addSchemaToFileSet(dependentSchema(
+                        param.getDependentSchemas()));
 
                 // Carry out the parsing for all the YANG files.
                 parseYangFileInfoSet();
 
+                createYangNodeSet();
+
                 // Serialize data model.
-                processSerialization(config.resourceGenDir());
+                processSerialization(resourceGenDir, param.getModelId());
 
                 // Resolve dependencies using linker.
                 resolveDependenciesUsingLinker();
@@ -202,10 +231,10 @@
                 translateToJava(config);
 
                 //add to generated java code map
-                processGeneratedCode(config.getCodeGenDir());
+                processGeneratedCode(codeGenDir);
 
                 //add YANG files to JAR
-                processCopyYangFile(config.resourceGenDir());
+                processCopyYangFile(resourceGenDir);
             } catch (IOException | ParserException e) {
                 //TODO: provide unified framework for exceptions
                 YangCompilerException exception =
@@ -251,7 +280,8 @@
         Set<YangNode> depNodes = new LinkedHashSet<>();
         for (Path path : dependentSchemaPath) {
             try {
-                depNodes.addAll(deSerializeDataModel(path.toString()));
+                depNodes.addAll(getYangNodes(
+                        deSerializeDataModel(path.toString())));
             } catch (IOException e) {
                 throw new YangCompilerException(
                         "Failed to fetch dependent schema from given " +
@@ -289,7 +319,6 @@
      * @throws YangCompilerException failed to link schema
      */
     public void resolveDependenciesUsingLinker() {
-        createYangNodeSet();
         try {
             yangLinker.resolveDependencies(yangNodeSet);
         } catch (LinkerException e) {
@@ -388,18 +417,18 @@
      * Process serialization of datamodel.
      *
      * @param path path of resource directory
+     * @param id   model id
      * @throws IOException when fails to IO operations
      */
-    private void processSerialization(String path) throws IOException {
-        Set<YangNode> compiledSchemas = new HashSet<>();
-        for (YangFileInfo fileInfo : yangFileInfoSet) {
-            compiledSchemas.add(fileInfo.getRootNode());
-        }
-
+    public void processSerialization(String path, String id) throws
+            IOException {
+        List<YangNode> nodelist = new ArrayList<>();
+        nodelist.addAll(yangNodeSet);
+        model = processYangModel(path, nodelist, id, false);
         String serFileName = path + YANG_META_DATA;
         FileOutputStream fileOutputStream = new FileOutputStream(serFileName);
         ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
-        objectOutputStream.writeObject(compiledSchemas);
+        objectOutputStream.writeObject(model);
         objectOutputStream.close();
         fileOutputStream.close();
     }
@@ -463,4 +492,95 @@
         }
         return files;
     }
+
+    /**
+     * Returns de-serializes YANG data-model.
+     *
+     * @param info serialized File Info
+     * @return de-serializes YANG data-model
+     * @throws IOException when fails do IO operations
+     */
+    public static YangModel deSerializeDataModel(String info)
+            throws IOException {
+        YangModel model;
+        try {
+            FileInputStream fileInputStream = new FileInputStream(info);
+            ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
+            model = ((YangModel) objectInputStream.readObject());
+            objectInputStream.close();
+            fileInputStream.close();
+        } catch (IOException | ClassNotFoundException e) {
+            throw new IOException(info + " failed to fetch nodes due to " + e
+                    .getLocalizedMessage(), e);
+        }
+        return model;
+    }
+
+    /**
+     * Returs the set of YANG nodes from a given YANG model.
+     *
+     * @param model YANG model
+     * @return set of YANG nodes
+     */
+    public static Set<YangNode> getYangNodes(YangModel model) {
+        Set<YangNode> yangNodes = new HashSet<>();
+        if (model != null) {
+            Set<YangModule> modules = model.getYangModules();
+            for (YangModule info : modules) {
+                yangNodes.add(((YangModuleExtendedInfo) info).getSchema());
+            }
+        }
+        return yangNodes;
+    }
+
+    /**
+     * Parses jar file and returns YANG model.
+     *
+     * @param jarFile   jar file to be parsed
+     * @param directory directory where to search
+     * @return YANG model
+     * @throws IOException when fails to do IO operations
+     */
+    public static YangModel parseJarFile(String jarFile, String directory)
+            throws IOException {
+
+        YangModel model = null;
+        JarFile jar = new JarFile(jarFile);
+        Enumeration<?> enumEntries = jar.entries();
+
+        while (enumEntries.hasMoreElements()) {
+            JarEntry file = (JarEntry) enumEntries.nextElement();
+            if (file.getName().endsWith(".ser")) {
+
+                if (file.getName().contains(SLASH)) {
+                    String[] strArray = file.getName().split(SLASH);
+                    String tempPath = "";
+                    for (int i = 0; i < strArray.length - 1; i++) {
+                        tempPath = SLASH + tempPath + SLASH + strArray[i];
+                    }
+                    File dir = new File(directory + tempPath);
+                    dir.mkdirs();
+                }
+                File serializedFile = new File(directory + SLASH + file.getName());
+                if (file.isDirectory()) {
+                    serializedFile.mkdirs();
+                    continue;
+                }
+                InputStream inputStream = jar.getInputStream(file);
+
+                FileOutputStream fileOutputStream = new FileOutputStream(serializedFile);
+                while (inputStream.available() > 0) {
+                    fileOutputStream.write(inputStream.read());
+                }
+                fileOutputStream.close();
+                inputStream.close();
+                model = deSerializeDataModel(serializedFile.toString());
+                //As of now only one metadata files will be there so if we
+                // found one then we should break the loop.
+                break;
+            }
+        }
+        jar.close();
+        return model;
+    }
 }
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangModuleExtendedInfo.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
similarity index 84%
rename from runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangModuleExtendedInfo.java
rename to compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
index cc85080..9f01482 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangModuleExtendedInfo.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
@@ -14,18 +14,19 @@
  * limitations under the License.
  */
 
-package org.onosproject.yang.runtime.helperutils;
+package org.onosproject.yang.compiler.tool;
 
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.model.DefaultYangModule;
 import org.onosproject.yang.model.YangModuleId;
 
-import java.nio.file.Path;
+import java.io.File;
+import java.io.Serializable;
 
 /**
  * Represents extended info for YANG module.
  */
-public class YangModuleExtendedInfo extends DefaultYangModule {
+public class YangModuleExtendedInfo extends DefaultYangModule implements Serializable {
 
     private YangNode schema;
 
@@ -36,7 +37,7 @@
      * @param yangSrc  YANG resource path
      * @param metadata meta data resource path
      */
-    YangModuleExtendedInfo(YangModuleId id, Path yangSrc, Path metadata) {
+    public YangModuleExtendedInfo(YangModuleId id, File yangSrc, File metadata) {
         super(id, yangSrc, metadata);
     }
 
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java
index 28e067a..ddbce9c 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java
@@ -16,7 +16,6 @@
 
 package org.onosproject.yang.compiler.plugin.buck;
 
-import org.onosproject.yang.compiler.api.YangCompilationParam;
 import org.onosproject.yang.compiler.api.YangCompiledOutput;
 import org.onosproject.yang.compiler.api.YangCompilerException;
 import org.onosproject.yang.compiler.api.YangCompilerService;
@@ -41,6 +40,7 @@
     private final List<String> depJar;
     private String outputDirectory;
     private YangCompiledOutput output;
+    private String modelId;
 
     /**
      * Creates an instance of YANG generator.
@@ -48,11 +48,13 @@
      * @param models          YANG models
      * @param outputDirectory output directory
      * @param depJar          dependent jar paths
+     * @param id              model id
      */
-    YangGenerator(List<File> models, String outputDirectory, List<String> depJar) {
+    YangGenerator(List<File> models, String outputDirectory, List<String> depJar, String id) {
         this.models = models;
         this.depJar = depJar;
         this.outputDirectory = outputDirectory + SLASH;
+        modelId = id;
     }
 
     /**
@@ -66,31 +68,34 @@
             YangCompilerService compiler = new YangCompilerManager();
 
             //Create compiler param.
-            YangCompilationParam param = new DefaultYangCompilationParam();
+            DefaultYangCompilationParam.Builder bldr =
+                    DefaultYangCompilationParam.builder();
 
             //Need to get dependent schema paths to give inter jar dependencies.
             for (String jar : depJar) {
                 try {
                     File path = parseDepSchemaPath(jar, outputDirectory);
                     if (path != null) {
-                        param.addDependentSchema(Paths.get(path.getAbsolutePath()));
+                        bldr.addDependentSchema(Paths.get(path.getAbsolutePath()));
                     }
                 } catch (IOException e) {
                     throw new YangCompilerException(
                             "Failed to parse dependent schema path");
                 }
             }
-            param.setCodeGenDir(Paths.get(outputDirectory));
-            param.setMetadataGenDir(Paths.get(outputDirectory + SLASH +
-                                                      YANG_RESOURCES + SLASH));
+            bldr.setCodeGenDir(Paths.get(outputDirectory));
+            bldr.setMetadataGenDir(Paths.get(outputDirectory + SLASH +
+                                                     YANG_RESOURCES + SLASH));
 
             for (File file : models) {
-                param.addYangFile(Paths.get(file.getAbsolutePath()));
+                bldr.addYangFile(Paths.get(file.getAbsolutePath()));
             }
 
+            bldr.setModelId(modelId);
+
             //Compile yang files and generate java code.
             try {
-                output = compiler.compileYangFiles(param);
+                output = compiler.compileYangFiles(bldr.build());
             } catch (IOException e) {
                 throw new YangParsingException(e);
             }
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java
index f431ee3..0f6578a 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java
@@ -80,14 +80,17 @@
     private final Path genSrcsDirectory;
     private final Path outputDirectory;
     private final Path output;
+    private final String modelId;
 
     public YangLibrary(
             BuildRuleParams params,
             SourcePathResolver resolver,
-            ImmutableSortedSet<SourcePath> srcs) {
+            ImmutableSortedSet<SourcePath> srcs,
+            String id) {
         super(params, resolver);
         this.srcs = srcs;
         this.params = params;
+        modelId = id;
         genSrcsDirectory = BuildTargets.getGenPath(getProjectFilesystem(),
                                                    params.getBuildTarget(),
                                                    "%s__yang-gen");
@@ -122,7 +125,7 @@
                 .collect(Collectors.toList());
 
         steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory,
-                               params.getDeps()));
+                               params.getDeps(), modelId));
 
         steps.add(new JarDirectoryStep(
                 getProjectFilesystem(),
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java
index 54a1e07..6dd70f9 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java
@@ -99,7 +99,8 @@
                         unflavoredBuildTarget, SOURCES));
 
         BuildRule yangLib = resolver.getRuleOptional(yangParams.getBuildTarget())
-                .or(() -> resolver.addToIndex(new YangLibrary(yangParams, pathResolver, args.srcs)));
+                .or(() -> resolver.addToIndex(new YangLibrary(
+                        yangParams, pathResolver, args.srcs, args.modelId.get())));
 
         if (params.getBuildTarget().getFlavors().contains(SOURCES)) {
             return yangLib;
@@ -113,7 +114,6 @@
                 args
         );
 
-
         // Create to main compile rule.
         BuildRuleParams javaParams = params.copyWithChanges(
                 params.getBuildTarget(),
@@ -179,6 +179,7 @@
     public static class Arg extends JvmLibraryArg {
         public ImmutableSortedSet<SourcePath> srcs;
         public Optional<ImmutableSortedSet<BuildTarget>> deps;
+        public Optional<String> modelId;
 
         //TODO other params here
     }
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java
index 58e8eb9..5fe66a8 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java
@@ -48,15 +48,17 @@
     private final ProjectFilesystem filesystem;
     private final List<Path> srcs;
     private final Path output;
+    private final String modelId;
 
     YangStep(ProjectFilesystem filesystem,
              List<Path> srcs,
-             Path genSourcesDirectory, ImmutableSortedSet<BuildRule> deps) {
+             Path genSourcesDirectory, ImmutableSortedSet<BuildRule> deps, String id) {
         super(DESCRIPTION);
         this.filesystem = filesystem;
         this.srcs = srcs;
         this.deps = deps;
         this.output = genSourcesDirectory;
+        modelId = id;
     }
 
     @Override
@@ -67,8 +69,8 @@
             List<File> sourceFiles = srcs.stream().map(Path::toFile)
                     .collect(Collectors.toList());
             try {
-                new YangGenerator(sourceFiles, output.toString(), getJarPaths())
-                        .execute();
+                new YangGenerator(sourceFiles, output.toString(), getJarPaths(),
+                                  modelId).execute();
                 return StepExecutionResult.SUCCESS;
             } catch (YangParsingException e) {
                 executionContext.getConsole().printErrorText(e.getMessage());
diff --git a/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java b/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java
index 3612a48..92472e2 100644
--- a/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java
+++ b/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java
@@ -25,7 +25,6 @@
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.rtinfo.RuntimeInformation;
-import org.onosproject.yang.compiler.api.YangCompilationParam;
 import org.onosproject.yang.compiler.api.YangCompiledOutput;
 import org.onosproject.yang.compiler.api.YangCompilerException;
 import org.onosproject.yang.compiler.api.YangCompilerService;
@@ -85,6 +84,12 @@
     private String classFileDir;
 
     /**
+     * YANG Model id.
+     */
+    @Parameter(property = "modelId")
+    private String modelId;
+
+    /**
      * Base directory for project.
      */
     @Parameter(property = "basedir", defaultValue = "${basedir}")
@@ -163,20 +168,28 @@
                     project, localRepository, remoteRepository, outputDir);
 
             //Create compiler param.
-            YangCompilationParam param = new DefaultYangCompilationParam();
-            param.setCodeGenDir(Paths.get(codeGenDir));
-            param.setMetadataGenDir(Paths.get(metaDataGenDir));
+            DefaultYangCompilationParam.Builder bldr =
+                    DefaultYangCompilationParam.builder();
+
+            bldr.setCodeGenDir(Paths.get(codeGenDir));
+            bldr.setMetadataGenDir(Paths.get(metaDataGenDir));
 
             for (Path path : depSchemas) {
-                param.addDependentSchema(path);
+                bldr.addDependentSchema(path);
             }
 
             for (String file : getYangFiles(searchDir)) {
-                param.addYangFile(Paths.get(file));
+                bldr.addYangFile(Paths.get(file));
+            }
+
+            if (modelId != null) {
+                bldr.setModelId(modelId);
+            } else {
+                bldr.setModelId(project.getArtifactId());
             }
 
             //Compile yang files and generate java code.
-            output = compiler.compileYangFiles(param);
+            output = compiler.compileYangFiles(bldr.build());
 
             addToCompilationRoot(codeGenDir, project, context);
             addToProjectResource(outputDir + SLASH + TEMP + SLASH, project);
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java
index 63c21fe..3e4b2cb 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java
@@ -740,6 +740,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -769,6 +770,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -795,6 +797,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -821,6 +824,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -849,6 +853,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangNode selfNode = null;
@@ -903,6 +908,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangNode selfNode = null;
@@ -965,6 +971,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangNode selfNode = null;
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java
index 90a717a..5506848 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java
@@ -26,12 +26,12 @@
 import org.onosproject.yang.compiler.tool.YangCompilerManager;
 import org.onosproject.yang.compiler.tool.YangFileInfo;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
+import org.onosproject.yang.model.YangModel;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.ObjectOutputStream;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -45,16 +45,17 @@
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.parseJarFile;
 import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.RESOLVED;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_JAR_RES_PATH;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.getYangNodes;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.parseJarFile;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
 import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_META_DATA;
 import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_RESOURCES;
 import static org.onosproject.yang.compiler.utils.io.impl.YangFileScanner.getYangFiles;
+import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.createDirectories;
 import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
 
 /**
@@ -67,7 +68,9 @@
 
     private static final String TARGET = "target/interJarFileLinking/";
     private static final String YANG_FILES_DIR = "src/test/resources/interJarFileLinking/yangFiles/";
-    private static final String TARGET_RESOURCE_PATH = SLASH + TEMP + SLASH + YANG_RESOURCES + SLASH;
+    private static final String TARGET_RESOURCE_PATH = System.getProperty(
+            "user.dir") + SLASH + TARGET + TEMP + SLASH + YANG_RESOURCES +
+            SLASH;
     private static final String JAR_FILE_NAME = "onlab-test-1.7.0-SNAPSHOT.jar";
     private static final String SER_FILE_NAME = "portPair.ser";
 
@@ -76,6 +79,7 @@
     private static final String PORT_PAIR_FOLDER = "target/interJarFileLinking/org/onosproject"
             + "/yang/gen/v1/portpair/rev20160524";
     private static final String FLOW_CLASSIFIER_MANAGER = FLOW_CLASSIFIER_FOLDER + SLASH + "FlowClassifierManager.java";
+    private String id = "onos-yang-runtime";
 
     /**
      * Unit test case for a single jar dependency.
@@ -93,23 +97,22 @@
         }
 
         utilManager.createYangFileInfoSet(paths);
-        int size1 = utilManager.getYangFileInfoSet().size();
         utilManager.parseYangFileInfoSet();
 
-        utilManager.createYangNodeSet();
-        provideTestJarFile();
-        utilManager.setYangFileInfoSet(removeFileInfoFromSet(utilManager.getYangFileInfoSet()));
+        //at this point port-pair will be in current context.
+        testPortPairFileForInterJar(true);
+        //process jar operations. we need to add only one node in serialized
+        // file which will be  added to a jar file. this jar file will be
+        // used while resolving dependant schema nodes.
 
-        for (String file : getListOfTestJar(TARGET)) {
-            addInterJarRootNodes(file);
-        }
+        //pass 1 because only 1 jar need to be created.
+        processJarOperation(1);
 
+        //at this point port-pair will be in jar context.
+        testPortPairFileForInterJar(false);
         utilManager.resolveDependenciesUsingLinker();
 
-        int size2 = utilManager.getYangFileInfoSet().size();
-        assertThat(true, is(size1 != size2));
         assertThat(true, is(parseFileInfoSet(utilManager.getYangFileInfoSet().iterator())));
-
         deleteDirectory(TARGET);
         deleteTestSerFile();
     }
@@ -132,19 +135,21 @@
 
         utilManager.createYangFileInfoSet(paths);
 
-        int size1 = utilManager.getYangFileInfoSet().size();
         utilManager.parseYangFileInfoSet();
 
-        utilManager.createYangNodeSet();
-        provideTestJarFile();
-        utilManager.setYangFileInfoSet(removeFileInfoFromSet(utilManager.getYangFileInfoSet()));
-        for (String file : getListOfTestJar(TARGET)) {
-            addInterJarRootNodes(file);
-        }
+        //at this point port-pair will be in current context.
+        testPortPairFileForInterJar(true);
+        //process jar operations. we need to add only one node in serialized
+        // file which will be  added to a jar file. this jar file will be
+        // used while resolving dependant schema nodes.
+        //pass 2 because 2 jar need to be created.
 
+        processJarOperation(2);
+
+        //at this point port-pair will be in current context.
+        testPortPairFileForInterJar(false);
         utilManager.resolveDependenciesUsingLinker();
-        int size2 = utilManager.getYangFileInfoSet().size();
-        assertThat(true, is(size1 != size2));
+        //adding process yang model for serialization
         assertThat(true, is(parseFileInfoSet(utilManager.getYangFileInfoSet().iterator())));
         assertThat(true, is(parseFileInfoSet(utilManager.getYangFileInfoSet().iterator())));
 
@@ -214,19 +219,89 @@
 
         utilManager.translateToJava(yangPluginConfig);
 
-        testIfFlowClassifierFilesExists();
+        testIfFlowClassifierFilesExists(false);
         testIfPortPairFileDoesNotExist();
         deleteDirectory(TARGET);
         deleteTestSerFile();
     }
 
     /**
+     * Test when port pair is in current context/ jar context.
+     *
+     * @param val assert value
+     */
+    private void testPortPairFileForInterJar(boolean val) {
+        for (YangFileInfo info : utilManager.getYangFileInfoSet()) {
+            if (info.getYangFileName().endsWith("portpair.yang")) {
+                assertThat(val, is(info.getRootNode().isToTranslate()));
+            }
+        }
+    }
+
+    /**
+     * Process jar operation for UT.
+     *
+     * @throws IOException when fails to do IO operations
+     */
+    private void processJarOperation(int count) throws IOException {
+        if (count == 1) {
+            createJarAndUpdateCompilerManager("portpair");
+        } else if (count == 2) {
+            createJarAndUpdateCompilerManager("portpair");
+            createJarAndUpdateCompilerManager("flowclassifier");
+        }
+        //create node set for other 2 yang files. (test and flow classifier)
+        utilManager.createYangNodeSet();
+
+        //resolve inter jar linking.
+        for (String file : getListOfTestJar(TARGET)) {
+            //add inter jar node to node set.
+            utilManager.getYangNodeSet().addAll(addInterJarRootNodes(file));
+        }
+    }
+
+    /**
+     * Creates node set , then create jar file for it and remove node and
+     * file info form file info set.
+     *
+     * @param name name of current node
+     * @throws IOException when fails to do IO operations
+     */
+    private void createJarAndUpdateCompilerManager(String name) throws IOException {
+        YangNode node = null;
+        for (YangFileInfo info : utilManager.getYangFileInfoSet()) {
+            if (info.getYangFileName().endsWith(name + ".yang")) {
+                node = info.getRootNode();
+            }
+        }
+        //add only port pair node to yang node set.
+        utilManager.getYangNodeSet().add(node);
+
+        createDirectories(TARGET_RESOURCE_PATH);
+
+        List<YangNode> nodes = new ArrayList<>();
+        nodes.addAll(utilManager.getYangNodeSet());
+        //process model which will have only port pair node.
+        processYangModel(TARGET_RESOURCE_PATH, nodes, id, false);
+
+        //create a test jar file.
+        provideTestJarFile(name);
+
+        //now we will remove this port pair yang file form file info set and
+        // yang node set so when we will resolve this node using deserialization
+        //we can add it to yang node set and can test inter file linking
+        utilManager.setYangFileInfoSet(removeFileInfoFromSet(
+                utilManager.getYangFileInfoSet(), name));
+        utilManager.getYangNodeSet().remove(node);
+    }
+
+    /**
      * Test if flow classifier code is generated.
      */
-    private void testIfFlowClassifierFilesExists() {
+    private void testIfFlowClassifierFilesExists(boolean val) {
         File folder = new File(System.getProperty("user.dir") + SLASH + FLOW_CLASSIFIER_FOLDER);
         File file = new File(System.getProperty("user.dir") + SLASH + FLOW_CLASSIFIER_MANAGER);
-        assertThat(true, is(folder.exists()));
+        assertThat(val, is(folder.exists()));
         assertThat(false, is(file.exists()));
     }
 
@@ -236,7 +311,7 @@
     private void testIfPortPairFileDoesNotExist() {
         File folder = new File(System.getProperty("user.dir") +
                                        SLASH + PORT_PAIR_FOLDER);
-        assertThat(true, is(folder.exists()));
+        assertThat(false, is(folder.exists()));
     }
 
     /**
@@ -246,9 +321,11 @@
      * @param fileInfoSet YANG file info set
      * @return updated file info set
      */
-    private Set<YangFileInfo> removeFileInfoFromSet(Set<YangFileInfo> fileInfoSet) {
+    private Set<YangFileInfo> removeFileInfoFromSet(Set<YangFileInfo>
+                                                            fileInfoSet,
+                                                    String name) {
         String portPairFile = System.getProperty("user.dir") + SLASH +
-                YANG_FILES_DIR + "portpair.yang";
+                YANG_FILES_DIR + name + ".yang";
         for (YangFileInfo fileInfo : fileInfoSet) {
             if (fileInfo.getYangFileName().equals(portPairFile)) {
                 fileInfoSet.remove(fileInfo);
@@ -263,29 +340,17 @@
      *
      * @throws IOException when fails to do IO operations
      */
-    private void provideTestJarFile() throws IOException {
-        serializeDataModel();
-        createTestJar();
-    }
-
-    /**
-     * Serializes data-model.
-     *
-     * @throws IOException when fails to do IO operations
-     */
-    private void serializeDataModel() throws IOException {
-
-        String serFileDirPath = TARGET + DEFAULT_JAR_RES_PATH;
+    private void provideTestJarFile(String name) throws IOException {
+        String serFileDirPath = TARGET + TEMP + SLASH +
+                YANG_RESOURCES + SLASH;
         File dir = new File(serFileDirPath);
         if (dir.exists()) {
             dir.delete();
         }
         dir.mkdirs();
-        FileOutputStream fileOutputStream = new FileOutputStream(serFileDirPath + YANG_META_DATA);
-        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
-        objectOutputStream.writeObject(utilManager.getYangNodeSet());
-        objectOutputStream.close();
-        fileOutputStream.close();
+        utilManager.processSerialization(System.getProperty("user.dir") + SLASH +
+                                                 serFileDirPath, id);
+        createTestJar(name);
     }
 
     /**
@@ -304,14 +369,14 @@
      * @return true if present
      */
     private boolean parseFileInfoSet(Iterator<YangFileInfo> yangFileInfoIterator) {
-        YangFileInfo yangFileInfo = yangFileInfoIterator.next();
+        YangFileInfo yangFileInfo;
         while (yangFileInfoIterator.hasNext()) {
+            yangFileInfo = yangFileInfoIterator.next();
             if (yangFileInfo.getRootNode().getName().equals("port-pair")) {
                 return true;
             } else if (yangFileInfo.getRootNode().getName().equals("flow-classifier")) {
                 return true;
             }
-            yangFileInfo = yangFileInfoIterator.next();
         }
         return false;
     }
@@ -343,10 +408,12 @@
      * @param jarFile jar file name
      * @throws IOException when fails to do IO operations
      */
-    private void addInterJarRootNodes(String jarFile) throws IOException {
+    private List<YangNode> addInterJarRootNodes(String jarFile) throws IOException {
+        List<YangNode> interJarResolvedNodes = new ArrayList<>();
         try {
-            List<YangNode> interJarResolvedNodes = parseJarFile(jarFile, TARGET);
-
+            YangModel model = parseJarFile(jarFile, TARGET);
+            id = model.getYangModelId();
+            interJarResolvedNodes.addAll(getYangNodes(model));
             for (YangNode node : interJarResolvedNodes) {
                 YangFileInfo dependentFileInfo = new YangFileInfo();
                 node.setToTranslate(false);
@@ -358,14 +425,15 @@
         } catch (IOException e) {
             throw new IOException("failed to resolve in interjar scenario.");
         }
+        return interJarResolvedNodes;
     }
 
     /**
      * Creates a temporary test jar files.
      */
-    private void createTestJar() {
+    private void createTestJar(String name) {
 
-        File file = new File(TARGET + TARGET_RESOURCE_PATH);
+        File file = new File(TARGET_RESOURCE_PATH);
         File[] files = file.listFiles();
         String[] source = new String[files.length];
 
@@ -375,7 +443,7 @@
         byte[] buf = new byte[1024];
 
         try {
-            String target = TARGET + JAR_FILE_NAME;
+            String target = TARGET + name + JAR_FILE_NAME;
             JarOutputStream out = new JarOutputStream(new FileOutputStream(target));
             for (String element : source) {
                 FileInputStream in = new FileInputStream(element);
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java
index ed4e608..fa73a7c 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java
@@ -57,6 +57,7 @@
 
         utilManager.createYangFileInfoSet(paths);
         utilManager.parseYangFileInfoSet();
+        utilManager.createYangNodeSet();
         utilManager.resolveDependenciesUsingLinker();
 
         YangPluginConfig yangPluginConfig = new YangPluginConfig();
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
index 974a71d..600e943 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yang.model;
 
+import java.io.Serializable;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -27,9 +28,10 @@
 /**
  * Represents default YANG model implementation.
  */
-public class DefaultYangModel implements YangModel {
+public class DefaultYangModel implements YangModel, Serializable {
 
     private final Map<YangModuleId, YangModule> moduleMap;
+    private String modelId;
 
     /**
      * Creates an instance of YANG model.
@@ -37,6 +39,7 @@
      * @param b YANG model builder
      */
     private DefaultYangModel(Builder b) {
+        modelId = b.modelId;
         moduleMap = b.moduleMap;
     }
 
@@ -67,6 +70,11 @@
     }
 
     @Override
+    public String getYangModelId() {
+        return modelId;
+    }
+
+    @Override
     public YangModule getYangModule(YangModuleId id) {
         return moduleMap.get(id);
     }
@@ -79,7 +87,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(moduleMap);
+        return Objects.hash(moduleMap, modelId);
     }
 
     @Override
@@ -99,13 +107,14 @@
         } else {
             return false;
         }
-        return true;
+        return Objects.equals(modelId, that.modelId);
     }
 
     @Override
     public String toString() {
         return toStringHelper(getClass())
                 .add("model", moduleMap)
+                .add("modelId", modelId)
                 .toString();
     }
 
@@ -123,6 +132,7 @@
      */
     public static class Builder implements YangModel.Builder {
         private final Map<YangModuleId, YangModule> moduleMap;
+        private String modelId;
 
         /**
          * Creates an instance of YANG model builder.
@@ -138,6 +148,12 @@
         }
 
         @Override
+        public Builder addModelId(String id) {
+            modelId = id;
+            return this;
+        }
+
+        @Override
         public YangModel build() {
             return new DefaultYangModel(this);
         }
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
index d209144..846b205 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
@@ -16,10 +16,11 @@
 
 package org.onosproject.yang.model;
 
+import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
-import java.nio.file.Path;
+import java.io.Serializable;
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
@@ -28,11 +29,11 @@
 /**
  * Represents default YANG module.
  */
-public class DefaultYangModule implements YangModule {
+public class DefaultYangModule implements YangModule, Serializable {
 
     private YangModuleId id;
-    private Path yangSrc;
-    private Path metadata;
+    private File yangSrc;
+    private File metadata;
 
     /**
      * Creates an instance of default YANG module.
@@ -41,7 +42,7 @@
      * @param yangSrc  YANG source file path
      * @param metadata YANG metadata source file path
      */
-    public DefaultYangModule(YangModuleId id, Path yangSrc, Path metadata) {
+    public DefaultYangModule(YangModuleId id, File yangSrc, File metadata) {
         checkNotNull(yangSrc);
         checkNotNull(metadata);
         checkNotNull(id);
@@ -58,17 +59,16 @@
     @Override
     public InputStream getYangSource() {
         try {
-            return new FileInputStream(yangSrc.toString());
+            return new FileInputStream(yangSrc);
         } catch (FileNotFoundException e) {
-            throw new ModelException("Yang source file not found." +
-                                             yangSrc);
+            throw new ModelException("Yang source file not found." + yangSrc);
         }
     }
 
     @Override
     public InputStream getMetadata() {
         try {
-            return new FileInputStream(metadata.toString());
+            return new FileInputStream(metadata);
         } catch (FileNotFoundException e) {
             throw new ModelException("metadata source file not found." +
                                              metadata);
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java
index 284d605..b81a7f8 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.yang.model;
 
+import java.io.Serializable;
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
@@ -24,7 +25,7 @@
 /**
  * Represents default YANG module identifier.
  */
-public class DefaultYangModuleId implements YangModuleId {
+public class DefaultYangModuleId implements YangModuleId, Serializable {
 
     private String moduleName;
     private String revision;
diff --git a/model/src/main/java/org/onosproject/yang/model/YangModel.java b/model/src/main/java/org/onosproject/yang/model/YangModel.java
index e4cca01..fe482a3 100644
--- a/model/src/main/java/org/onosproject/yang/model/YangModel.java
+++ b/model/src/main/java/org/onosproject/yang/model/YangModel.java
@@ -38,6 +38,13 @@
     Set<YangModuleId> getYangModulesId();
 
     /**
+     * Returns model id for requested context.
+     *
+     * @return YANG model identifier
+     */
+    String getYangModelId();
+
+    /**
      * Returns YANG module information corresponding to a given module
      * identifier.
      *
@@ -70,6 +77,14 @@
         Builder addModule(YangModuleId id, YangModule module);
 
         /**
+         * Adds model identifier.
+         *
+         * @param modelId model identifier
+         * @return builder
+         */
+        Builder addModelId(String modelId);
+
+        /**
          * Builds an instance of YANG model.
          *
          * @return YANG model
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java b/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
index f1ae61b..f7fcb2a 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
@@ -24,7 +24,7 @@
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 import org.onosproject.yang.model.YangModel;
 import org.onosproject.yang.model.YangModule;
-import org.onosproject.yang.runtime.helperutils.YangModuleExtendedInfo;
+import org.onosproject.yang.compiler.tool.YangModuleExtendedInfo;
 import org.slf4j.Logger;
 
 import java.io.IOException;
@@ -66,7 +66,7 @@
      * Returns YANG node for given YANG model.
      *
      * @param model YANG model
-     * @return YANG node for given model
+     * @return YANG nodes for given model
      */
     public static Set<YangNode> getNodes(YangModel model) {
         Set<YangNode> nodes = new HashSet<>();
@@ -82,6 +82,7 @@
      * Adds linker and translator info for each data model tree.
      *
      * @param nodes YANG node
+     * @return YANG nodes for given model
      */
     public static Set<YangNode> addLinkerAndJavaInfo(Set<YangNode> nodes) {
         YangLinker yangLinker = new YangLinkerManager();
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java b/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java
index 98930b6..a7971d3 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java
@@ -17,6 +17,8 @@
 package org.onosproject.yang.runtime;
 
 import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModule;
+import org.onosproject.yang.model.YangModuleId;
 
 import java.util.Set;
 
@@ -29,15 +31,18 @@
      * Registers a new model.
      *
      * @param param parameters having model to be registered with additional
-     *              informations provided by app
+     *              information provided by app
+     * @throws IllegalArgumentException when requested model with provided
+     *                                  identifier is already registered
      */
-    void registerModel(ModelRegistrationParam param);
+    void registerModel(ModelRegistrationParam param)
+            throws IllegalArgumentException;
 
     /**
      * Unregisters the specified model.
      *
      * @param param parameters having model to be registered with additional
-     *              informations provided by app
+     *              information provided by app
      */
     void unregisterModel(ModelRegistrationParam param);
 
@@ -47,4 +52,20 @@
      * @return collection of models
      */
     Set<YangModel> getModels();
+
+    /**
+     * Returns YANG model for given model id.
+     *
+     * @param id model identifier
+     * @return YANG model
+     */
+    YangModel getModel(String id);
+
+    /**
+     * Returns YANG module for given YANG module id.
+     *
+     * @param id module identifier
+     * @return YANG module
+     */
+    YangModule getModule(YangModuleId id);
 }
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java
index 9abf5c0..9e80e8c 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java
@@ -17,22 +17,20 @@
 package org.onosproject.yang.runtime.helperutils;
 
 import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.utils.DataModelUtils;
-import org.onosproject.yang.model.DefaultYangModel;
-import org.onosproject.yang.model.DefaultYangModuleId;
 import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.model.YangModuleId;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Pattern;
 
-import static java.nio.file.Paths.get;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.parseJarFile;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.getYangNodes;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.parseJarFile;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
 import static org.osgi.framework.FrameworkUtil.getBundle;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -66,54 +64,31 @@
         BundleContext context = getBundle(modClass).getBundleContext();
         if (context != null) {
             Bundle bundle = context.getBundle();
-            List<YangNode> curNodes;
+            List<YangNode> curNodes = new ArrayList<>();
             String jarPath;
             String metaPath;
             jarPath = getJarPathFromBundleLocation(
                     bundle.getLocation(), context.getProperty(USER_DIRECTORY));
             metaPath = jarPath + SLASH + YANG_RESOURCES + SLASH + YANG_META_DATA;
-            curNodes = processJarParsingOperations(jarPath);
-            // process model creations.
-            if (curNodes != null && !curNodes.isEmpty()) {
-                return processYangModel(metaPath, curNodes);
+            YangModel model = processJarParsingOperations(jarPath);
+            if (model != null) {
+                curNodes.addAll(getYangNodes(model));
+                // process model creations.
+                if (!curNodes.isEmpty()) {
+                    try {
+                        return processYangModel(metaPath, curNodes,
+                                                model.getYangModelId(), false);
+                    } catch (IOException e) {
+                        log.error(" failed to create process YANG model " +
+                                          e.getMessage(), e);
+                    }
+                }
             }
         }
         return null;
     }
 
     /**
-     * Returns YANG model for application.
-     *
-     * @param path     path for metadata file
-     * @param curNodes curNodes YANG nodes
-     * @return YANG model
-     */
-    public static YangModel processYangModel(String path,
-                                             List<YangNode> curNodes) {
-        YangModel.Builder b = DefaultYangModel.builder();
-        YangModuleId id;
-        for (YangNode node : curNodes) {
-            id = processModuleId(node);
-            YangModuleExtendedInfo module =
-                    new YangModuleExtendedInfo(id, get(node.getFileName()), get(path));
-            module.setSchema(node);
-            b.addModule(id, module);
-        }
-        return b.build();
-    }
-
-    /**
-     * Returns YANG module id for a given YANG module node.
-     *
-     * @param module YANG module
-     * @return YANG module id for a given YANG module node
-     */
-    public static YangModuleId processModuleId(YangNode module) {
-        String rev = DataModelUtils.getDateInStringFormat(module);
-        return new DefaultYangModuleId(module.getName(), rev);
-    }
-
-    /**
      * Returns jar path from bundle mvnLocationPath.
      *
      * @param mvnLocationPath mvnLocationPath of bundle
@@ -148,12 +123,12 @@
     }
 
     /**
-     * Process jar file for fetching YANG nodes.
+     * Process jar file for fetching YANG model.
      *
      * @param path jar file path
-     * @return YANG schema nodes
+     * @return YANG model
      */
-    private static List<YangNode> processJarParsingOperations(String path) {
+    private static YangModel processJarParsingOperations(String path) {
         //Deserialize data model and get the YANG node set.
         String jar = path + JAR;
         try {
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
index 7eeee89..bd684e6 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
@@ -64,6 +64,9 @@
     private static final String AT = "@";
     private final Logger log = getLogger(getClass());
     private static final String E_NEXIST = "node with {} namespace not found.";
+    private static final String E_MEXIST =
+            "Model with given modelId already exist";
+    private static final String E_NULL = "Model must not be null";
     /*
      * Map for storing YANG schema nodes. Key will be the schema name of
      * module node defined in YANG file.
@@ -97,40 +100,37 @@
     private final ConcurrentMap<String, YangSchemaNode> nameSpaceSchemaStore;
 
     /**
-     * Set of YANG models.
+     * Map for storing YANG model with respect to model identifier. Will
+     * be used by other application to register and unregister the YANG
+     * models based on model identifier.
      */
-    private final Set<YangModel> models;
+    private final ConcurrentMap<String, YangModel> modelIdStore;
 
     /**
      * Creates an instance of default YANG schema registry.
      */
     public DefaultYangModelRegistry() {
-        models = new LinkedHashSet<>();
         yangSchemaStore = new ConcurrentHashMap<>();
         regClassNameKeyStore = new ConcurrentHashMap<>();
         registerClassStore = new ConcurrentHashMap<>();
         nameSpaceSchemaStore = new ConcurrentHashMap<>();
         qNameKeyStore = new ConcurrentHashMap<>();
+        modelIdStore = new ConcurrentHashMap<>();
     }
 
     @Override
-    public void registerModel(ModelRegistrationParam param) {
-        YangModel model = checkNotNull(param.getYangModel(), "Model must not be null");
+    public void registerModel(ModelRegistrationParam param) throws
+            IllegalArgumentException {
+        YangModel model = checkNotNull(param.getYangModel(), E_NULL);
         Set<YangNode> curNodes = getNodes(model);
-        models.add(model);
-        String name;
-        Class<?> service;
-        AppModuleInfo info;
+
         //adding class info if added by application.
-        for (YangModuleId id : model.getYangModulesId()) {
-            info = param.getAppModuleInfo(id);
-            if (info != null) {
-                service = info.getModuleClass();
-                name = service.getName();
-                if (!registerClassStore.containsKey(name)) {
-                    registerClassStore.put(name, service);
-                }
-            }
+        updateRegClassStore(param);
+
+        if (modelIdStore.containsKey(model.getYangModelId())) {
+            throw new IllegalArgumentException(E_MEXIST);
+        } else {
+            modelIdStore.put(model.getYangModelId(), param.getYangModel());
         }
 
         //Register all the YANG nodes.
@@ -164,9 +164,8 @@
     @Override
     public void unregisterModel(ModelRegistrationParam param) {
         synchronized (DefaultYangModelRegistry.class) {
-            YangModel model = checkNotNull(param.getYangModel(),
-                                           "Model must not be null");
-            models.remove(model);
+            YangModel model = checkNotNull(param.getYangModel(), E_NULL);
+            modelIdStore.remove(model.getYangModelId());
             //Unregister all yang files
             Set<YangNode> curNodes = getNodes(model);
             for (YangNode node : curNodes) {
@@ -196,6 +195,10 @@
 
     @Override
     public Set<YangModel> getModels() {
+        Set<YangModel> models = new LinkedHashSet<>();
+        for (Map.Entry<String, YangModel> entry : modelIdStore.entrySet()) {
+            models.add(entry.getValue());
+        }
         return unmodifiableSet(models);
     }
 
@@ -206,10 +209,28 @@
      * @param schemaName schema name
      * @return YANG schema node
      */
-    YangSchemaNode getForSchemaName(String schemaName) {
+    public YangSchemaNode getForSchemaName(String schemaName) {
         return getForNameWithRev(schemaName);
     }
 
+    @Override
+    public YangModel getModel(String id) {
+        return modelIdStore.get(id);
+    }
+
+    @Override
+    public org.onosproject.yang.model.YangModule getModule(YangModuleId id) {
+        for (Map.Entry<String, YangModel> entry : modelIdStore
+                .entrySet()) {
+            org.onosproject.yang.model.YangModule module = entry.getValue()
+                    .getYangModule(id);
+            if (module != null) {
+                return module;
+            }
+        }
+        return null;
+    }
+
     /**
      * Returns schema node for the given name. Name should be generated class
      * name. the name provided here should be for registered class.
@@ -454,6 +475,36 @@
         return null;
     }
 
+
+    /**
+     * Updates registered class store.
+     *
+     * @param param model registrations param
+     */
+    public void updateRegClassStore(ModelRegistrationParam param) {
+        Class<?> service;
+        AppModuleInfo info;
+        for (YangModuleId id : param.getYangModel().getYangModulesId()) {
+            info = param.getAppModuleInfo(id);
+            if (info != null) {
+                service = info.getModuleClass();
+                addRegClass(service.getName(), service);
+            }
+        }
+    }
+
+    /**
+     * Adds the registered class.
+     *
+     * @param name    qualified name of the class
+     * @param service generated class
+     */
+    public void addRegClass(String name, Class<?> service) {
+        if (!registerClassStore.containsKey(name)) {
+            registerClassStore.put(name, service);
+        }
+    }
+
     /**
      * Updates child's context. It sets itself as a parent context for first
      * level child's in module/sub-module.
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java
new file mode 100644
index 0000000..c9a3f75
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.runtime.impl;
+
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.runtime.ModelRegistrationParam;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.deSerializeDataModel;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.getYangNodes;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
+import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
+import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
+import static org.onosproject.yang.runtime.DefaultModelRegistrationParam.builder;
+import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
+
+/**
+ * Represents mock YANG schema node for unit test cases.
+ */
+public final class MockYangSchemaNodeProvider {
+
+    private static final String FS = File.separator;
+    private static final String PATH = System.getProperty("user.dir") +
+            FS + "target" + FS + "classes" + FS;
+    private static final String SER_FILE_PATH = "yang" + FS + "resources" +
+            FS + "YangMetaData.ser";
+    private static final String META_PATH = PATH + SER_FILE_PATH;
+    private static final String TEMP_FOLDER_PATH = PATH + TEMP;
+    private static DefaultYangModelRegistry reg;
+    private static List<YangNode> nodes = new ArrayList<>();
+    private static String id;
+
+    /**
+     * Creates an instance of mock YANG schema for unit test cases.
+     */
+    private MockYangSchemaNodeProvider() {
+    }
+
+    /**
+     * Process YANG schema node for a application.
+     */
+    public static void processSchemaRegistry() {
+        try {
+            reg = new DefaultYangModelRegistry();
+            //Need to deserialize generated meta data file for unit tests.
+            YangModel model = deSerializeDataModel(META_PATH);
+            Set<YangNode> appNode = getYangNodes(model);
+            nodes.addAll(appNode);
+            id = model.getYangModelId();
+            reg.registerModel(param(nodes));
+
+            //now we need to update the registered classes for YOB.
+            addClassInfo(nodes);
+            deleteDirectory(TEMP_FOLDER_PATH);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * Unregister given nodes from runtime service.
+     *
+     * @param nodes list of nodes
+     */
+    public static void unRegister(List<YangNode> nodes) {
+        reg.unregisterModel(param(nodes));
+    }
+
+    /**
+     * Prepares model registration parameter.
+     *
+     * @param nodes list of nodes
+     * @return model registration parameter
+     */
+    private static ModelRegistrationParam param(List<YangNode> nodes) {
+        //Create model registration param.
+        ModelRegistrationParam.Builder b = builder();
+
+        //create a new YANG model
+        YangModel model = null;
+        try {
+            model = processYangModel(META_PATH, nodes, id, true);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        //set YANG model
+        b.setYangModel(model);
+        return b.build();
+    }
+
+    static YangModel processModelTest() {
+        YangModel model = null;
+        try {
+            model = deSerializeDataModel(META_PATH);
+            Set<YangNode> appNode = getYangNodes(model);
+            List<YangNode> nodes = new ArrayList<>();
+            nodes.addAll(appNode);
+            return processYangModel(META_PATH, nodes, id, false);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return model;
+    }
+
+    /**
+     * Prepares model registration parameter.
+     *
+     * @param nodes list of nodes
+     */
+    private static void addClassInfo(List<YangNode> nodes) {
+        //Process loading class file.
+        String appName;
+        ClassLoader classLoader = MockYangSchemaNodeProvider.class.getClassLoader();
+
+        Iterator<YangNode> it = nodes.iterator();
+        while (it.hasNext()) {
+            YangSchemaNode node = it.next();
+
+            //If service class is not generated then use
+            // interface file to load this class.
+            appName = getInterfaceClassName(node);
+            Class<?> cls;
+            try {
+                cls = classLoader.loadClass(appName);
+            } catch (ClassNotFoundException e) {
+                continue;
+            }
+
+            reg.addRegClass(appName, cls);
+        }
+    }
+
+    /**
+     * Returns schema registry.
+     *
+     * @return schema registry
+     */
+
+    public static DefaultYangModelRegistry registry() {
+        return reg;
+    }
+
+    /**
+     * Adds a mock node in reg.
+     *
+     * @param node schema node
+     * @param name name of node
+     */
+    public static void addMockNode(YangSchemaNode node, String name) {
+        reg.processApplicationContext(node, name);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java
index 171ca85..489d816 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java
@@ -81,6 +81,8 @@
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 
 /**
  * Unit test cases for YANG tree builder for context switch for augment, RPC
@@ -91,8 +93,6 @@
     private static final String CHOC = "choc";
     private static final String VAL = "val";
     private static final String IND = "ind";
-    private final TestYangSchemaNodeProvider schemaProvider = new
-            TestYangSchemaNodeProvider();
     private ResourceData rscData;
     private DefaultDataTreeBuilder treeBuilder;
     private ResourceId id;
@@ -108,8 +108,8 @@
      * Do the prior setup for each UT.
      */
     private void setUp() {
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
+        processSchemaRegistry();
+        DefaultYangModelRegistry registry = registry();
         treeBuilder = new DefaultDataTreeBuilder(registry);
     }
 
@@ -705,7 +705,7 @@
         data = new DefaultModelObjectData.Builder();
         data.addModelObject(con);
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class).build());
+                                .addChild(DefaultFirstLevel.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -748,8 +748,8 @@
 
         data = new DefaultModelObjectData.Builder();
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class)
-                               .addChild(DefaultOnlyContainer.class).build());
+                                .addChild(DefaultFirstLevel.class)
+                                .addChild(DefaultOnlyContainer.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -798,7 +798,7 @@
         data = new DefaultModelObjectData.Builder();
         data.addModelObject(con);
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class).build());
+                                .addChild(DefaultFirstLevel.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -862,7 +862,7 @@
         data = new DefaultModelObjectData.Builder();
         data.addModelObject(con);
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class).build());
+                                .addChild(DefaultFirstLevel.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -942,7 +942,7 @@
         data = new DefaultModelObjectData.Builder();
         data.addModelObject(con);
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class).build());
+                                .addChild(DefaultFirstLevel.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -1050,8 +1050,8 @@
         con.listLeaf(list);
 
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class)
-                               .addChild(DefaultContainerList.class).build());
+                                .addChild(DefaultFirstLevel.class)
+                                .addChild(DefaultContainerList.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -1128,9 +1128,9 @@
         ListLeafKeys key = new ListLeafKeys();
         key.name("key leaf");
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class)
-                               .addChild(DefaultContainerList.class)
-                               .addChild(DefaultListLeaf.class, key).build());
+                                .addChild(DefaultFirstLevel.class)
+                                .addChild(DefaultContainerList.class)
+                                .addChild(DefaultListLeaf.class, key).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -1206,7 +1206,7 @@
         data = new DefaultModelObjectData.Builder();
         data.addModelObject(con);
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class).build());
+                                .addChild(DefaultFirstLevel.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -1273,7 +1273,7 @@
         data = new DefaultModelObjectData.Builder();
         data.addModelObject(con);
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class).build());
+                                .addChild(DefaultFirstLevel.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
@@ -1331,7 +1331,7 @@
         data = new DefaultModelObjectData.Builder();
         data.addModelObject(con);
         data.identifier(ModelObjectId.builder()
-                               .addChild(DefaultFirstLevel.class).build());
+                                .addChild(DefaultFirstLevel.class).build());
 
         // Builds YANG tree in YTB.
         rscData = treeBuilder.getResourceData(data.build());
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java
index 3951a26..8be816f 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java
@@ -121,6 +121,8 @@
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 
 /*
  *
@@ -139,8 +141,6 @@
  */
 public class DefaultDataTreeBuilderTest {
 
-    private final TestYangSchemaNodeProvider schemaProvider = new
-            TestYangSchemaNodeProvider();
     @Rule
     public ExpectedException thrown = ExpectedException.none();
     private ResourceData rscData;
@@ -159,8 +159,8 @@
      * Do the prior setup for each UT.
      */
     private void setUp() {
-        schemaProvider.processSchemaRegistry();
-        registry = schemaProvider.registry();
+        processSchemaRegistry();
+        registry = registry();
         treeBuilder = new DefaultDataTreeBuilder(registry);
     }
 
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java
index ff8bd82..d509e3a 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java
@@ -16,18 +16,31 @@
 
 package org.onosproject.yang.runtime.impl;
 
+import com.google.common.collect.ImmutableSet;
 import org.junit.Test;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangRevision;
 import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.DefaultYangModuleId;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModule;
+import org.onosproject.yang.model.YangModuleId;
 
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
 import java.util.ArrayList;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Set;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processModelTest;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.unRegister;
 
 /**
  * Unit test for model registry.
@@ -58,9 +71,16 @@
     private static final String DATE_NAMESPACE = "2015-12-08";
     private static final String NAMESPACE =
             "urn:ietf:params:xml:ns:yang:ietf-network4:check:namespace";
+    private static final String MODEL_ID = "onos-yang-runtime";
 
-    private final TestYangSchemaNodeProvider provider =
-            new TestYangSchemaNodeProvider();
+
+    /**
+     * Do the prior setup for each UT.
+     */
+    private DefaultYangModelRegistry setUp() {
+        processSchemaRegistry();
+        return registry();
+    }
 
     /**
      * Unit test case in which schema node should be present.
@@ -70,11 +90,21 @@
     @Test
     public void testForGetSchemaNode()
             throws IOException {
-
-        provider.processSchemaRegistry();
-
         List<YangNode> nodes = new ArrayList<>();
-        DefaultYangModelRegistry registry = provider.registry();
+        DefaultYangModelRegistry registry = setUp();
+
+        YangModel model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model != null));
+
+        Set<YangModule> modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() != 0));
+        assertThat(true, is(modules != null));
+
+        YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+                                                        "2017-12-08");
+
+        YangModule module = registry.getModule(moduleId);
+        assertThat(true, is(moduleId.equals(module.getYangModuleId())));
 
         YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
         assertThat(true, is(SCHEMA_NAME_3.equals(yangNode.getName())));
@@ -82,12 +112,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_3);
         assertThat(true, is(SCHEMA_NAME_3.equals(yangNode.getName())));
 
-        Class<?> cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_3.equals(cls.getName())));
-
         //Unregister service
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
         assertThat(true, is(yangNode == null));
@@ -95,24 +122,56 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_3);
         assertThat(true, is(yangNode == null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls == null));
+        module = registry.getModule(moduleId);
+        assertThat(true, is(module == null));
+
+        Set<YangModel> models = registry.getModels();
+        assertThat(true, is(models.size() == 0));
+
+        model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model == null));
+
+        modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() == 0));
     }
 
     /**
-     * Unit test case in which schema node should be present with multi
-     * revisions.
+     * Unit test case for getting the metadata for a particular module.
      *
      * @throws IOException when fails to do IO operation
      */
     @Test
-    public void testForGetSchemaNodeWhenNoRevision()
+    public void testForGetMetaData()
             throws IOException {
-
-        provider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = provider.registry();
-
+        DefaultYangModelRegistry registry = setUp();
+        YangNode node = null;
         List<YangNode> nodes = new ArrayList<>();
+
+        YangModel model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model != null));
+
+        Set<YangModule> modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() != 0));
+        assertThat(true, is(modules != null));
+        processModelTest();
+        YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+                                                        "2017-12-08");
+
+        // TODO: fix this for yang model test
+        YangModule module = registry.getModule(moduleId);
+        assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+        InputStream stream = module.getMetadata();
+        ObjectInputStream objectInputStream = new ObjectInputStream(stream);
+        try {
+            node = ((YangNode) objectInputStream.readObject());
+        } catch (ClassNotFoundException e) {
+            System.out.println(e);
+        }
+        objectInputStream.close();
+        assertThat(true, is(
+                node.getName().equals(moduleId.moduleName())));
+
         //Service with rev.
         YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
@@ -120,12 +179,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
 
-        Class<?> cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_REV_15.equals(cls.getName())));
-
         //unregister SERVICE_NAME_REV_15.
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
         assertThat(true, is(yangNode != null));
@@ -133,9 +189,6 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
         assertThat(true, is(yangNode == null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls == null));
-
         //Here the yangNode should be the node which does not have revision.
         // asset should pass with false.
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
@@ -149,12 +202,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_NO_REV.equals(cls.getName())));
-
         //unregister SERVICE_NAME_NO_REV.
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         //Here the yangNode should be the node which have different revision.
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
@@ -164,8 +214,17 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
         assertThat(true, is(yangNode == null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls == null));
+        module = registry.getModule(moduleId);
+        assertThat(true, is(module == null));
+
+        Set<YangModel> models = registry.getModels();
+        assertThat(true, is(models.size() == 0));
+
+        model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model == null));
+
+        modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() == 0));
     }
 
     /**
@@ -175,13 +234,27 @@
      * @throws IOException when fails to do IO operation
      */
     @Test
-    public void testForGetSchemaNodeWhenMultiRevision()
+    public void testForGetSchemaNodeWhenNoRevision()
             throws IOException {
 
-        provider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = provider.registry();
-
+        DefaultYangModelRegistry registry = setUp();
+        YangNode node = null;
         List<YangNode> nodes = new ArrayList<>();
+
+        YangModel model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model != null));
+
+        Set<YangModule> modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() != 0));
+        assertThat(true, is(modules != null));
+
+        YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+                                                        "2017-12-08");
+
+        // TODO: fix this for yang model test
+        YangModule module = registry.getModule(moduleId);
+        assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
         //Service with rev.
         YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
@@ -189,12 +262,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
 
-        Class<?> cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_REV_15.equals(cls.getName())));
-
-        //Unregister SERVICE_NAME_REV_15.
+        //unregister SERVICE_NAME_REV_15.
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
         assertThat(true, is(yangNode != null));
@@ -207,8 +277,96 @@
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
         assertThat(true, is(((YangNode) yangNode).getRevision() == null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls != null));
+        //---------------------------------------------------------------//
+
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+        assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+        yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
+        assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+        //unregister SERVICE_NAME_NO_REV.
+        nodes.add((YangNode) yangNode);
+        unRegister(nodes);
+
+        //Here the yangNode should be the node which have different revision.
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+        assertThat(true, is(yangNode != null));
+        assertThat(true, is(((YangNode) yangNode).getRevision() != null));
+
+        yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
+        assertThat(true, is(yangNode == null));
+
+        module = registry.getModule(moduleId);
+        assertThat(true, is(module == null));
+
+        Set<YangModel> models = registry.getModels();
+        assertThat(true, is(models.size() == 0));
+
+        model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model == null));
+
+        modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() == 0));
+    }
+
+    private Set<YangModule> getYangModules(YangModel model, String modelId) {
+        Set<org.onosproject.yang.model.YangModule> modules =
+                new LinkedHashSet<>();
+        if (model != null) {
+            modules.addAll(model.getYangModules());
+        }
+        return ImmutableSet.copyOf(modules);
+    }
+
+    /**
+     * Unit test case in which schema node should be present with multi
+     * revisions.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testForGetSchemaNodeWhenMultiRevision()
+            throws IOException {
+
+        DefaultYangModelRegistry registry = setUp();
+
+        List<YangNode> nodes = new ArrayList<>();
+
+        YangModel model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model != null));
+
+        Set<YangModule> modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() != 0));
+        assertThat(true, is(modules != null));
+
+        YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+                                                        "2017-12-08");
+
+        YangModule module = registry.getModule(moduleId);
+        assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+        //Service with rev.
+        YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
+        assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+        yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
+        assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+        //Unregister SERVICE_NAME_REV_15.
+        nodes.add((YangNode) yangNode);
+        unRegister(nodes);
+
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+        assertThat(true, is(yangNode != null));
+
+        yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
+        assertThat(true, is(yangNode == null));
+
+        //Here the yangNode should be the node which does not have revision.
+        // asset should pass with false.
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+        assertThat(true, is(((YangNode) yangNode).getRevision() == null));
 
         //---------------------------------------------------------------//
 
@@ -223,12 +381,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_16);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_REV_16.equals(cls.getName())));
-
         //Unregister SERVICE_NAME_REV_16.
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_16);
         assertThat(true, is(yangNode == null));
@@ -237,9 +392,6 @@
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
         assertThat(true, is(((YangNode) yangNode).getRevision() == null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls != null));
-
         //---------------------------------------------------------------//
 
         //Service with different revision.
@@ -250,12 +402,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_17);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_REV_17.equals(cls.getName())));
-
         //Unregister SERVICE_NAME_REV_17.
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_17);
         assertThat(true, is(yangNode == null));
@@ -264,9 +413,6 @@
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
         assertThat(true, is(((YangNode) yangNode).getRevision() == null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls != null));
-
         //---------------------------------------------------------------//
 
         //Service no revision.
@@ -277,12 +423,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_NO_REV.equals(cls.getName())));
-
         //Unregister SERVICE_NAME_NO_REV.
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
         assertThat(true, is(yangNode == null));
@@ -292,9 +435,6 @@
         assertThat(true, is(yangNode != null));
         assertThat(true, is(((YangNode) yangNode).getRevision() != null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls != null));
-
         //---------------------------------------------------------------//
 
         //Service with different revision.
@@ -305,12 +445,9 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_14);
         assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(INTERFACE_NAME_REV_14.equals(cls.getName())));
-
         //Unregister SERVICE_NAME_REV_14.
         nodes.add((YangNode) yangNode);
-        provider.unRegister(nodes);
+        unRegister(nodes);
 
         yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
         assertThat(true, is(yangNode == null));
@@ -318,8 +455,17 @@
         yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_14);
         assertThat(true, is(yangNode == null));
 
-        cls = registry.getRegisteredClass(yangNode);
-        assertThat(true, is(cls == null));
+        module = registry.getModule(moduleId);
+        assertThat(true, is(module == null));
+
+        Set<YangModel> models = registry.getModels();
+        assertThat(true, is(models.size() == 0));
+
+        model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model == null));
+
+        modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() == 0));
     }
 
     /**
@@ -327,8 +473,7 @@
      */
     @Test
     public void testGetNodeWrtNamespace() {
-        provider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = provider.registry();
+        DefaultYangModelRegistry registry = setUp();
 
         YangSchemaNode yangNode = registry.getForNameSpace(NAMESPACE, false);
         assertThat(true, is(CHECK.equals(yangNode.getName())));
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java
index 9b1ff75..44b7aab 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java
@@ -17,7 +17,6 @@
 package org.onosproject.yang.runtime.impl;
 
 import org.junit.Test;
-
 import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.AddressAllocationType;
 import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.DefaultL3VpnSvc;
 import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.RoutingProtocolType;
@@ -70,6 +69,8 @@
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 
 /**
  * Unit test for l3vpn app. test for conversion of model data to resource data.
@@ -84,8 +85,6 @@
     private List<DataNode> dataNodes;
     private DataNode node;
     private DefaultModelObjectData.Builder data;
-    private final TestYangSchemaNodeProvider schemaProvider = new
-            TestYangSchemaNodeProvider();
     private static final String NAME_SPACE_SVC =
             "urn:ietf:params:xml:ns:yang:ietf-l3vpn-svc";
     private static final String NAME_SPACE_EXT =
@@ -95,8 +94,8 @@
      * Do the prior setup for each UT.
      */
     private void setUp() {
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
+        processSchemaRegistry();
+        DefaultYangModelRegistry registry = registry();
         treeBuilder = new DefaultDataTreeBuilder(registry);
     }
 
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java
index 1e88a85..fb553f7 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java
@@ -28,7 +28,6 @@
 import org.onosproject.yang.compiler.datamodel.YangRpc;
 import org.onosproject.yang.compiler.datamodel.YangType;
 import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
-
 import org.onosproject.yang.gen.v1.check.check.Cont53;
 import org.onosproject.yang.gen.v1.check.check.DefaultCont53;
 import org.onosproject.yang.gen.v1.check.check.DefaultList56;
@@ -68,6 +67,9 @@
 import static org.hamcrest.core.Is.is;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.INT32;
 import static org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.carrier.multiplexes.TypesEnum.SPACE_DIVISION;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.addMockNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -76,8 +78,6 @@
 public class MoIdToRscIdTest {
 
     private final Logger log = getLogger(getClass());
-    private final TestYangSchemaNodeProvider provider = new
-            TestYangSchemaNodeProvider();
     ModIdToRscIdConverter builder;
     DefaultYangModelRegistry reg;
     private ResourceId rscId;
@@ -89,8 +89,8 @@
      * Sets up all prerequisite.
      */
     private void setUp() {
-        provider.processSchemaRegistry();
-        reg = provider.registry();
+        processSchemaRegistry();
+        reg = registry();
         builder = new ModIdToRscIdConverter(reg);
     }
 
@@ -105,7 +105,7 @@
         } catch (DataModelException e) {
             log.info("test error");
         }
-        provider.addMockNode(mod, getQualifiedName());
+        addMockNode(mod, getQualifiedName());
     }
 
     /**
@@ -119,7 +119,7 @@
         } catch (DataModelException e) {
             log.info("test error");
         }
-        provider.addMockNode(mod, getQualifiedName());
+        addMockNode(mod, getQualifiedName());
     }
 
     /**
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSchemaNodeProvider.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSchemaNodeProvider.java
deleted file mode 100644
index 41dec1c..0000000
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSchemaNodeProvider.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.yang.runtime.impl;
-
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.runtime.AppModuleInfo;
-import org.onosproject.yang.runtime.DefaultAppModuleInfo;
-import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
-import org.onosproject.yang.runtime.ModelRegistrationParam;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processModuleId;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processYangModel;
-import static org.onosproject.yang.runtime.RuntimeHelper.addLinkerAndJavaInfo;
-import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
-
-/**
- * Represents mock bundle context. provides bundle context for YSR to do unit
- * testing.
- */
-public class TestYangSchemaNodeProvider {
-
-    private static final String FS = File.separator;
-    private static final String PATH = System.getProperty("user.dir") +
-            FS + "target" + FS + "classes" + FS;
-    private static final String SER_FILE_PATH = "yang" + FS + "resources" +
-            FS + "YangMetaData.ser";
-    private static final String META_PATH = PATH + SER_FILE_PATH;
-    private static final String TEMP_FOLDER_PATH = PATH + TEMP;
-    private DefaultYangModelRegistry reg = new DefaultYangModelRegistry();
-    private List<YangNode> nodes = new ArrayList<>();
-
-    /**
-     * Creates an instance of mock bundle context.
-     */
-    public TestYangSchemaNodeProvider() {
-    }
-
-    /**
-     * Process YANG schema node for a application.
-     */
-    public void processSchemaRegistry() {
-        try {
-            //Need to deserialize generated meta data file for unit tests.
-            Set<YangNode> appNode = deSerializeDataModel(META_PATH);
-            addLinkerAndJavaInfo(appNode);
-            nodes.addAll(appNode);
-            reg.registerModel(prepareParam(nodes));
-            deleteDirectory(TEMP_FOLDER_PATH);
-        } catch (IOException e) {
-        }
-    }
-
-    /**
-     * Unregister given nodes from runtime service.
-     *
-     * @param nodes list of nodes
-     */
-    public void unRegister(List<YangNode> nodes) {
-        reg.unregisterModel(prepareParam(nodes));
-    }
-
-    /**
-     * Prepares model registration parameter.
-     *
-     * @param nodes list of nodes
-     * @return model registration parameter
-     */
-    private ModelRegistrationParam prepareParam(List<YangNode> nodes) {
-        //Process loading class file.
-        String appName;
-        ClassLoader classLoader = getClass().getClassLoader();
-
-        //Create model registration param.
-        ModelRegistrationParam.Builder b =
-                DefaultModelRegistrationParam.builder();
-
-        //create a new YANG model
-        YangModel model = processYangModel(META_PATH, nodes);
-        //set YANG model
-        b.setYangModel(model);
-
-        Iterator<YangNode> it = nodes.iterator();
-        while (it.hasNext()) {
-            YangSchemaNode node = it.next();
-
-            //If service class is not generated then use
-            // interface file to load this class.
-            appName = getInterfaceClassName(node);
-            Class<?> cls;
-            try {
-                cls = classLoader.loadClass(appName);
-            } catch (ClassNotFoundException e) {
-                continue;
-            }
-
-            //generate app info.
-            AppModuleInfo info = new DefaultAppModuleInfo(cls, null);
-            b.addAppModuleInfo(processModuleId((YangNode) node), info);
-        }
-        return b.build();
-    }
-
-    /**
-     * Returns schema registry.
-     *
-     * @return schema registry
-     */
-    public DefaultYangModelRegistry registry() {
-        return reg;
-    }
-
-    /**
-     * Adds a mock node in reg.
-     *
-     * @param node schema node
-     * @param name name of node
-     */
-    public void addMockNode(YangSchemaNode node, String name) {
-        reg.processApplicationContext(node, name);
-    }
-}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
index b01b44e..3c55968 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
@@ -22,20 +22,18 @@
 
 import java.util.List;
 
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+
 /**
  * Tests the default schema context provider methods.
  */
 public class TestYangSerializerContext implements YangSerializerContext {
 
-    private static TestYangSchemaNodeProvider schemaProvider =
-            new TestYangSchemaNodeProvider();
-
-
     @Override
     public SchemaContext getContext() {
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
-        return registry;
+        processSchemaRegistry();
+        return registry();
     }
 
     @Override
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java
index 32b362c..c8b24c4 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java
@@ -64,14 +64,15 @@
 import static org.onosproject.yang.gen.v1.modulelistandkey.rev20160826.modulelistandkey.type.Con1.LeafIdentifier.LL;
 import static org.onosproject.yang.gen.v1.modulelistandkey.rev20160826.modulelistandkey.type.Leaf6Enum.ENUM2;
 import static org.onosproject.yang.model.ModelObjectId.builder;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 
 /**
  * Unit test cases for resource id conversion from model object id.
  */
 public class YtbResourceIdTest {
 
-    private final TestYangSchemaNodeProvider schemaProvider = new
-            TestYangSchemaNodeProvider();
+
     @Rule
     public ExpectedException thrown = ExpectedException.none();
     private ResourceData rscData;
@@ -81,14 +82,15 @@
     private SchemaId sid;
     private ModelObjectId mid;
     private Builder data;
+    DefaultYangModelRegistry reg;
 
     /**
      * Prior setup for each UT.
      */
     private void setUp() {
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
-        treeBuilder = new DefaultDataTreeBuilder(registry);
+        processSchemaRegistry();
+        reg = registry();
+        treeBuilder = new DefaultDataTreeBuilder(reg);
     }
 
     /**
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java
index 5c34129..e1faafc 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java
@@ -25,32 +25,37 @@
 import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
 import org.onosproject.yang.model.SchemaId;
 import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-import org.onosproject.yang.runtime.impl.TestYangSchemaNodeProvider;
 
 import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafListSchemaContext;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafSchemaContext;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkSchemaContext;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 
 /**
  * Tests the default schema context methods.
  */
 public class CaseSchemaContextTest {
 
-    private static TestYangSchemaNodeProvider schemaProvider =
-            new TestYangSchemaNodeProvider();
+    private static final String CASENS = "yrt:choice-case";
+    private DefaultYangModelRegistry registry;
 
-    public static final String CASENS = "yrt:choice-case";
+    /**
+     * Do the prior setup for each UT.
+     */
+    private void setUp() {
+        processSchemaRegistry();
+        registry = registry();
+    }
 
     /**
      * Checks module level choice-case data node parent context.
      */
     @Test
     public void caseSchemaContTest() throws DataModelException {
-
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
+        setUp();
         SchemaId id = new SchemaId("pretzel", CASENS);
         YangLeaf leaf = (YangLeaf) registry.getChildContext(id);
         checkLeafSchemaContext("pretzel", CASENS, "/", null, leaf);
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java
index 8915b33..1fac570 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java
@@ -27,30 +27,35 @@
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.SchemaId;
 import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-import org.onosproject.yang.runtime.impl.TestYangSchemaNodeProvider;
 
 import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafListSchemaContext;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafSchemaContext;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkSchemaContext;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 
 /**
  * Tests the default schema context methods.
  */
 public class LeafSchemaContextTest {
 
-    private static TestYangSchemaNodeProvider schemaProvider =
-            new TestYangSchemaNodeProvider();
+    private static final String FOODNS = "yrt:food";
+    private DefaultYangModelRegistry registry;
 
-    public static final String FOODNS = "yrt:food";
+    /**
+     * Do the prior setup for each UT.
+     */
+    private void setUp() {
+        processSchemaRegistry();
+        registry = registry();
+    }
 
     /**
      * Checks leaf, leaf-list, choice-case data node parent context.
      */
     @Test
     public void leafSchemaContTest() throws DataModelException {
-
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
+        setUp();
         SchemaId id = new SchemaId("food", FOODNS);
         YangNode child = (YangNode) registry.getChildContext(id);
         checkSchemaContext("food", FOODNS, "/", null,
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java
index 99e2e3e..f816ae8 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java
@@ -25,7 +25,6 @@
 import org.onosproject.yang.model.DataNode;
 import org.onosproject.yang.model.SchemaId;
 import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-import org.onosproject.yang.runtime.impl.TestYangSchemaNodeProvider;
 
 import java.util.List;
 
@@ -33,23 +32,30 @@
 import static org.onosproject.yang.runtime.impl.TestUtils.TOPONS;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafSchemaContext;
 import static org.onosproject.yang.runtime.impl.TestUtils.checkSchemaContext;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
 
 /**
  * Tests the default schema context methods.
  */
 public class SchemaContextTest {
 
-    private static TestYangSchemaNodeProvider schemaProvider =
-            new TestYangSchemaNodeProvider();
+    private DefaultYangModelRegistry registry;
+
+    /**
+     * Do the prior setup for each UT.
+     */
+    private void setUp() {
+        processSchemaRegistry();
+        registry = registry();
+    }
 
     /**
      * Validates the getting schema context by schema Id scenario.
      */
     @Test
     public void schemaContextBySchemaIdTest() {
-
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
+        setUp();
         SchemaId id = new SchemaId("networks", IETFNS);
         YangNode child = (YangNode) registry.getChildContext(id);
         checkSchemaContext("networks", IETFNS, "/", null,
diff --git a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSchemaNodeProvider.java b/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSchemaNodeProvider.java
deleted file mode 100644
index 7844625..0000000
--- a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSchemaNodeProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.yang.serializers.json;
-
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.runtime.AppModuleInfo;
-import org.onosproject.yang.runtime.DefaultAppModuleInfo;
-import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
-import org.onosproject.yang.runtime.ModelRegistrationParam;
-import org.onosproject.yang.runtime.YangModelRegistry;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processModuleId;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processYangModel;
-import static org.onosproject.yang.runtime.RuntimeHelper.addLinkerAndJavaInfo;
-import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
-
-/**
- * Represents mock bundle context. provides bundle context for YSR to do unit
- * testing.
- */
-public class MockYangSchemaNodeProvider {
-
-    private static final String FS = File.separator;
-    private static final String PATH = System.getProperty("user.dir") +
-            FS + "target" + FS + "classes" + FS;
-    private static final String SER_FILE_PATH = "yang" + FS + "resources" +
-            FS + "YangMetaData.ser";
-    private static final String META_PATH = PATH + SER_FILE_PATH;
-    private static final String TEMP_FOLDER_PATH = PATH + TEMP;
-    private YangModelRegistry reg = new DefaultYangModelRegistry();
-    private List<YangNode> nodes = new ArrayList<>();
-
-    /**
-     * Creates an instance of mock bundle context.
-     */
-    public MockYangSchemaNodeProvider() {
-    }
-
-    /**
-     * Process YANG schema node for a application.
-     */
-    public void processSchemaRegistry() {
-        try {
-            //Need to deserialize generated meta data file for unit tests.
-            Set<YangNode> appNode = deSerializeDataModel(META_PATH);
-            addLinkerAndJavaInfo(appNode);
-            nodes.addAll(appNode);
-            reg.registerModel(prepareParam(nodes));
-            deleteDirectory(TEMP_FOLDER_PATH);
-        } catch (IOException e) {
-        }
-    }
-
-    /**
-     * Unregister given nodes from runtime service.
-     *
-     * @param nodes list of nodes
-     */
-    public void unRegister(List<YangNode> nodes) {
-        reg.unregisterModel(prepareParam(nodes));
-    }
-
-    /**
-     * Prepares model registration parameter.
-     *
-     * @param nodes list of nodes
-     * @return model registration parameter
-     */
-    private ModelRegistrationParam prepareParam(List<YangNode> nodes) {
-        //Process loading class file.
-        String appName;
-        ClassLoader classLoader = getClass().getClassLoader();
-
-        //Create model registration param.
-        ModelRegistrationParam.Builder b =
-                DefaultModelRegistrationParam.builder();
-
-        //create a new YANG model
-        YangModel model = processYangModel(META_PATH, nodes);
-        //set YANG model
-        b.setYangModel(model);
-
-        Iterator<YangNode> it = nodes.iterator();
-        while (it.hasNext()) {
-            YangSchemaNode node = it.next();
-
-            //If service class is not generated then use
-            // interface file to load this class.
-            appName = getInterfaceClassName(node);
-            Class<?> cls;
-            try {
-                cls = classLoader.loadClass(appName);
-            } catch (ClassNotFoundException e) {
-                continue;
-            }
-
-            //generate app info.
-            AppModuleInfo info = new DefaultAppModuleInfo(cls, null);
-            b.addAppModuleInfo(processModuleId((YangNode) node), info);
-        }
-        return b.build();
-    }
-
-    /**
-     * Returns schema registry.
-     *
-     * @return schema registry
-     */
-    public DefaultYangModelRegistry registry() {
-        return (DefaultYangModelRegistry) reg;
-    }
-}
diff --git a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java b/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java
index aeb4d8d..da1769d 100644
--- a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java
+++ b/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java
@@ -20,18 +20,18 @@
 import org.onosproject.yang.runtime.Annotation;
 import org.onosproject.yang.runtime.DefaultAnnotation;
 import org.onosproject.yang.runtime.YangSerializerContext;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
 
 import java.util.LinkedList;
 import java.util.List;
 
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+
 /**
  * Tests the default schema context provider methods.
  */
 public class MockYangSerializerContext implements YangSerializerContext {
 
-    private static MockYangSchemaNodeProvider schemaProvider =
-            new MockYangSchemaNodeProvider();
     private static final String NETCONF_NS =
             "urn:ietf:params:xml:ns:netconf:base:1.0";
     private static final String XMNLS_NC = "xml:xc";
@@ -39,9 +39,8 @@
 
     @Override
     public SchemaContext getContext() {
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
-        return registry;
+        processSchemaRegistry();
+        return registry();
     }
 
     @Override
diff --git a/serializers/xml/pom.xml b/serializers/xml/pom.xml
index 7af054f..7d77764 100644
--- a/serializers/xml/pom.xml
+++ b/serializers/xml/pom.xml
@@ -54,6 +54,7 @@
                 <version>${project.version}</version>
                 <configuration>
                     <yangFilesDir>src/test/resources</yangFilesDir>
+                    <modelId>xml</modelId>
                 </configuration>
                 <executions>
                     <execution>
diff --git a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/DefaultYangModelRegistryTest.java b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/DefaultYangModelRegistryTest.java
new file mode 100644
index 0000000..99a97b4
--- /dev/null
+++ b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/DefaultYangModelRegistryTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.serializers.xml;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.DefaultYangModuleId;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModule;
+import org.onosproject.yang.model.YangModuleId;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.unRegister;
+
+/**
+ * Unit test for model registry with model id configured using maven as "xml".
+ */
+public class DefaultYangModelRegistryTest {
+
+    private static final String SCHEMA_NAME_3 = "animal";
+    private static final String SCHEMA_NAME_4_15 = "Logistics-manager@2016-05-24";
+    private static final String SCHEMA_NAME_4 = "Logistics-manager";
+    private static final String SCHEMA_NAME_5 = "attributes";
+    private static final String MODEL_ID = "xml";
+
+    private DefaultYangModelRegistry setUp() {
+        processSchemaRegistry();
+        return registry();
+    }
+
+    /**
+     * Unit test case in which schema node should be present.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testForGetSchemaNode()
+            throws IOException {
+
+        List<YangNode> nodes = new ArrayList<>();
+        DefaultYangModelRegistry registry = setUp();
+
+        YangModel model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model != null));
+
+        Set<YangModule> modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() != 0));
+        assertThat(true, is(modules != null));
+
+        YangModuleId moduleId = new DefaultYangModuleId("animal",
+                                                        "2016-06-24");
+
+        YangModule module = registry.getModule(moduleId);
+        assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+        YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
+        assertThat(true, is(SCHEMA_NAME_3.equals(yangNode.getName())));
+
+        //Unregister service
+        nodes.add((YangNode) yangNode);
+        unRegister(nodes);
+
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
+        assertThat(true, is(yangNode == null));
+
+        module = registry.getModule(moduleId);
+        assertThat(true, is(module == null));
+
+        Set<YangModel> models = registry.getModels();
+        assertThat(true, is(models.size() == 0));
+
+        model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model == null));
+
+        modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() == 0));
+    }
+
+    /**
+     * Unit test case in which schema node should be present with multi
+     * revisions.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testForGetSchemaNodeWhenNoRevision()
+            throws IOException {
+
+        DefaultYangModelRegistry registry = setUp();
+
+        List<YangNode> nodes = new ArrayList<>();
+
+        YangModel model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model != null));
+
+        Set<YangModule> modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() != 0));
+        assertThat(true, is(modules != null));
+
+        YangModuleId moduleId = new DefaultYangModuleId("Logistics-manager",
+                                                        "2016-05-24");
+
+        YangModule module = registry.getModule(moduleId);
+        assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+        //Service with rev.
+        YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
+        assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+        assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+        //unregister SERVICE_NAME_REV_15.
+        nodes.add((YangNode) yangNode);
+        unRegister(nodes);
+
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+        assertThat(true, is(yangNode == null));
+
+        //Here the yangNode should be the node which does not have revision.
+        // asset should pass with false.
+        yangNode = registry.getForSchemaName(SCHEMA_NAME_5);
+        assertThat(true, is(((YangNode) yangNode).getRevision() == null));
+
+        //---------------------------------------------------------------//
+
+        module = registry.getModule(moduleId);
+        assertThat(true, is(module == null));
+
+        Set<YangModel> models = registry.getModels();
+        assertThat(true, is(models.size() == 0));
+
+        model = registry.getModel(MODEL_ID);
+        assertThat(true, is(model == null));
+
+        modules = getYangModules(model, MODEL_ID);
+        assertThat(true, is(modules.size() == 0));
+    }
+
+    private Set<YangModule> getYangModules(YangModel model, String modelId) {
+        Set<org.onosproject.yang.model.YangModule> modules =
+                new LinkedHashSet<>();
+        if (model != null) {
+            modules.addAll(model.getYangModules());
+        }
+        return ImmutableSet.copyOf(modules);
+    }
+}
diff --git a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java
deleted file mode 100644
index f71f2c8..0000000
--- a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.yang.serializers.xml;
-
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.runtime.AppModuleInfo;
-import org.onosproject.yang.runtime.DefaultAppModuleInfo;
-import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
-import org.onosproject.yang.runtime.ModelRegistrationParam;
-import org.onosproject.yang.runtime.YangModelRegistry;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processModuleId;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processYangModel;
-import static org.onosproject.yang.runtime.RuntimeHelper.addLinkerAndJavaInfo;
-import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
-
-/**
- * Represents mock bundle context. provides bundle context for YSR to do unit
- * testing.
- */
-public class MockYangSchemaNodeProvider {
-
-    private static final String FS = File.separator;
-    private static final String PATH = System.getProperty("user.dir") +
-            FS + "target" + FS + "classes" + FS;
-    private static final String SER_FILE_PATH = "yang" + FS + "resources" +
-            FS + "YangMetaData.ser";
-    private static final String META_PATH = PATH + SER_FILE_PATH;
-    private static final String TEMP_FOLDER_PATH = PATH + TEMP;
-    private YangModelRegistry reg = new DefaultYangModelRegistry();
-    private List<YangNode> nodes = new ArrayList<>();
-
-    /**
-     * Creates an instance of mock bundle context.
-     */
-    public MockYangSchemaNodeProvider() {
-    }
-
-    /**
-     * Process YANG schema node for a application.
-     */
-    public void processSchemaRegistry() {
-        try {
-            //Need to deserialize generated meta data file for unit tests.
-            Set<YangNode> appNode = deSerializeDataModel(META_PATH);
-            addLinkerAndJavaInfo(appNode);
-            nodes.addAll(appNode);
-            reg.registerModel(prepareParam(nodes));
-            deleteDirectory(TEMP_FOLDER_PATH);
-        } catch (IOException e) {
-        }
-    }
-
-    /**
-     * Unregister given nodes from runtime service.
-     *
-     * @param nodes list of nodes
-     */
-    public void unRegister(List<YangNode> nodes) {
-        reg.unregisterModel(prepareParam(nodes));
-    }
-
-    /**
-     * Prepares model registration parameter.
-     *
-     * @param nodes list of nodes
-     * @return model registration parameter
-     */
-    private ModelRegistrationParam prepareParam(List<YangNode> nodes) {
-        //Process loading class file.
-        String appName;
-        ClassLoader classLoader = getClass().getClassLoader();
-
-        //Create model registration param.
-        ModelRegistrationParam.Builder b =
-                DefaultModelRegistrationParam.builder();
-
-        //create a new YANG model
-        YangModel model = processYangModel(META_PATH, nodes);
-        //set YANG model
-        b.setYangModel(model);
-
-        Iterator<YangNode> it = nodes.iterator();
-        while (it.hasNext()) {
-            YangSchemaNode node = it.next();
-
-            //If service class is not generated then use
-            // interface file to load this class.
-            appName = getInterfaceClassName(node);
-            Class<?> cls;
-            try {
-                cls = classLoader.loadClass(appName);
-            } catch (ClassNotFoundException e) {
-                continue;
-            }
-
-            //generate app info.
-            AppModuleInfo info = new DefaultAppModuleInfo(cls, null);
-            b.addAppModuleInfo(processModuleId((YangNode) node), info);
-        }
-        return b.build();
-    }
-
-    /**
-     * Returns schema registry.
-     *
-     * @return schema registry
-     */
-    public DefaultYangModelRegistry registry() {
-        return (DefaultYangModelRegistry) reg;
-    }
-}
diff --git a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
index c89700b..56125d8 100644
--- a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
+++ b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
@@ -20,18 +20,18 @@
 import org.onosproject.yang.runtime.Annotation;
 import org.onosproject.yang.runtime.DefaultAnnotation;
 import org.onosproject.yang.runtime.YangSerializerContext;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
 
 import java.util.LinkedList;
 import java.util.List;
 
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+
 /**
  * Tests the default schema context provider methods.
  */
 public class MockYangSerializerContext implements YangSerializerContext {
 
-    private static MockYangSchemaNodeProvider schemaProvider =
-            new MockYangSchemaNodeProvider();
     private static final String NETCONF_NS =
             "urn:ietf:params:xml:ns:netconf:base:1.0";
     private static final String XMNLS_NC = "xmlns:xc";
@@ -39,9 +39,8 @@
 
     @Override
     public SchemaContext getContext() {
-        schemaProvider.processSchemaRegistry();
-        DefaultYangModelRegistry registry = schemaProvider.registry();
-        return registry;
+        processSchemaRegistry();
+        return registry();
     }
 
     @Override