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 ea23160..30122ec 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
@@ -1243,7 +1243,7 @@
     /**
      * Searches for input in given RPC node.
      *
-     * @param rpc yang node
+     * @param rpc YANG RPC node
      * @return input node
      */
     public static YangNode findRpcInput(YangNode rpc) {
@@ -1261,7 +1261,7 @@
     /**
      * Searches for output in given RPC node.
      *
-     * @param rpc yang node
+     * @param rpc YANG RPC node
      * @return output node
      */
     public static YangNode findRpcOutput(YangNode rpc) {
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaEventFragmentFiles.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaEventFragmentFiles.java
index 25c6ca0..b4b404b 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaEventFragmentFiles.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaEventFragmentFiles.java
@@ -329,7 +329,7 @@
         addEventEnum(notificationName);
         addEventSubjectAttribute(javaAttributeInfo);
         addEventSubjectGetter(javaAttributeInfo);
-        addEventSubjectSetter(javaAttributeInfo, currentInfo);
+        addEventSubjectSetter(javaAttributeInfo);
     }
 
     /*Adds event to enum temp file.*/
@@ -370,8 +370,7 @@
     }
 
     /*Adds setter method for event in event subject class.*/
-    private void addEventSubjectSetter(JavaAttributeInfo attr,
-                                       String className)
+    private void addEventSubjectSetter(JavaAttributeInfo attr)
             throws IOException {
         String appDataStructure = null;
         if (attr.getCompilerAnnotation() != null) {
@@ -381,7 +380,7 @@
         appendToFile(getEventSubjectSetterTempFileHandle(), getJavaDoc(
                 MANAGER_SETTER_METHOD, attr.getAttributeName(),
                 false, appDataStructure) + getSetterForClass(
-                attr, className, GENERATE_EVENT_SUBJECT_CLASS) + NEW_LINE);
+                attr, GENERATE_EVENT_SUBJECT_CLASS) + NEW_LINE);
     }
 
     /**
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
index f3a30b6..5cd5651 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaFragmentFiles.java
@@ -114,6 +114,8 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.MAP;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT_PKG;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_PKG;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MULTI_INSTANCE_OBJECT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
@@ -649,10 +651,10 @@
         if (leafList) {
             tempFiles.getJavaImportData().setIfListImported(true);
             return getAttributeOfLeafInfoContainer(tempFiles, container, config,
-                                                   true);
+                                                   true, false);
         }
         return getAttributeOfLeafInfoContainer(tempFiles, container, config,
-                                               false);
+                                               false, false);
     }
 
     /**
@@ -662,6 +664,7 @@
      * @param container     JAVA leaf info container
      * @param config        plugin configurations
      * @param listAttribute flag indicating if list attribute
+     * @param keyLeaf       flag indicating key leaf
      * @return JAVA attribute information
      * @throws IOException when fails to do IO operations
      */
@@ -669,7 +672,8 @@
     getAttributeOfLeafInfoContainer(TempJavaFragmentFiles tempFiles,
                                     JavaLeafInfoContainer container,
                                     YangPluginConfig config,
-                                    boolean listAttribute) throws IOException {
+                                    boolean listAttribute, boolean keyLeaf)
+            throws IOException {
         container.setConflictResolveConfig(config.getConflictResolver());
         container.updateJavaQualifiedInfo();
         addImportForLeafInfo(tempFiles, container);
@@ -681,7 +685,8 @@
                         container.getJavaQualifiedInfo()), listAttribute);
         boolean condition =
                 ((YangSchemaNode) container).getReferredSchema() == null &&
-                        container.getDataType().getDataType() == BITS;
+                        container.getDataType().getDataType() == BITS &&
+                        !keyLeaf;
         if (condition) {
             addBitsHandler(attr, container.getDataType(), tempFiles);
         }
@@ -715,8 +720,8 @@
                 leaf = (YangJavaLeafTranslator) leafIt.next();
                 if (key.equals(leaf.getName())) {
                     attrs.add(getAttributeOfLeafInfoContainer(
-                            beanFile, leaf,
-                            fileInfo.getPluginConfig(), false));
+                            beanFile, leaf, fileInfo.getPluginConfig(),
+                            false, true));
                 }
             }
         }
@@ -998,8 +1003,7 @@
     private void addSetterImpl(JavaAttributeInfo attr)
             throws IOException {
         int generatedJavaFiles = getGeneratedJavaFiles();
-        String setter = getSetterForClass(attr, getGeneratedJavaClassName(),
-                                          generatedJavaFiles);
+        String setter = getSetterForClass(attr, generatedJavaFiles);
         YangDataStructure ds = getYangDataStructure(
                 attr.getCompilerAnnotation());
         String annotation = null;
@@ -1490,7 +1494,7 @@
         YangType attrType = newAttrInfo.getAttributeType();
 
         if (tempFlagSet(LEAF_IDENTIFIER_ENUM_ATTRIBUTES_MASK) &&
-                !listAttr && attrType != null) {
+                attrType != null) {
             leafCount++;
             addLeafIdAttributes(newAttrInfo, leafCount);
         }
@@ -1617,6 +1621,11 @@
             getBeanFiles(curNode).getJavaExtendsListHolder()
                     .addToExtendsList(typeInfo, curNode, getBeanFiles(curNode));
 
+            // add import for multi instance object
+            if (curNode instanceof YangList) {
+                imports.add(getImportString(MODEL_PKG, MULTI_INSTANCE_OBJECT));
+            }
+
             //Create impl class file.
             implClassJavaFileHandle =
                     getJavaFileHandle(getImplClassName(curNode));
@@ -1631,15 +1640,10 @@
 
         if (curNode instanceof YangList) {
             File keyClassJavaFileHandle;
-            YangList list = (YangList) curNode;
-            YangDataStructure data = getYangDataStructure(
-                    list.getCompilerAnnotation());
-            if (list.isConfig() && data == YangDataStructure.MAP) {
-                keyClassJavaFileHandle =
-                        getJavaFileHandle(getJavaClassName(
-                                KEY_CLASS_FILE_NAME_SUFFIX));
-                generateKeyClassFile(keyClassJavaFileHandle, curNode);
-            }
+            keyClassJavaFileHandle =
+                    getJavaFileHandle(getJavaClassName(
+                            KEY_CLASS_FILE_NAME_SUFFIX));
+            generateKeyClassFile(keyClassJavaFileHandle, curNode);
         }
         //Close all the file handles.
         freeTemporaryResources(false);
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaRpcCommandFragmentFiles.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaRpcCommandFragmentFiles.java
index 0bd91fb..9c7f286 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaRpcCommandFragmentFiles.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/TempJavaRpcCommandFragmentFiles.java
@@ -224,14 +224,14 @@
     /**
      * Returns RPC commands contents.
      *
-     * @param curNode YANG RPC node
+     * @param node YANG RPC node
      * @return RPC commands contents
      */
-    public static String getRpcCommandContents(YangNode curNode) {
-        String appService = curNode.getParent()
+    public static String getRpcCommandContents(YangNode node) {
+        String appService = node.getParent()
                 .getJavaClassNameOrBuiltInType() + SERVICE;
         String className = getCapitalCase(getCamelCase(
-                curNode.getJavaClassNameOrBuiltInType(), null)) + COMMAND;
+                node.getJavaClassNameOrBuiltInType(), null)) + COMMAND;
 
         // parameters for constructors
         Map<String, String> param = new LinkedHashMap<>();
@@ -251,7 +251,7 @@
 
                 // add constructor
                 .append(getJavaDocForRpcCommandConstructor(
-                        curNode.getJavaClassNameOrBuiltInType()))
+                        node.getJavaClassNameOrBuiltInType()))
                 .append(NEW_LINE)
                 .append(multiAttrMethodSignature(className, null, PUBLIC,
                                                  null, param, CLASS_TYPE,
@@ -272,10 +272,10 @@
                 .append(NEW_LINE)
 
                 //add execute method
-                .append(getRpcCommandExecuteMethod(appService, curNode))
+                .append(getRpcCommandExecuteMethod(appService, node))
 
                 //add get resource id method
-                .append(getResourceIdMethod(curNode));
+                .append(getResourceIdMethod(node));
 
         // add execute method with msgid
         return builder.toString();
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
index a5d56a0..94304e1 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/YangJavaModelUtils.java
@@ -259,9 +259,7 @@
             if (isLeafPresent || isLeafListPresent) {
                 bean.addCurNodeLeavesInfoToTempFiles((YangNode) info,
                                                      config);
-            }
-            //Add value leaf flag attribute to temp file.
-            if (isLeafPresent) {
+                //Add value leaf flag attribute to temp file.
                 bean.addValueLeafFlag(config, (YangNode) info);
             }
         } else if (info instanceof YangTypeHolder) {
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java
index a4a3057..f27a50b 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaModuleTranslator.java
@@ -181,6 +181,8 @@
                     if (isRpcNotificationPresent(this)) {
                         getTempJavaCodeFragmentFiles()
                                 .generateJavaFile(GENERATE_SERVICE_AND_MANAGER, this);
+                    }
+                    if (isRpcChildNodePresent(this)) {
                         getTempJavaCodeFragmentFiles()
                                 .generateJavaFile(GENERATE_ALL_RPC_CLASS_MASK, this);
                     }
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
index 76e3ff7..b84a03e 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/javamodel/YangJavaSubModuleTranslator.java
@@ -32,6 +32,7 @@
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcChildNodePresent;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.isRpcNotificationPresent;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_EVENT_CLASS_MASK;
+import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_ALL_RPC_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_INTERFACE_WITH_BUILDER;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER;
 import static org.onosproject.yang.compiler.translator.tojava.YangJavaModelUtils.generateCodeOfRootNode;
@@ -191,6 +192,10 @@
                         getTempJavaCodeFragmentFiles().generateJavaFile(
                                 GENERATE_SERVICE_AND_MANAGER, this);
                     }
+                    if (isRpcChildNodePresent(this)) {
+                        getTempJavaCodeFragmentFiles()
+                                .generateJavaFile(GENERATE_ALL_RPC_CLASS_MASK, this);
+                    }
                 }
             }
 
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java
index 1a82f0d..aa608b6 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/ClassDefinitionGenerator.java
@@ -19,6 +19,7 @@
 import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
 import org.onosproject.yang.compiler.datamodel.YangCase;
 import org.onosproject.yang.compiler.datamodel.YangIdentity;
+import org.onosproject.yang.compiler.datamodel.YangList;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangNotification;
 import org.onosproject.yang.compiler.translator.exception.TranslatorException;
@@ -59,9 +60,9 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.COMMA;
 import static org.onosproject.yang.compiler.utils.UtilConstants.COMMAND;
-import static org.onosproject.yang.compiler.utils.UtilConstants.COMPARABLE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_CAPS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_RPC_HANDLER;
+import static org.onosproject.yang.compiler.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ENUM;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ERROR_MSG_JAVA_IDENTITY;
@@ -72,8 +73,11 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.FINAL;
 import static org.onosproject.yang.compiler.utils.UtilConstants.IMPLEMENTS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INTERFACE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.KEYS;
+import static org.onosproject.yang.compiler.utils.UtilConstants.KEY_INFO;
 import static org.onosproject.yang.compiler.utils.UtilConstants.LISTENER_SERVICE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MULTI_INSTANCE_OBJECT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OPEN_CURLY_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
@@ -155,7 +159,7 @@
             case GENERATE_EVENT_LISTENER_INTERFACE:
                 return getEventListenerDefinition(yangName);
             case GENERATE_KEY_CLASS:
-                return getKeyClassDefinition(yangName);
+                return getKeyClassDefinition(yangName, curNode);
             case GENERATE_EVENT_SUBJECT_CLASS:
                 return getClassDefinition(yangName);
             case GENERATE_IDENTITY_CLASS:
@@ -231,12 +235,18 @@
      * Returns impl file class definition.
      *
      * @param yangName file name
+     * @param node     YANG list node
      * @return definition
      */
-    private static String getKeyClassDefinition(String yangName) {
-        String compareName = COMPARABLE + brackets(
-                OPEN_CLOSE_DIAMOND_WITH_VALUE, yangName, null);
-        return getDefinitionWithImplements(CLASS, yangName, PUBLIC, compareName);
+    private static String getKeyClassDefinition(String yangName,
+                                                YangNode node) {
+        String keyInfo = KEY_INFO +
+                brackets(OPEN_CLOSE_DIAMOND_WITH_VALUE,
+                         DEFAULT_CAPS + getCapitalCase(getCamelCase(
+                                 node.getJavaClassNameOrBuiltInType(), null)),
+                         null);
+        return getDefinitionWithImplements(CLASS, yangName, PUBLIC,
+                                           keyInfo);
     }
 
     /**
@@ -394,8 +404,21 @@
                     }
 
                     // append implements
-                    def.append(IMPLEMENTS).append(SPACE)
-                            .append(yangName);
+                    if (curNode instanceof YangList) {
+                        String multiInstanceObj = MULTI_INSTANCE_OBJECT +
+                                brackets(OPEN_CLOSE_DIAMOND_WITH_VALUE,
+                                         getCapitalCase(getCamelCase(yangName,
+                                                                     null)) +
+                                                 KEYS, null);
+                        def.append(NEW_LINE).append(EIGHT_SPACE_INDENTATION)
+                                .append(IMPLEMENTS).append(SPACE)
+                                .append(yangName).append(COMMA).append(SPACE)
+                                .append(multiInstanceObj);
+
+                    } else {
+                        def.append(IMPLEMENTS).append(SPACE)
+                                .append(yangName);
+                    }
                     break;
                 default:
                     return null;
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
index 54d9894..b764ead 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/JavaFileGenerator.java
@@ -17,8 +17,10 @@
 package org.onosproject.yang.compiler.translator.tojava.utils;
 
 import org.onosproject.yang.compiler.datamodel.RpcNotificationContainer;
+import org.onosproject.yang.compiler.datamodel.YangDataStructure;
 import org.onosproject.yang.compiler.datamodel.YangEnumeration;
 import org.onosproject.yang.compiler.datamodel.YangLeavesHolder;
+import org.onosproject.yang.compiler.datamodel.YangList;
 import org.onosproject.yang.compiler.datamodel.YangNode;
 import org.onosproject.yang.compiler.datamodel.YangType;
 import org.onosproject.yang.compiler.datamodel.YangTypeDef;
@@ -42,6 +44,7 @@
 import java.util.List;
 
 import static java.util.Collections.sort;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.DEFAULT_CLASS_MASK;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_ENUM_CLASS;
 import static org.onosproject.yang.compiler.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_CLASS;
@@ -97,7 +100,6 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getAugmentationsString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getBitSetEnumClassFromString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getBitSetEnumClassToString;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getCompareToForKeyClass;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getEnumsConstructor;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getEnumsOfValueMethod;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getEqualsMethod;
@@ -119,6 +121,7 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethodClose;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getToStringMethodOpen;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getUnionToStringMethod;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
 import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.isLeafValueSetInterface;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getImportString;
 import static org.onosproject.yang.compiler.translator.tojava.utils.StringGenerator.getInterfaceLeafIdEnumMethods;
@@ -129,34 +132,43 @@
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getBeanFiles;
 import static org.onosproject.yang.compiler.translator.tojava.utils.TranslatorUtils.getTypeFiles;
 import static org.onosproject.yang.compiler.utils.UtilConstants.BIG_INTEGER;
+import static org.onosproject.yang.compiler.utils.UtilConstants.CLASS_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.CLOSE_CURLY_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.COMMA;
 import static org.onosproject.yang.compiler.utils.UtilConstants.COMMAND;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_CAPS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_RPC_HANDLER;
+import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
+import static org.onosproject.yang.compiler.utils.UtilConstants.DIAMOND_OPEN_BRACKET;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EMPTY_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.ENUM_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EVENT_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EVENT_LISTENER_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EVENT_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.EVENT_SUBJECT_NAME_SUFFIX;
+import static org.onosproject.yang.compiler.utils.UtilConstants.EXTEND;
 import static org.onosproject.yang.compiler.utils.UtilConstants.IMPL_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INTERFACE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.JAVA_UTIL_OBJECTS_IMPORT_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.JAVA_UTIL_PKG;
 import static org.onosproject.yang.compiler.utils.UtilConstants.KEYS;
+import static org.onosproject.yang.compiler.utils.UtilConstants.KEY_INFO;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_PKG;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.OP_PARAM;
+import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PRIVATE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PROTECTED;
 import static org.onosproject.yang.compiler.utils.UtilConstants.PUBLIC;
+import static org.onosproject.yang.compiler.utils.UtilConstants.QUESTION_MARK;
 import static org.onosproject.yang.compiler.utils.UtilConstants.REGISTER_RPC;
 import static org.onosproject.yang.compiler.utils.UtilConstants.RPC_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.RPC_EXTENDED_COMMAND;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SEMI_COLON;
 import static org.onosproject.yang.compiler.utils.UtilConstants.SERVICE_METHOD_STRING;
+import static org.onosproject.yang.compiler.utils.UtilConstants.SPACE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.TYPEDEF_CLASS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.UNION_CLASS;
 import static org.onosproject.yang.compiler.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
@@ -273,16 +285,21 @@
         String className = getCapitalCase(fileInfo.getJavaName()) + KEYS;
         List<String> imports = new ArrayList<>();
 
-        YangNode parent = curNode.getParent();
-        JavaImportData importData = ((JavaCodeGeneratorInfo) parent)
-                .getTempJavaCodeFragmentFiles().getBeanTempFiles()
-                .getJavaImportData();
-        JavaQualifiedTypeInfoTranslator info =
-                new JavaQualifiedTypeInfoTranslator();
-        info.setClassInfo(className);
-        info.setPkgInfo(fileInfo.getPackage());
-        importData.addImportInfo(info, parent.getJavaClassNameOrBuiltInType(),
-                                 parent.getJavaPackage());
+        YangDataStructure data = getYangDataStructure(
+                ((YangList) curNode).getCompilerAnnotation());
+        if (((YangList) curNode).isConfig() &&
+                data == YangDataStructure.MAP) {
+            YangNode parent = curNode.getParent();
+            JavaImportData importData = ((JavaCodeGeneratorInfo) parent)
+                    .getTempJavaCodeFragmentFiles().getBeanTempFiles()
+                    .getJavaImportData();
+            JavaQualifiedTypeInfoTranslator info =
+                    new JavaQualifiedTypeInfoTranslator();
+            info.setClassInfo(className);
+            info.setPkgInfo(fileInfo.getPackage());
+            importData.addImportInfo(info, parent.getJavaClassNameOrBuiltInType(),
+                                     parent.getJavaPackage());
+        }
         List<JavaAttributeInfo> attrs = getListOfAttributesForKey(curNode);
 
         Iterator<JavaAttributeInfo> attrIt = attrs.iterator();
@@ -291,7 +308,8 @@
         while (attrIt.hasNext()) {
             attr = attrIt.next();
             typeInfo = attr.getImportInfo();
-            if (!typeInfo.getClassInfo().equals(className)) {
+            if (!typeInfo.getClassInfo().equals(className) &&
+                    attr.getImportInfo().getPkgInfo() != null) {
                 imports.add(getImportString(attr.getImportInfo().getPkgInfo(),
                                             attr.getImportInfo().getClassInfo()));
             } else {
@@ -299,8 +317,11 @@
             }
         }
 
-        imports.add(getImportString(JAVA_UTIL_PKG,
-                                    JAVA_UTIL_OBJECTS_IMPORT_CLASS));
+        imports.add(getImportString(MODEL_PKG, KEY_INFO));
+        if (!attrs.isEmpty()) {
+            imports.add(getImportString(JAVA_UTIL_PKG,
+                                        JAVA_UTIL_OBJECTS_IMPORT_CLASS));
+        }
 
         initiateJavaFileGeneration(file, GENERATE_KEY_CLASS, imports, curNode,
                                    className);
@@ -311,10 +332,26 @@
             if (attr.isQualifiedName()) {
                 pkg = attr.getImportInfo().getPkgInfo();
             }
-            insertDataIntoJavaFile(file, getJavaAttributeDefinition(
-                    pkg, attr.getImportInfo().getClassInfo(),
-                    attr.getAttributeName(), false, PROTECTED, null));
+            String attrType = attr.getImportInfo().getClassInfo();
+            if (attr.getAttributeType() != null &&
+                    attr.getAttributeType().getDataType() == IDENTITYREF) {
+                String type = attrType;
+                if (pkg != null) {
+                    type = pkg + PERIOD + attrType;
+                }
+                attrType = CLASS_STRING + DIAMOND_OPEN_BRACKET +
+                        QUESTION_MARK + SPACE + EXTEND + SPACE + type +
+                        DIAMOND_CLOSE_BRACKET;
+                insertDataIntoJavaFile(file, getJavaAttributeDefinition(
+                        null, attrType, attr.getAttributeName(),
+                        false, PROTECTED, null));
+            } else {
+                insertDataIntoJavaFile(file, getJavaAttributeDefinition(
+                        pkg, attr.getImportInfo().getClassInfo(),
+                        attr.getAttributeName(), false, PROTECTED, null));
+            }
         }
+
         attrIt = attrs.iterator();
         while (attrIt.hasNext()) {
             attr = attrIt.next();
@@ -328,26 +365,25 @@
             insertDataIntoJavaFile(file, getJavaDoc(MANAGER_SETTER_METHOD, attr
                     .getAttributeName(), false, null));
             insertDataIntoJavaFile(file, getSetterForClass(
-                    attr, className, GENERATE_EVENT_SUBJECT_CLASS));
+                    attr, GENERATE_EVENT_SUBJECT_CLASS));
             insertDataIntoJavaFile(file, NEW_LINE);
         }
-        //add hashcode and equals method.
-        insertDataIntoJavaFile(file, getHashCodeMethodOpen());
-        StringBuilder builder = new StringBuilder();
-        for (JavaAttributeInfo att : attrs) {
-            builder.append(getHashCodeMethod(att));
+        if (!attrs.isEmpty()) {
+            //add hashcode and equals method.
+            insertDataIntoJavaFile(file, getHashCodeMethodOpen());
+            StringBuilder builder = new StringBuilder();
+            for (JavaAttributeInfo att : attrs) {
+                builder.append(getHashCodeMethod(att));
+            }
+            insertDataIntoJavaFile(file, getHashCodeMethodClose(builder.toString()));
+
+            insertDataIntoJavaFile(file, getEqualsMethodOpen(className));
+            StringBuilder builder2 = new StringBuilder();
+            for (JavaAttributeInfo att : attrs) {
+                builder2.append(getEqualsMethod(att)).append(NEW_LINE);
+            }
+            insertDataIntoJavaFile(file, getEqualsMethodClose(builder2.toString()));
         }
-        insertDataIntoJavaFile(file, getHashCodeMethodClose(builder.toString()));
-
-        insertDataIntoJavaFile(file, getEqualsMethodOpen(className));
-        StringBuilder builder2 = new StringBuilder();
-        for (JavaAttributeInfo att : attrs) {
-            builder2.append(getEqualsMethod(att)).append(NEW_LINE);
-        }
-        insertDataIntoJavaFile(file, getEqualsMethodClose(builder2.toString()));
-
-        insertDataIntoJavaFile(file, getCompareToForKeyClass(attrs, className));
-
         insertDataIntoJavaFile(file, CLOSE_CURLY_BRACKET);
         return file;
     }
@@ -1046,8 +1082,10 @@
      * @return true if leaves are present, false otherwise
      */
     private static boolean leavesPresent(YangLeavesHolder holder) {
-        return holder.getListOfLeaf() != null &&
-                !holder.getListOfLeaf().isEmpty();
+        return (holder.getListOfLeaf() != null &&
+                !holder.getListOfLeaf().isEmpty()) ||
+                (holder.getListOfLeafList() != null &&
+                        !holder.getListOfLeafList().isEmpty());
     }
 
     /**
@@ -1078,7 +1116,7 @@
      * @param file    generated file
      * @param curNode current YANG node
      * @param imports imports for file
-     * @return generated file
+     * @return RPC extended command file
      * @throws IOException when fails to generate class file
      */
     public static File generateRpcExtendedCommand(File file, YangNode curNode,
@@ -1100,7 +1138,7 @@
      * @param file    generated file
      * @param curNode current YANG node
      * @param imports imports for file
-     * @return generated file
+     * @return RPC command file
      * @throws IOException when fails to generate class file
      */
     public static File generateRpcCommand(File file, YangNode curNode,
@@ -1124,7 +1162,7 @@
      * @param file    generated file
      * @param curNode current YANG node
      * @param imports imports for file
-     * @return generated file
+     * @return register RPC file
      * @throws IOException when fails to generate class file
      */
     public static File generateRegisterRpc(File file, YangNode curNode,
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
index 4e78c71..3d88b35 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGenerator.java
@@ -143,6 +143,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.HASH;
 import static org.onosproject.yang.compiler.utils.UtilConstants.HASH_CODE_STRING;
 import static org.onosproject.yang.compiler.utils.UtilConstants.IF;
+import static org.onosproject.yang.compiler.utils.UtilConstants.IMPLEMENTS;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INSTANCE_OF;
 import static org.onosproject.yang.compiler.utils.UtilConstants.INT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.IS_EMPTY;
@@ -156,6 +157,7 @@
 import static org.onosproject.yang.compiler.utils.UtilConstants.MAP;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MAX_RANGE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MIN_RANGE;
+import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_LEAF_IDENTIFIER;
 import static org.onosproject.yang.compiler.utils.UtilConstants.MODEL_OBJECT;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEG_ONE;
 import static org.onosproject.yang.compiler.utils.UtilConstants.NEW;
@@ -441,12 +443,10 @@
      * Returns the setter method strings for class file.
      *
      * @param attr               attribute info
-     * @param className          name of the class
      * @param generatedJavaFiles generated java files
      * @return setter method for class
      */
     public static String getSetterForClass(JavaAttributeInfo attr,
-                                           String className,
                                            int generatedJavaFiles) {
         String attrQualifiedType = getReturnType(attr);
         String attributeName = attr.getAttributeName();
@@ -455,28 +455,26 @@
             isTypeNull = true;
         }
         if (!attr.isListAttr()) {
-            return getSetter(className, attributeName, attrQualifiedType,
-                             generatedJavaFiles, isTypeNull, false);
+            return getSetter(attributeName, attrQualifiedType,
+                             generatedJavaFiles, isTypeNull);
         }
         String attrParam = getListAttribute(attrQualifiedType,
                                             attr.getCompilerAnnotation());
-        return getSetter(className, attributeName, attrParam,
-                         generatedJavaFiles, isTypeNull, true);
+        return getSetter(attributeName, attrParam,
+                         generatedJavaFiles, isTypeNull);
     }
 
     /**
      * Returns setter for attribute.
      *
-     * @param className  class name
      * @param name       attribute name
      * @param type       return type
      * @param isTypeNull if attribute type is null
-     * @param isList     true if leaf-list
      * @return setter for attribute
      */
-    private static String getSetter(String className, String name, String type,
+    private static String getSetter(String name, String type,
                                     int genType,
-                                    boolean isTypeNull, boolean isList) {
+                                    boolean isTypeNull) {
         StringBuilder builder = new StringBuilder();
         if (genType == GENERATE_SERVICE_AND_MANAGER) {
             //Append method signature.
@@ -506,7 +504,7 @@
         builder.append(methodSignature(name, EMPTY_STRING, PUBLIC, name,
                                        VOID, type, CLASS_TYPE));
 
-        if (!isTypeNull && !isList &&
+        if (!isTypeNull &&
                 genType != GENERATE_TYPEDEF_CLASS && genType != GENERATE_UNION_CLASS) {
             builder.append(getLeafFlagSetString(name, VALUE_LEAF, EIGHT_SPACE_INDENTATION,
                                                 SET_METHOD_PREFIX)).append(signatureClose());
@@ -1542,6 +1540,7 @@
                 .append(signatureClose())
                 .append(methodClose(FOUR_SPACE));
         return builder.toString();
+
     }
 
     // Returns if condition for add to list method.
@@ -1610,7 +1609,8 @@
                 "     * Identify the leaf of " + name + PERIOD + NEW_LINE +
                 "     */\n";
         return start + FOUR_SPACE_INDENTATION + PUBLIC + SPACE + ENUM + SPACE +
-                LEAF_IDENTIFIER + SPACE + OPEN_CURLY_BRACKET + NEW_LINE;
+                LEAF_IDENTIFIER + SPACE + IMPLEMENTS + SPACE +
+                MODEL_LEAF_IDENTIFIER + OPEN_CURLY_BRACKET + NEW_LINE;
     }
 
     /**
@@ -1936,8 +1936,8 @@
      *
      * @param name         class name
      * @param modifierType modifier type
-     * @param params       parameters for constructor
-     * @param space        space
+     * @param params       parameters for constrcutor
+     * @param space        indentation for constructor
      * @return parameterisied constructor method string
      */
     public static String getParaMeterisiedConstructor(String name,
diff --git a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
index afe663e..39226e3 100644
--- a/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
+++ b/compiler/base/translator/src/main/java/org/onosproject/yang/compiler/translator/tojava/utils/StringGenerator.java
@@ -1025,6 +1025,40 @@
     }
 
     /**
+     * Returns class definition for implements.
+     *
+     * @param classType     class type
+     * @param name          name of class
+     * @param modifier      modifier
+     * @param implClassList list of class which should be implemented
+     * @return class definition
+     */
+    static String getDefinitionWithMultipleImplements(String classType,
+                                                      String name,
+                                                      String modifier,
+                                                      List<String>
+                                                              implClassList) {
+        String mod = EMPTY_STRING;
+        if (modifier != null) {
+            mod = modifier + SPACE;
+        }
+        String classDef = mod + classType + SPACE + name + SPACE
+                + IMPLEMENTS + SPACE;
+        if (implClassList != null && !implClassList.isEmpty()) {
+            Iterator<String> implIterator = implClassList.iterator();
+            while (implIterator.hasNext()) {
+                String implClass = implIterator.next();
+                classDef = classDef + implClass;
+                if (implIterator.hasNext()) {
+                    classDef = classDef + COMMA + SPACE;
+                }
+            }
+
+        }
+        return classDef + defCloseString();
+    }
+
+    /**
      * Returns string for service class.
      *
      * @param name1 name of even listener class
diff --git a/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGeneratorTest.java b/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGeneratorTest.java
index 3ac56d5..2a6b396 100644
--- a/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGeneratorTest.java
+++ b/compiler/base/translator/src/test/java/org/onosproject/yang/compiler/translator/tojava/utils/MethodsGeneratorTest.java
@@ -32,7 +32,10 @@
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertThat;
 import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.STRING;
-import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.*;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getGetterForClass;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getGetterForInterface;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterForClass;
+import static org.onosproject.yang.compiler.translator.tojava.utils.MethodsGenerator.getSetterForInterface;
 
 /**
  * Unit tests for generated methods from the file type.
@@ -179,7 +182,8 @@
     @Test
     public void getSetterForClassTest() {
         JavaAttributeInfo testAttr = getTestAttribute();
-        String method = getSetterForClass(testAttr, CLASS_NAME, GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER);
+        String method = getSetterForClass(
+                testAttr, GeneratedJavaFileType.GENERATE_SERVICE_AND_MANAGER);
         assertThat(true, is(
                 method.contains(UtilConstants.PUBLIC + UtilConstants.SPACE + UtilConstants.VOID +
                                         UtilConstants.SPACE + UtilConstants.SET_METHOD_PREFIX +
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
index 5fd7a4d..dc36d1c 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/UtilConstants.java
@@ -905,6 +905,9 @@
      * Static attribute for is LeafIdentifier enum prefix.
      */
     public static final String LEAF_IDENTIFIER = "LeafIdentifier";
+
+    public static final String MODEL_LEAF_IDENTIFIER = "org.onosproject.yang.model.LeafIdentifier";
+
     /**
      * Static attribute for is leaf.
      */
@@ -1063,16 +1066,6 @@
     public static final String BIT_SET = "BitSet";
 
     /**
-     * Flag for subtree filtering in augment.
-     */
-    public static final String SUBTREE_FILTERED = "isSubTreeFiltered";
-
-    /**
-     * Augment map type.
-     */
-    public static final String AUGMENT_MAP_TYPE = "Map<Class<?>, Object>";
-
-    /**
      * Byte java built in type.
      */
     public static final String BYTE = "byte";
@@ -1971,6 +1964,10 @@
 
     public static final String CREATE_DATA_NODE = "createDataNode";
 
+    public static final String MULTI_INSTANCE_OBJECT = "MultiInstanceObject";
+
+    public static final String KEY_INFO = "KeyInfo";
+
     // No instantiation.
     private UtilConstants() {
     }
diff --git a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
index 2c6824b..2b2c0ec 100644
--- a/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
+++ b/compiler/base/utils/src/main/java/org/onosproject/yang/compiler/utils/io/impl/JavaDocGen.java
@@ -726,7 +726,7 @@
     /**
      * Returns javadoc for RPC command constructor.
      *
-     * @param rpcName rpc name
+     * @param rpcName name of RPC
      * @return javadoc for RPC command constructor
      */
     public static String getJavaDocForRpcCommandConstructor(String rpcName) {
diff --git a/model/src/main/java/org/onosproject/yang/model/AtomicPath.java b/model/src/main/java/org/onosproject/yang/model/AtomicPath.java
index 39a4122..fe53e22 100644
--- a/model/src/main/java/org/onosproject/yang/model/AtomicPath.java
+++ b/model/src/main/java/org/onosproject/yang/model/AtomicPath.java
@@ -1,9 +1,17 @@
 /*
- * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
- * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
- * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
- * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
- * Vestibulum commodo. Ut rhoncus gravida arcu.
+ * 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.model;
diff --git a/model/src/main/java/org/onosproject/yang/model/KeyInfo.java b/model/src/main/java/org/onosproject/yang/model/KeyInfo.java
index 2c35d45..86a0485 100644
--- a/model/src/main/java/org/onosproject/yang/model/KeyInfo.java
+++ b/model/src/main/java/org/onosproject/yang/model/KeyInfo.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
diff --git a/model/src/main/java/org/onosproject/yang/model/LeafIdentifier.java b/model/src/main/java/org/onosproject/yang/model/LeafIdentifier.java
index a1a6f11..8eca49f 100644
--- a/model/src/main/java/org/onosproject/yang/model/LeafIdentifier.java
+++ b/model/src/main/java/org/onosproject/yang/model/LeafIdentifier.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
diff --git a/model/src/main/java/org/onosproject/yang/model/MultiInstanceNode.java b/model/src/main/java/org/onosproject/yang/model/MultiInstanceNode.java
index 0042c8e..72182e5 100644
--- a/model/src/main/java/org/onosproject/yang/model/MultiInstanceNode.java
+++ b/model/src/main/java/org/onosproject/yang/model/MultiInstanceNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
diff --git a/model/src/main/java/org/onosproject/yang/model/MultiInstanceObject.java b/model/src/main/java/org/onosproject/yang/model/MultiInstanceObject.java
index f32ea40..33f6435 100644
--- a/model/src/main/java/org/onosproject/yang/model/MultiInstanceObject.java
+++ b/model/src/main/java/org/onosproject/yang/model/MultiInstanceObject.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
diff --git a/model/src/main/java/org/onosproject/yang/model/SingleInstanceLeaf.java b/model/src/main/java/org/onosproject/yang/model/SingleInstanceLeaf.java
index 34889c5..f5462b3 100644
--- a/model/src/main/java/org/onosproject/yang/model/SingleInstanceLeaf.java
+++ b/model/src/main/java/org/onosproject/yang/model/SingleInstanceLeaf.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
diff --git a/model/src/main/java/org/onosproject/yang/model/SingleInstanceNode.java b/model/src/main/java/org/onosproject/yang/model/SingleInstanceNode.java
index 80fe27a..40c5076 100644
--- a/model/src/main/java/org/onosproject/yang/model/SingleInstanceNode.java
+++ b/model/src/main/java/org/onosproject/yang/model/SingleInstanceNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016-present Open Networking Laboratory
+ * 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.
diff --git a/runtime/src/main/test/java/org/onosproject/yang/runtime/impl/ModelObjectIdTest.java b/runtime/src/main/test/java/org/onosproject/yang/runtime/impl/ModelObjectIdTest.java
new file mode 100644
index 0000000..ccadffe
--- /dev/null
+++ b/runtime/src/main/test/java/org/onosproject/yang/runtime/impl/ModelObjectIdTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.app;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.Cont53;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.DefaultCont50;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.DefaultCont53;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.DefaultList52;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.DefaultList56;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.List52Keys;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.List56;
+import org.onosproject.yang.gen.v1.modelobjecttest.check.List56Keys;
+import org.onosproject.yang.model.ModelObjectId;
+
+import java.io.IOException;
+
+/**
+ * Unit test for model object id.
+ */
+public class ModelObjectIdTest {
+
+    /**
+     * Unit test case for creating model object id for container.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testCreateContainerModelObjectId()
+            throws IOException {
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultCont50.class).build();
+    }
+
+    /**
+     * Unit test case for creating model object id for list.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testCreateListModelObjectId()
+            throws IOException {
+        List52Keys key = new List52Keys();
+        key.leaf52(52);
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultList52.class, key).build();
+    }
+
+    /**
+     * Unit test case for creating model object id for leaf.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testCreateleafModelObjectId()
+            throws IOException {
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultCont53.class)
+                .addChild(Cont53.LeafIdentifier.LEAF55).build();
+    }
+
+    /**
+     * Unit test case for creating model object id for leaf-list.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testCreateleaflistModelObjectId()
+            throws IOException {
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultCont53.class)
+                .addChild(Cont53.LeafIdentifier.LEAF54, "hello").build();
+    }
+
+    /**
+     * Unit test case for creating model object id for leaf-list.
+     *
+     * @throws IOException when fails to do IO operation
+     */
+    @Test
+    public void testCreatelistWithoutKeyModelObjectId()
+            throws IOException {
+        List56Keys key = new List56Keys();
+        ModelObjectId id = new ModelObjectId.Builder()
+                .addChild(DefaultList56.class, key)
+                .addChild(List56.LeafIdentifier.LEAF57, "hello").build();
+    }
+}
diff --git a/runtime/src/main/test/resources/modelObjectId/modelObjectIdTest.yang b/runtime/src/main/test/resources/modelObjectId/modelObjectIdTest.yang
new file mode 100644
index 0000000..24ec4eb
--- /dev/null
+++ b/runtime/src/main/test/resources/modelObjectId/modelObjectIdTest.yang
@@ -0,0 +1,35 @@
+module check {
+   yang-version 1;
+   namespace "modelObjectTest";
+   prefix nd;
+   container cont50 {
+       leaf leaf51 {
+           type int32;
+       }
+   }
+   list list52 {
+       key leaf52;
+       leaf leaf52 {
+           type int32;
+       }
+   }
+
+   container cont53 {
+       leaf-list leaf54 {
+           type string;
+       }
+       leaf leaf55 {
+           type string;
+       }
+   }
+
+   list list56 {
+       config false;
+       leaf-list leaf57 {
+           type string;
+       }
+       leaf leaf58 {
+           type string;
+       }
+   }
+}
\ No newline at end of file
