diff --git a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
index b652f48..b02b4e2 100644
--- a/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
+++ b/utils/yangutils/src/main/java/org/onosproject/yangutils/translator/tojava/JavaAttributeInfo.java
@@ -21,8 +21,9 @@
 import org.onosproject.yangutils.translator.exception.TranslatorException;
 
 import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getIsQualifiedAccessOrAddToImportList;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedInfoOfFromString;
+import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfAttribute;
 import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
-import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfLeafAttribute;
 import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCamelCase;
 
 /**
@@ -65,9 +66,9 @@
     /**
      * Creates object of java attribute info.
      *
-     * @param attrType YANG type
-     * @param name attribute name
-     * @param isListAttr is list attribute
+     * @param attrType        YANG type
+     * @param name            attribute name
+     * @param isListAttr      is list attribute
      * @param isQualifiedName is qualified name
      */
     public JavaAttributeInfo(YangType<?> attrType, String name, boolean isListAttr, boolean isQualifiedName) {
@@ -78,6 +79,51 @@
     }
 
     /**
+     * Creates an attribute info object corresponding to the passed type's attribute
+     * information and return it.
+     *
+     * @param curNode               current data model node for which the java file is being generated
+     * @param referredTypesAttrInfo attribute of referred type
+     * @return JavaAttributeInfo attribute details required to add in temporary files
+     */
+    public static JavaAttributeInfo getFromStringAttributeInfo(YangNode curNode,
+                                                               JavaAttributeInfo referredTypesAttrInfo) {
+
+        JavaQualifiedTypeInfo qualifiedInfoOfFromString = getQualifiedInfoOfFromString(referredTypesAttrInfo);
+        /*
+         * Create a new java attribute info with qualified information of
+         * wrapper classes.
+         */
+        return getAttributeInfoForTheData(qualifiedInfoOfFromString, referredTypesAttrInfo.getAttributeName(),
+                referredTypesAttrInfo.getAttributeType(), curNode, false);
+    }
+
+    /**
+     * Creates an attribute info object corresponding to the passed type attribute
+     * information and return it.
+     *
+     * @param curNode         current data model node for which the java file is being
+     *                        generated
+     * @param attributeType   leaf data type
+     * @param attributeName   leaf name
+     * @param isListAttribute is the current added attribute needs to be a list
+     * @return AttributeInfo attribute details required to add in temporary
+     * files
+     */
+    public static JavaAttributeInfo getAttributeInfoOfType(YangNode curNode,
+                                                           YangType<?> attributeType, String attributeName,
+                                                           boolean isListAttribute) {
+        /*
+         * Get the import info corresponding to the attribute for import in
+         * generated java files or qualified access
+         */
+        JavaQualifiedTypeInfo importInfo = getQualifiedTypeInfoOfAttribute(curNode,
+                attributeType, attributeName, isListAttribute);
+
+        return getAttributeInfoForTheData(importInfo, attributeName, attributeType, curNode, isListAttribute);
+    }
+
+    /**
      * Returns the data type info of attribute.
      *
      * @return the data type info of attribute
@@ -144,7 +190,7 @@
      * manner.
      *
      * @return the if the added attribute has to be accessed in a fully
-     *         qualified manner.
+     * qualified manner.
      */
     public boolean isQualifiedName() {
         return isQualifiedName;
@@ -155,7 +201,7 @@
      * manner.
      *
      * @param isQualified if the added attribute has to be accessed in a fully
-     *            qualified manner
+     *                    qualified manner
      */
     public void setIsQualifiedAccess(boolean isQualified) {
         isQualifiedName = isQualified;
@@ -184,23 +230,23 @@
      * Creates an attribute info object corresponding to the passed leaf
      * information and return it.
      *
-     * @param curNode current data model node for which the java file is being
-     *            generated
-     * @param attributeType leaf data type
-     * @param attributeName leaf name
+     * @param curNode         current data model node for which the java file is being
+     *                        generated
+     * @param attributeType   leaf data type
+     * @param attributeName   leaf name
      * @param isListAttribute is the current added attribute needs to be a list
      * @return AttributeInfo attribute details required to add in temporary
-     *         files
+     * files
      */
     public static JavaAttributeInfo getAttributeInfoOfLeaf(YangNode curNode,
-            YangType<?> attributeType, String attributeName,
-            boolean isListAttribute) {
+                                                           YangType<?> attributeType, String attributeName,
+                                                           boolean isListAttribute) {
 
         /*
          * Get the import info corresponding to the attribute for import in
          * generated java files or qualified access
          */
-        JavaQualifiedTypeInfo importInfo = getQualifiedTypeInfoOfLeafAttribute(curNode,
+        JavaQualifiedTypeInfo importInfo = getQualifiedTypeInfoOfAttribute(curNode,
                 attributeType, attributeName, isListAttribute);
 
         return getAttributeInfoForTheData(importInfo, attributeName, attributeType, curNode, isListAttribute);
@@ -210,12 +256,12 @@
      * Creates an attribute info object corresponding to a data model node and
      * return it.
      *
-     * @param curNode current data model node for which the java code generation
-     *            is being handled
+     * @param curNode    current data model node for which the java code generation
+     *                   is being handled
      * @param parentNode parent node in which the current node is an attribute
      * @param isListNode is the current added attribute needs to be a list
      * @return AttributeInfo attribute details required to add in temporary
-     *         files
+     * files
      */
     public static JavaAttributeInfo getCurNodeAsAttributeInParent(
             YangNode curNode, YangNode parentNode, boolean isListNode) {
@@ -233,43 +279,18 @@
     }
 
     /**
-     * Creates an attribute info object corresponding to the passed type def attribute
-     * information and return it.
-     *
-     * @param curNode current data model node for which the java file is being
-     *            generated
-     * @param attributeType leaf data type
-     * @param attributeName leaf name
-     * @param isListAttribute is the current added attribute needs to be a list
-     * @return AttributeInfo attribute details required to add in temporary
-     *         files
-     */
-    public static JavaAttributeInfo getAttributeInfoOfTypeDef(YangNode curNode,
-            YangType<?> attributeType, String attributeName,
-            boolean isListAttribute) {
-
-        /*
-         * Get the import info corresponding to the attribute for import in
-         * generated java files or qualified access
-         */
-        JavaQualifiedTypeInfo importInfo = getQualifiedTypeInfoOfLeafAttribute(curNode,
-                attributeType, attributeName, isListAttribute);
-
-        return getAttributeInfoForTheData(importInfo, attributeName, attributeType, curNode, isListAttribute);
-    }
-
-    /**
      * Returns java attribute info.
      *
-     * @param importInfo java qualified type info
-     * @param attributeName attribute name
-     * @param attributeType attribute type
-     * @param curNode current YANG node
+     * @param importInfo      java qualified type info
+     * @param attributeName   attribute name
+     * @param attributeType   attribute type
+     * @param curNode         current YANG node
      * @param isListAttribute is list attribute
      * @return java attribute info.
      */
     private static JavaAttributeInfo getAttributeInfoForTheData(JavaQualifiedTypeInfo importInfo, String attributeName,
-            YangType<?> attributeType, YangNode curNode, boolean isListAttribute) {
+                                                                YangType<?> attributeType, YangNode curNode,
+                                                                boolean isListAttribute) {
 
         JavaAttributeInfo newAttr = new JavaAttributeInfo();
         newAttr.setImportInfo(importInfo);
