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 06770db..6380f62 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
@@ -21,17 +21,20 @@
 import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
 import org.onosproject.yang.compiler.linker.YangLinker;
 import org.onosproject.yang.compiler.linker.impl.YangLinkerManager;
+import org.onosproject.yang.compiler.tool.YangModuleExtendedInfo;
 import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
 import org.onosproject.yang.model.YangModel;
 import org.onosproject.yang.model.YangModule;
-import org.onosproject.yang.compiler.tool.YangModuleExtendedInfo;
 import org.slf4j.Logger;
 
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
 
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
 import static org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorUtil.translate;
+import static org.onosproject.yang.compiler.utils.UtilConstants.AT;
 import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -65,20 +68,53 @@
     /**
      * Returns YANG node for given YANG model.
      *
-     * @param model YANG model
+     * @param model           YANG model
+     * @param yangSchemaStore YANG schema store
      * @return YANG nodes for given model
      */
-    public static Set<YangNode> getNodes(YangModel model) {
+    public static Set<YangNode> getNodes(
+            YangModel model,
+            ConcurrentMap<String, ConcurrentMap<String, YangSchemaNode>> yangSchemaStore) {
         Set<YangNode> nodes = new HashSet<>();
         for (YangModule info : model.getYangModules()) {
             YangModuleExtendedInfo ex = (YangModuleExtendedInfo) info;
-            nodes.add(ex.getSchema());
+            YangNode node = ex.getSchema();
+            if (ex.isInterJar()) {
+                String name = node.getName();
+                String date = getDateInStringFormat(node);
+                String revName = name;
+                if (date != null) {
+                    revName = name + AT + date;
+                }
+                node = (YangNode) yangSchemaStore.get(name).get(revName);
+            }
+            nodes.add((YangNode) node);
         }
         //Target linking.
         return addLinkerAndJavaInfo(nodes);
     }
 
     /**
+     * Returns self YANG node for given YANG model.
+     *
+     * @param model           YANG model
+     * @param yangSchemaStore YANG schema store
+     * @return YANG nodes for given model
+     */
+    public static Set<YangNode> getSelfNodes(
+            YangModel model,
+            ConcurrentMap<String, ConcurrentMap<String, YangSchemaNode>> yangSchemaStore) {
+        Set<YangNode> nodes = new HashSet<>();
+        for (YangModule info : model.getYangModules()) {
+            YangModuleExtendedInfo ex = (YangModuleExtendedInfo) info;
+            if (!ex.isInterJar()) {
+                nodes.add(ex.getSchema());
+            }
+        }
+        return nodes;
+    }
+
+    /**
      * Adds linker and translator info for each data model tree.
      *
      * @param nodes YANG node
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 d846bee..ca75517 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
@@ -50,11 +50,11 @@
 import static java.util.Collections.unmodifiableSet;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getNodeIdFromSchemaId;
-import static org.onosproject.yang.compiler.tool.YangCompilerManager.processModuleId;
 import static org.onosproject.yang.compiler.utils.UtilConstants.REGEX;
 import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
 import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
 import static org.onosproject.yang.runtime.RuntimeHelper.getNodes;
+import static org.onosproject.yang.runtime.RuntimeHelper.getSelfNodes;
 import static org.onosproject.yang.runtime.RuntimeHelper.getServiceName;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -65,13 +65,12 @@
         SingleInstanceNodeContext {
 
     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";
     private static final String E_NOT_VAL = "Model id is invalid";
-
+    private final Logger log = getLogger(getClass());
     /*
      * Map for storing YANG schema nodes. Key will be the schema name of
      * module node defined in YANG file.
@@ -127,7 +126,7 @@
     public void registerModel(ModelRegistrationParam param) throws
             IllegalArgumentException {
         YangModel model = checkNotNull(param.getYangModel(), E_NULL);
-        Set<YangNode> curNodes = getNodes(model);
+        Set<YangNode> curNodes = getNodes(model, yangSchemaStore);
 
         //adding class info if added by application.
         AppModuleInfo info = null;
@@ -157,12 +156,7 @@
         //Register all the YANG nodes, excluding nodes from dependent jar.
         if (curNodes != null && !curNodes.isEmpty()) {
             for (YangNode node : curNodes) {
-                YangModuleId mid = processModuleId(node);
-                YangModuleExtendedInfo m =
-                        (YangModuleExtendedInfo) model.getYangModule(mid);
-                if (!m.isInterJar()) {
-                    registerModule(node);
-                }
+                registerModule(node);
             }
         }
 
@@ -179,12 +173,7 @@
         String name;
         //register all the nodes present in YANG model.
         name = getInterfaceClassName(node);
-        if (!regClassNameKeyStore.containsKey(name)) {
-            processApplicationContext(node, name);
-        } else {
-            log.info("class already registered with model registry " +
-                             "{}", name);
-        }
+        processApplicationContext(node, name);
     }
 
     @Override
@@ -193,15 +182,10 @@
             YangModel model = checkNotNull(param.getYangModel(), E_NULL);
             modelIdStore.remove(model.getYangModelId());
             //Unregister all yang files, excluding nodes from dependent jar.
-            Set<YangNode> curNodes = getNodes(model);
+            Set<YangNode> curNodes = getSelfNodes(model, yangSchemaStore);
             if (curNodes != null && !curNodes.isEmpty()) {
                 for (YangNode node : curNodes) {
-                    YangModuleId id = processModuleId(node);
-                    YangModuleExtendedInfo m =
-                            (YangModuleExtendedInfo) model.getYangModule(id);
-                    if (!m.isInterJar()) {
-                        processUnReg(getInterfaceClassName(node));
-                    }
+                    processUnReg(getInterfaceClassName(node));
                 }
             }
         }
