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 296dd7d..5b21e83 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
@@ -104,28 +104,26 @@
      * Returns YANG model for application.
      *
      * @param path    path for metadata file
-     * @param list    list of YANG node
+     * @param info    list of YANG node info
      * @param modelId model id
      * @param fromUt  if method is called from unit test
      * @return YANG model
-     * @throws IOException when fails to IO operations
      */
     public static YangModel processYangModel(
-            String path, List<YangNode> list, String modelId, boolean fromUt)
-            throws IOException {
+            String path, List<YangNodeInfo> info, String modelId, boolean fromUt) {
         YangModel.Builder b = DefaultYangModel.builder();
         YangModuleId id;
-        for (YangNode node : list) {
-            id = processModuleId(node);
+        for (YangNodeInfo i : info) {
+            id = processModuleId(i.getNode());
             String serFile = path + id.moduleName() + id.revision() + ".ser";
             if (!fromUt) {
-                serializeModuleMetaData(serFile, node);
+                serializeModuleMetaData(serFile, i.getNode());
             }
             //take the absolute jar path and make a new path for our yang files.
-            String fileName = getFileName(node.getFileName());
+            String fileName = getFileName(i.getNode().getFileName());
             YangModuleExtendedInfo module = new YangModuleExtendedInfo(
-                    id, new File(path + fileName), new File(serFile));
-            module.setSchema(node);
+                    id, new File(path + fileName), new File(serFile), i.isInterJar());
+            module.setSchema(i.getNode());
             b.addModule(id, module);
         }
         return b.addModelId(modelId).build();
@@ -147,15 +145,13 @@
      *
      * @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 {
+    private static void serializeModuleMetaData(String serFileName, YangNode node) {
         try (FileOutputStream outStream = new FileOutputStream(serFileName);
              ObjectOutputStream objOutStream = new ObjectOutputStream(outStream)) {
             objOutStream.writeObject(node);
         } catch (IOException e) {
-            e.printStackTrace();
+            log.info("Error while serializing YANG node", e);
         }
     }
 
@@ -224,8 +220,7 @@
                 createDirectories(resourceGenDir);
 
                 // Resolve inter jar dependency.
-                addSchemaToFileSet(dependentSchema(
-                        param.getDependentSchemas()));
+                addSchemaToFileSet(dependentSchema(param.getDependentSchemas()));
 
                 // Carry out the parsing for all the YANG files.
                 parseYangFileInfoSet();
@@ -306,10 +301,8 @@
      * Resolved inter-jar dependencies.
      *
      * @param dependentSchema dependent schema list
-     * @throws IOException when fails to do IO operations
      */
-    private void addSchemaToFileSet(Set<YangNode> dependentSchema)
-            throws IOException {
+    private void addSchemaToFileSet(Set<YangNode> dependentSchema) {
         if (dependentSchema == null || dependentSchema.isEmpty()) {
             return;
         }
@@ -320,6 +313,7 @@
             dependentFileInfo.setRootNode(node);
             dependentFileInfo.setForTranslator(false);
             dependentFileInfo.setYangFileName(node.getName());
+            dependentFileInfo.setInterJar(true);
             yangFileInfoSet.add(dependentFileInfo);
         }
     }
@@ -431,11 +425,10 @@
      * @param id   model id
      * @throws IOException when fails to IO operations
      */
-    public void processSerialization(String path, String id) throws
-            IOException {
-        List<YangNode> nodelist = new ArrayList<>();
-        nodelist.addAll(yangNodeSet);
-        model = processYangModel(path, nodelist, id, false);
+    public void processSerialization(String path, String id) throws IOException {
+        List<YangNodeInfo> nodeInfo = new ArrayList<>();
+        setNodeInfo(yangFileInfoSet, nodeInfo);
+        model = processYangModel(path, nodeInfo, id, false);
         String serFileName = path + YANG_META_DATA;
         try (FileOutputStream fileOutputStream = new FileOutputStream(serFileName);
              ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)) {
@@ -443,6 +436,45 @@
         }
     }
 
+    private void setNodeInfo(Set<YangFileInfo> yangFileInfoSet,
+        List<YangNodeInfo> infos) {
+        for (YangFileInfo i : yangFileInfoSet) {
+            infos.add(new YangNodeInfo(i.getRootNode(), i.isInterJar()));
+        }
+    }
+
+    /**
+     * Returns YANG model for serialization.
+     *
+     * @param path    path for metadata file
+     * @param list    set of YANG file info
+     * @param modelId model id
+     * @param fromUt  if method is called from unit test
+     * @return YANG model
+     */
+    private static YangModel getModelForSerialization(
+        String path, Set<YangFileInfo> list, String modelId, boolean fromUt) {
+        YangModel.Builder b = DefaultYangModel.builder();
+        YangModuleId id;
+        boolean interJar;
+
+        for (YangFileInfo info : list) {
+            YangNode node = info.getRootNode();
+            id = processModuleId(node);
+            interJar = info.isInterJar();
+            String serFile = path + id.moduleName() + id.revision() + ".ser";
+            if (!fromUt) {
+                serializeModuleMetaData(serFile, node);
+            }
+            //take the absolute jar path and make a new path for our yang files.
+            String fileName = getFileName(node.getFileName());
+            YangModuleExtendedInfo module = new YangModuleExtendedInfo(
+                id, new File(path + fileName), new File(serFile), interJar);
+            module.setSchema(node);
+            b.addModule(id, module);
+        }
+        return b.addModelId(modelId).build();
+    }
     /**
      * Copies yang files to resource directory.
      *
@@ -542,6 +574,19 @@
     }
 
     /**
+     * Sets YANG node info.
+     *
+     * @param model YANG model
+     * @param infos node info to be filled
+     */
+    public static void setNodeInfo(YangModel model, List<YangNodeInfo> infos) {
+        for (YangModule m : model.getYangModules()) {
+            YangModuleExtendedInfo i = (YangModuleExtendedInfo) m;
+            infos.add(new YangNodeInfo(i.getSchema(), i.isInterJar()));
+        }
+    }
+
+    /**
      * Parses jar file and returns YANG model.
      *
      * @param jarFile   jar file to be parsed
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangFileInfo.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangFileInfo.java
index e0d89ce..6b169fb 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangFileInfo.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangFileInfo.java
@@ -17,9 +17,8 @@
 package org.onosproject.yang.compiler.tool;
 
 
-import org.onosproject.yang.compiler.datamodel.YangNode;
-
 import java.util.Objects;
+import org.onosproject.yang.compiler.datamodel.YangNode;
 
 /**
  * Represents YANG file information.
@@ -42,6 +41,11 @@
     private boolean isForTranslator = true;
 
     /**
+     * Flag to know if the root node is an inter-jar node.
+     */
+    private boolean isInterJar;
+
+    /**
      * Returns data model node for YANG file.
      *
      * @return data model node for YANG file
@@ -95,6 +99,24 @@
         this.isForTranslator = isForTranslator;
     }
 
+    /**
+     * Return true if node is inter-jar node.
+     *
+     * @return true if inter-jar, false otherwise
+     */
+    public boolean isInterJar() {
+        return isInterJar;
+    }
+
+    /**
+     * Sets true if it's inter-jar node.
+     *
+     * @param interJar flag indicating if it's inter-jar node
+     */
+    public void setInterJar(boolean interJar) {
+        isInterJar = interJar;
+    }
+
     @Override
     public boolean equals(Object obj) {
 
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
index 8b3977e..0eaf59c 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
@@ -29,6 +29,7 @@
 public class YangModuleExtendedInfo extends DefaultYangModule implements Serializable {
 
     private YangNode schema;
+    private boolean interJar;
 
     /**
      * Creates an instance of YANG module extended information.
@@ -36,12 +37,12 @@
      * @param id       module id
      * @param yangSrc  YANG resource path
      * @param metadata meta data resource path
+     * @param interJar flag indicating if module is from inter-jar
      */
-    public YangModuleExtendedInfo(YangModuleId id, File yangSrc, File metadata) {
+    public YangModuleExtendedInfo(YangModuleId id, File yangSrc, File metadata, boolean interJar) {
         super(id, yangSrc, metadata);
     }
 
-
     /**
      * Returns schema info for module.
      *
@@ -59,4 +60,22 @@
     public void setSchema(YangNode schema) {
         this.schema = schema;
     }
+
+    /**
+     * Returns true if it's inter-jar node.
+     *
+     * @return true if inter-jar node, false otherwise
+     */
+    public boolean isInterJar() {
+        return interJar;
+    }
+
+    /**
+     * Sets true if it's inter-jar node.
+     *
+     * @param interJar true if inter-jar node, false otherwise
+     */
+    public void interJar(boolean interJar) {
+        this.interJar = interJar;
+    }
 }
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangNodeInfo.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangNodeInfo.java
new file mode 100644
index 0000000..32c72e2
--- /dev/null
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangNodeInfo.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.compiler.tool;
+
+import org.onosproject.yang.compiler.datamodel.YangNode;
+
+/**
+ * Represents YANG node information.
+ */
+public class YangNodeInfo {
+
+    private YangNode node;
+    private boolean interJar;
+
+    /**
+     * Creates an instance of YANG node info.
+     *
+     * @param node YANG node
+     * @param interJar flag indicating if it's inter-jar node
+     */
+    public YangNodeInfo(YangNode node, boolean interJar) {
+        this.node = node;
+        this.interJar = interJar;
+    }
+
+    /**
+     * Returns YANG node.
+     *
+     * @return YANG node
+     */
+    public YangNode getNode() {
+        return node;
+    }
+
+    /**
+     * Returns true if inter jar.
+     *
+     * @return true if inter-jar, false otherwise
+     */
+    public boolean isInterJar() {
+        return interJar;
+    }
+}
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 fe5343a..5c99c57 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
@@ -25,6 +25,7 @@
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.tool.YangCompilerManager;
 import org.onosproject.yang.compiler.tool.YangFileInfo;
+import org.onosproject.yang.compiler.tool.YangNodeInfo;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 import org.onosproject.yang.model.YangModel;
 
@@ -279,10 +280,11 @@
 
         createDirectories(TARGET_RESOURCE_PATH);
 
-        List<YangNode> nodes = new ArrayList<>();
-        nodes.addAll(utilManager.getYangNodeSet());
+        List<YangNodeInfo> nodeInfo = new ArrayList<>();
+        setNodeInfo(utilManager.getYangFileInfoSet(), nodeInfo);
+
         //process model which will have only port pair node.
-        processYangModel(TARGET_RESOURCE_PATH, nodes, id, false);
+        processYangModel(TARGET_RESOURCE_PATH, nodeInfo, id, false);
 
         //create a test jar file.
         provideTestJarFile(name);
@@ -295,6 +297,13 @@
         utilManager.getYangNodeSet().remove(node);
     }
 
+    private void setNodeInfo(Set<YangFileInfo> yangFileInfoSet,
+        List<YangNodeInfo> infos) {
+        for (YangFileInfo i : yangFileInfoSet) {
+            infos.add(new YangNodeInfo(i.getRootNode(), i.isInterJar()));
+        }
+    }
+
     /**
      * Test if flow classifier code is generated.
      */
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 b75ad53..68ee7be 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
@@ -16,23 +16,22 @@
 
 package org.onosproject.yang.runtime.helperutils;
 
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.model.YangModel;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.parseJarFile;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.setNodeInfo;
+import static org.osgi.framework.FrameworkUtil.getBundle;
+import static org.slf4j.LoggerFactory.getLogger;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Pattern;
-
-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;
+import org.onosproject.yang.compiler.tool.YangNodeInfo;
+import org.onosproject.yang.model.YangModel;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.slf4j.Logger;
 
 /**
  * Utilities for runtime to use apache tools.
@@ -63,7 +62,7 @@
         BundleContext context = getBundle(modClass).getBundleContext();
         if (context != null) {
             Bundle bundle = context.getBundle();
-            List<YangNode> curNodes = new ArrayList<>();
+            List<YangNodeInfo> nodeInfo = new ArrayList<>();
             String jarPath;
             String metaPath;
             jarPath = getJarPathFromBundleLocation(
@@ -71,16 +70,11 @@
             metaPath = jarPath + SLASH + YANG_RESOURCES + SLASH;
             YangModel model = processJarParsingOperations(jarPath);
             if (model != null) {
-                curNodes.addAll(getYangNodes(model));
+                setNodeInfo(model, nodeInfo);
                 // process model creations.
-                if (!curNodes.isEmpty()) {
-                    try {
-                        return processYangModel(metaPath, curNodes,
+                if (!nodeInfo.isEmpty()) {
+                      return processYangModel(metaPath, nodeInfo,
                                                 model.getYangModelId(), false);
-                    } catch (IOException e) {
-                        log.error(" failed to create process YANG model " +
-                                          e.getMessage(), e);
-                    }
                 }
             }
         }
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
index b6609f2..a4d976e 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java
@@ -18,6 +18,7 @@
 
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.compiler.tool.YangNodeInfo;
 import org.onosproject.yang.model.YangModel;
 import org.onosproject.yang.runtime.ModelRegistrationParam;
 
@@ -98,19 +99,22 @@
         //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();
-        }
+        List<YangNodeInfo> nodeInfo = new ArrayList<>();
+        setNodeInfo(nodes, nodeInfo);
+        YangModel model = processYangModel(META_PATH, nodeInfo, id, true);
 
         //set YANG model
         b.setYangModel(model);
         return b.build();
     }
 
+    private static void setNodeInfo(List<YangNode> nodes, List<YangNodeInfo> nodeInfos) {
+        for (YangNode node : nodes) {
+            YangNodeInfo nodeInfo = new YangNodeInfo(node, false);
+            nodeInfos.add(nodeInfo);
+        }
+    }
+
     static YangModel processModelTest() {
         YangModel model = null;
         try {
@@ -118,7 +122,9 @@
             Set<YangNode> appNode = getYangNodes(model);
             List<YangNode> nodes = new ArrayList<>();
             nodes.addAll(appNode);
-            return processYangModel(META_PATH, nodes, id, false);
+            List<YangNodeInfo> nodeInfo = new ArrayList<>();
+            setNodeInfo(nodes, nodeInfo);
+            return processYangModel(META_PATH, nodeInfo, id, false);
         } catch (IOException e) {
             e.printStackTrace();
         }
