diff --git a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index e2e6211..6ca6829 100644
--- a/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -19,6 +19,7 @@
 import org.onosproject.yangutils.translator.tojava.AttributeInfo;
 import org.onosproject.yangutils.utils.UtilConstants;
 import org.onosproject.yangutils.utils.io.impl.JavaDocGen;
+import org.onosproject.yangutils.utils.io.impl.YangIoUtils;
 
 /**
  * Generated methods for generated files based on the file type.
@@ -32,45 +33,6 @@
     }
 
     /**
-     * Returns the methods strings for builder class.
-     *
-     * @param attr attribute info
-     * @param className java class name
-     * @return method string for builder class
-     */
-    static String parseBuilderMethodString(AttributeInfo attr, String className) {
-        String attrQuaifiedType = "";
-        if (attr.getImportInfo().getPkgInfo() != null) {
-            attrQuaifiedType = attr.getImportInfo().getPkgInfo() + ".";
-        }
-        attrQuaifiedType = attrQuaifiedType + attr.getImportInfo().getClassInfo();
-
-        String overrideString = UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
-                + UtilConstants.OVERRIDE + UtilConstants.NEW_LINE;
-        String getterString = getGetterForClass(attr.getAttributeName(), attrQuaifiedType);
-        String setterString = getSetterForClass(attr.getAttributeName(), attrQuaifiedType, className);
-        return overrideString + getterString + UtilConstants.NEW_LINE + overrideString + setterString;
-    }
-
-    /**
-     * Returns the methods strings for builder class.
-     *
-     * @param attr attribute info
-     * @return method string for builder class
-     */
-    static String parseImplMethodString(AttributeInfo attr) {
-
-        String attrQuaifiedType = "";
-        if (attr.getImportInfo().getPkgInfo() != null) {
-            attrQuaifiedType = attr.getImportInfo().getPkgInfo() + ".";
-        }
-        attrQuaifiedType = attrQuaifiedType + attr.getImportInfo().getClassInfo();
-
-        return UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.OVERRIDE
-                + UtilConstants.NEW_LINE + getGetterForClass(attr.getAttributeName(), attrQuaifiedType);
-    }
-
-    /**
      * Returns the methods strings for builder interface.
      *
      * @param attr attribute info
@@ -90,7 +52,7 @@
      */
     public static String parseBuilderInterfaceBuildMethodString(String name) {
 
-        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.BUILD, name)
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.BUILD, name, false)
                 + getBuildForInterface(name);
     }
 
@@ -103,14 +65,17 @@
     public static String getGetterString(AttributeInfo attr) {
 
         String returnType = "";
-        if (attr.getImportInfo().getPkgInfo() != null) {
+        boolean isList = attr.isListAttr();
+        if (attr.isQualifiedName() && (attr.getImportInfo().getPkgInfo() != null)) {
             returnType = attr.getImportInfo().getPkgInfo() + ".";
         }
 
         returnType = returnType + attr.getImportInfo().getClassInfo();
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
 
-        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.GETTER, attr.getAttributeName())
-                + getGetterForInterface(attr.getAttributeName(), returnType)
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.GETTER, attributeName, isList) +
+
+                getGetterForInterface(attributeName, returnType, attr.isListAttr())
                 + UtilConstants.NEW_LINE;
     }
 
@@ -121,17 +86,20 @@
      * @param className java class name
      * @return setter string
      */
-    private static String getSetterString(AttributeInfo attr, String className) {
+    public static String getSetterString(AttributeInfo attr, String className) {
 
         String attrType = "";
-        if (attr.getImportInfo().getPkgInfo() != null) {
+        boolean isList = attr.isListAttr();
+        if (attr.isQualifiedName() && (attr.getImportInfo().getPkgInfo() != null)) {
             attrType = attr.getImportInfo().getPkgInfo() + ".";
         }
 
         attrType = attrType + attr.getImportInfo().getClassInfo();
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
 
-        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.SETTER, attr.getAttributeName())
-                + getSetterForInterface(attr.getAttributeName(), attrType, className);
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.SETTER, attributeName, isList)
+                + getSetterForInterface(attributeName, attrType, className, attr.isListAttr())
+                + UtilConstants.NEW_LINE;
     }
 
     /**
@@ -142,21 +110,75 @@
      */
     public static String getConstructorString(String name) {
 
-        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.CONSTRUCTOR, name)
-                + getConstructor(name);
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.CONSTRUCTOR, name, false);
     }
 
     /**
      * Returns default constructor method string.
      *
-     * @param type generated file type
      * @param name class name
+     * @param modifierType modifier type
      * @return default constructor string
      */
-    public static String getDefaultConstructorString(int type, String name) {
+    public static String getDefaultConstructorString(String name, String modifierType) {
 
-        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR, name)
-                + getDefaultConstructor(name + UtilConstants.BUILDER);
+        return JavaDocGen.getJavaDoc(JavaDocGen.JavaDocType.DEFAULT_CONSTRUCTOR, name, false)
+                + getDefaultConstructor(name, modifierType);
+    }
+
+    /**
+     * Returns default constructor method string.
+     *
+     * @param attr attribute info
+     * @param className class name
+     * @return default constructor string
+     */
+    public static String getTypeDefConstructor(AttributeInfo attr, String className) {
+
+        String attrQuaifiedType = "";
+        if (attr.isQualifiedName() && (attr.getImportInfo().getPkgInfo() != null)) {
+            attrQuaifiedType = attr.getImportInfo().getPkgInfo() + ".";
+        }
+        attrQuaifiedType = attrQuaifiedType + attr.getImportInfo().getClassInfo();
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+
+        if (!attr.isListAttr()) {
+            return getTypeDefConstructorString(attrQuaifiedType, attributeName, className);
+        }
+        String listAttr = getListString() + attrQuaifiedType + UtilConstants.DIAMOND_CLOSE_BRACKET;
+        return getTypeDefConstructorString(listAttr, attributeName, className);
+    }
+
+    /**
+     * Returns type def's constructor for attribute.
+     *
+     * @param type data type
+     * @param name attribute name
+     * @param className class name
+     * @return setter for type def's attribute
+     */
+    private static String getTypeDefConstructorString(String type, String name, String className) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + className + UtilConstants.OPEN_PARENTHESIS
+                + type + UtilConstants.SPACE + "value" + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE
+                + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.THIS
+                + UtilConstants.PERIOD + name + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE
+                + "value" + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns check not null string.
+     *
+     * @param name attribute name
+     * @return check not null string
+     */
+    public static String getCheckNotNull(String name) {
+        return UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.CHECK_NOT_NULL_STRING
+                + UtilConstants.OPEN_PARENTHESIS + name + UtilConstants.COMMA + UtilConstants.SPACE + name
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE;
     }
 
     /**
@@ -174,56 +196,171 @@
     /**
      * Returns the getter method strings for class file.
      *
-     * @param attrName name of the attribute
-     * @param attrType return type of attribute
+     * @param attr attribute info
      * @return getter method for class
      */
-    private static String getGetterForClass(String attrName, String attrType) {
+    public static String getGetterForClass(AttributeInfo attr) {
+
+        String attrQuaifiedType = "";
+        if (attr.isQualifiedName() && (attr.getImportInfo().getPkgInfo() != null)) {
+            attrQuaifiedType = attr.getImportInfo().getPkgInfo() + ".";
+        }
+        attrQuaifiedType = attrQuaifiedType + attr.getImportInfo().getClassInfo();
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+
+        if (!attr.isListAttr()) {
+            return getGetter(attrQuaifiedType, attributeName);
+        }
+        String listAttr = getListString() + attrQuaifiedType + UtilConstants.DIAMOND_CLOSE_BRACKET;
+        return getGetter(listAttr, attributeName);
+    }
+
+    /**
+     * Returns getter for attribute.
+     *
+     * @param type return type
+     * @param name attribute name
+     * @return getter for attribute
+     */
+    private static String getGetter(String type, String name) {
 
         return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
-                + attrType + UtilConstants.SPACE + UtilConstants.GET_METHOD_PREFIX
-                + JavaIdentifierSyntax.getCaptialCase(attrName) + UtilConstants.OPEN_PARENTHESIS
+                + type + UtilConstants.SPACE + UtilConstants.GET_METHOD_PREFIX
+                + JavaIdentifierSyntax.getCaptialCase(name) + UtilConstants.OPEN_PARENTHESIS
                 + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
                 + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN
-                + UtilConstants.SPACE + attrName + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
+                + UtilConstants.SPACE + name + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
                 + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
     }
 
     /**
      * Returns the setter method strings for class file.
      *
-     * @param attrName name of the attribute
-     * @param attrType return type of attribute
+     * @param attr attribute info
      * @param className name of the class
      * @return setter method for class
      */
-    private static String getSetterForClass(String attrName, String attrType, String className) {
+    public static String getSetterForClass(AttributeInfo attr, String className) {
+
+        String attrQuaifiedType = "";
+        if (attr.isQualifiedName() && (attr.getImportInfo().getPkgInfo() != null)) {
+            attrQuaifiedType = attr.getImportInfo().getPkgInfo() + ".";
+        }
+        attrQuaifiedType = attrQuaifiedType + attr.getImportInfo().getClassInfo();
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+        if (!attr.isListAttr()) {
+            return getSetter(className, attributeName, attrQuaifiedType);
+        }
+        String listAttr = getListString() + attrQuaifiedType + UtilConstants.DIAMOND_CLOSE_BRACKET;
+        return getSetter(className, attributeName, listAttr);
+    }
+
+    /**
+     * Returns setter for attribute.
+     *
+     * @param className class name
+     * @param name attribute name
+     * @param type return type
+     * @return setter for attribute
+     */
+    private static String getSetter(String className, String name, String type) {
 
         return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
                 + className + UtilConstants.BUILDER + UtilConstants.SPACE + UtilConstants.SET_METHOD_PREFIX
-                + JavaIdentifierSyntax.getCaptialCase(attrName) + UtilConstants.OPEN_PARENTHESIS
-                + attrType + UtilConstants.SPACE + attrName + UtilConstants.CLOSE_PARENTHESIS
+                + JavaIdentifierSyntax.getCaptialCase(name) + UtilConstants.OPEN_PARENTHESIS
+                + type + UtilConstants.SPACE + name + UtilConstants.CLOSE_PARENTHESIS
                 + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE
                 + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.THIS + UtilConstants.PERIOD
-                + attrName + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE + attrName
-                + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION
+                + name + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE
+                + name + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION
                 + UtilConstants.RETURN + UtilConstants.SPACE + UtilConstants.THIS + UtilConstants.SEMI_COLAN
                 + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
     }
 
     /**
+     * Returns the setter method strings for class file.
+     *
+     * @param attr attribute info
+     * @return setter method for class
+     */
+    public static String getSetterForTypeDefClass(AttributeInfo attr) {
+
+        String attrQuaifiedType = "";
+        if (attr.isQualifiedName() && (attr.getImportInfo().getPkgInfo() != null)) {
+            attrQuaifiedType = attr.getImportInfo().getPkgInfo() + ".";
+        }
+        attrQuaifiedType = attrQuaifiedType + attr.getImportInfo().getClassInfo();
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+
+        if (!attr.isListAttr()) {
+            return getTypeDefSetter(attrQuaifiedType, attributeName);
+        }
+        String listAttr = getListString() + attrQuaifiedType + UtilConstants.DIAMOND_CLOSE_BRACKET;
+        return getTypeDefSetter(listAttr, attributeName);
+    }
+
+    /**
+     * Returns type def's setter for attribute.
+     *
+     * @param type data type
+     * @param name attribute name
+     * @return setter for type def's attribute
+     */
+    private static String getTypeDefSetter(String type, String name) {
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + UtilConstants.VOID + UtilConstants.SPACE + UtilConstants.SET_METHOD_PREFIX
+                + JavaIdentifierSyntax.getCaptialCase(name) + UtilConstants.OPEN_PARENTHESIS
+                + type + UtilConstants.SPACE + "value" + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE
+                + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.THIS + UtilConstants.PERIOD
+                + name + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE
+                + "value" + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Returns override string.
+     *
+     * @return override string
+     */
+    public static String getOverRideString() {
+        return UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.OVERRIDE + UtilConstants.NEW_LINE;
+    }
+
+    /**
      * Returns the getter method strings for interface file.
      *
      * @param yangName name of the attribute
      * @param returnType return type of attribute
+     * @param isList is list attribute
      * @return getter method for interface
      */
-    private static String getGetterForInterface(String yangName, String returnType) {
+    public static String getGetterForInterface(String yangName, String returnType, boolean isList) {
+
+        if (!isList) {
+            return getGetterInterfaceString(returnType, yangName);
+        }
+        String listAttr = getListString() + returnType + UtilConstants.DIAMOND_CLOSE_BRACKET;
+        return getGetterInterfaceString(listAttr, yangName);
+    }
+
+    /**
+     * Returns getter for attribute in interface.
+     *
+     * @param returnType return type
+     * @param yangName attribute name
+     * @return getter for interface
+     */
+    private static String getGetterInterfaceString(String returnType, String yangName) {
+
         return UtilConstants.FOUR_SPACE_INDENTATION + returnType
                 + UtilConstants.SPACE + UtilConstants.GET_METHOD_PREFIX
                 + JavaIdentifierSyntax.getCaptialCase(yangName)
                 + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS
                 + UtilConstants.SEMI_COLAN;
+
     }
 
     /**
@@ -232,9 +369,28 @@
      * @param attrName name of the attribute
      * @param attrType return type of attribute
      * @param className name of the java class being generated
+     * @param isList is list attribute
      * @return setter method for interface
      */
-    private static String getSetterForInterface(String attrName, String attrType, String className) {
+    public static String getSetterForInterface(String attrName, String attrType, String className, boolean isList) {
+
+        if (!isList) {
+            return getSetterInterfaceString(className, attrName, attrType);
+        }
+        String listAttr = getListString() + attrType + UtilConstants.DIAMOND_CLOSE_BRACKET;
+        return getSetterInterfaceString(className, attrName, listAttr);
+    }
+
+    /**
+     * Returns setter string for interface.
+     *
+     * @param className class name
+     * @param attrName attribute name
+     * @param attrType attribute type
+     * @return setter string
+     */
+    private static String getSetterInterfaceString(String className, String attrName, String attrType) {
+
         return UtilConstants.FOUR_SPACE_INDENTATION + className + UtilConstants.BUILDER
                 + UtilConstants.SPACE + UtilConstants.SET_METHOD_PREFIX
                 + JavaIdentifierSyntax.getCaptialCase(attrName) + UtilConstants.OPEN_PARENTHESIS
@@ -243,48 +399,47 @@
     }
 
     /**
+     * Returns list string.
+     *
+     * @return list string
+     */
+    private static String getListString() {
+        return UtilConstants.LIST + UtilConstants.DIAMOND_OPEN_BRACKET;
+    }
+
+    /**
      * Returns the build method strings for interface file.
      *
      * @param yangName name of the interface
      * @return build method for interface
      */
-    private static String getBuildForInterface(String yangName) {
+    public static String getBuildForInterface(String yangName) {
 
         return UtilConstants.FOUR_SPACE_INDENTATION + yangName + UtilConstants.SPACE + UtilConstants.BUILD
-                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN;
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE;
     }
 
     /**
      * Returns the constructor strings for class file.
      *
      * @param yangName name of the class
+     * @param attr attribute info
      * @return constructor for class
      */
-    private static String getConstructor(String yangName) {
+    public static String getConstructor(String yangName, AttributeInfo attr) {
 
-        String builderAttribute = yangName.substring(0, 1).toLowerCase() + yangName.substring(1);
-        String constructor = UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
-                + yangName + UtilConstants.IMPL + UtilConstants.OPEN_PARENTHESIS + yangName + UtilConstants.BUILDER
-                + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT + UtilConstants.CLOSE_PARENTHESIS
-                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE;
+        String builderAttribute = JavaIdentifierSyntax.getLowerCase(yangName);
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+        String constructor = UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.THIS
+                + UtilConstants.PERIOD + JavaIdentifierSyntax.getCamelCase(attributeName)
+                + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.SPACE + builderAttribute
+                + UtilConstants.OBJECT + UtilConstants.PERIOD + UtilConstants.GET_METHOD_PREFIX
+                + JavaIdentifierSyntax.getCaptialCase(JavaIdentifierSyntax.getCamelCase(attributeName))
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE;
 
-        //        TODO: need to get the partial constructor from constructor temp file.
-        //        if (getAttrInfo() != null) {
-        //            for (AttributeInfo attribute : getAttrInfo()) {
-        //                attribute.setAttributeName(JavaIdentifierSyntax.getCamelCase(attribute.getAttributeName()));
-        //                constructor = constructor + UtilConstants.TWELVE_SPACE_INDENTATION + UtilConstants.THIS
-        //                        + UtilConstants.PERIOD + attribute.getAttributeName() + UtilConstants.SPACE
-        //                        + UtilConstants.EQUAL + UtilConstants.SPACE + builderAttribute + UtilConstants.OBJECT
-        //                        + UtilConstants.PERIOD + UtilConstants.GET_METHOD_PREFIX
-        //                        + JavaIdentifierSyntax.getCaptialCase(attribute.getAttributeName())
-        //                        + UtilConstants.OPEN_PARENTHESIS
-        //        + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN
-        //                        + UtilConstants.NEW_LINE;
-        //            }
-        //            getAttrInfo().clear();
-        //        }
-
-        return constructor + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
+        return constructor;
     }
 
     /**
@@ -293,10 +448,10 @@
      * @param yangName class name
      * @return build method string for class
      */
-    private static String getBuild(String yangName) {
+    public static String getBuild(String yangName) {
 
-        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + yangName
-                + UtilConstants.SPACE + UtilConstants.BUILD + UtilConstants.OPEN_PARENTHESIS
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + yangName + UtilConstants.SPACE + UtilConstants.BUILD + UtilConstants.OPEN_PARENTHESIS
                 + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
                 + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN
                 + UtilConstants.SPACE + UtilConstants.NEW + UtilConstants.SPACE + yangName + UtilConstants.IMPL
@@ -309,14 +464,205 @@
      * Returns the Default constructor strings for class file.
      *
      * @param name name of the class
+     * @param modifierType modifier type for default constructor
      * @return Default constructor for class
      */
-    private static String getDefaultConstructor(String name) {
+    private static String getDefaultConstructor(String name, String modifierType) {
 
-        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + name
+        return UtilConstants.FOUR_SPACE_INDENTATION + modifierType + UtilConstants.SPACE + name
                 + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE
                 + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
                 + UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE;
     }
 
+    /**
+     * Returns to string method open strings.
+     *
+     * @return to string method open string
+     */
+    public static String getToStringMethodOpen() {
+
+        return getOverRideString() + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + UtilConstants.STRING + UtilConstants.SPACE + "to" + UtilConstants.STRING
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION
+                + UtilConstants.RETURN + " MoreObjects.toStringHelper(getClass())" + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns to string methods close string.
+     *
+     * @return to string method close string
+     */
+    public static String getToStringMethodClose() {
+        return UtilConstants.TWELVE_SPACE_INDENTATION + ".to" + UtilConstants.STRING
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * To string method for class.
+     *
+     * @param attr attribute info
+     * @return to string method
+     */
+    public static String getToStringMethod(AttributeInfo attr) {
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+        return UtilConstants.TWELVE_SPACE_INDENTATION + UtilConstants.PERIOD + UtilConstants.ADD_STRING
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.QUOTES
+                + attributeName + UtilConstants.QUOTES + UtilConstants.COMMA + UtilConstants.SPACE + attributeName
+                + UtilConstants.CLOSE_PARENTHESIS;
+
+    }
+
+    /**
+     * Returns to hash code method open strings.
+     *
+     * @return to hash code method open string
+     */
+    public static String getHashCodeMethodOpen() {
+
+        return getOverRideString() + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + UtilConstants.INT + UtilConstants.SPACE + UtilConstants.HASH_CODE_STRING
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE
+                + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE + UtilConstants.EIGHT_SPACE_INDENTATION
+                + UtilConstants.RETURN + " Objects.hash" + UtilConstants.OPEN_PARENTHESIS;
+    }
+
+    /**
+     * Returns to hash code methods close string.
+     *
+     * @param hashcodeString hash code string
+     * @return to hash code method close string
+     */
+    public static String getHashCodeMethodClose(String hashcodeString) {
+        hashcodeString = YangIoUtils.trimAtLast(hashcodeString, UtilConstants.COMMA);
+        hashcodeString = YangIoUtils.trimAtLast(hashcodeString, UtilConstants.SPACE);
+        hashcodeString = YangIoUtils.partString(hashcodeString);
+        return hashcodeString + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Hash code method for class.
+     *
+     * @param attr attribute info
+     * @return hash code method
+     */
+    public static String getHashCodeMethod(AttributeInfo attr) {
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+        return attributeName
+                + UtilConstants.COMMA + UtilConstants.SPACE;
+
+    }
+
+    /**
+     * Returns to equals method open strings.
+     *
+     * @param className class name
+     * @return to equals method open string
+     */
+    public static String getEqualsMethodOpen(String className) {
+
+        return getOverRideString() + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE
+                + UtilConstants.BOOLEAN + UtilConstants.SPACE + UtilConstants.EQUALS_STRING
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.OBJECT_STRING + UtilConstants.SPACE + "obj"
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
+                + UtilConstants.NEW_LINE + getEqualsMethodsCommonIfCondition()
+                + getEqualsMethodsSpecificIfCondition(className);
+    }
+
+    /**
+     * Returns equal methods if condition string.
+     *
+     * @return if condition string
+     */
+    private static String getEqualsMethodsCommonIfCondition() {
+        return UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.IF + UtilConstants.SPACE
+                + UtilConstants.OPEN_PARENTHESIS + UtilConstants.THIS
+                + UtilConstants.SPACE + UtilConstants.EQUAL + UtilConstants.EQUAL + UtilConstants.SPACE + "obj"
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
+                + UtilConstants.NEW_LINE + UtilConstants.TWELVE_SPACE_INDENTATION + UtilConstants.RETURN
+                + UtilConstants.SPACE + UtilConstants.TRUE + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
+                + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns if condition for specific class object in equals method.
+     *
+     * @param className class name
+     * @return if condition string
+     */
+    private static String getEqualsMethodsSpecificIfCondition(String className) {
+        return UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.IF + UtilConstants.SPACE
+                + UtilConstants.OPEN_PARENTHESIS + "obj" + UtilConstants.INSTANCE_OF + className
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET
+                + UtilConstants.NEW_LINE + UtilConstants.TWELVE_SPACE_INDENTATION + className + UtilConstants.SPACE
+                + "other " + UtilConstants.EQUAL + UtilConstants.SPACE + UtilConstants.OPEN_PARENTHESIS + className
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SPACE + "obj" + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE + UtilConstants.TWELVE_SPACE_INDENTATION + UtilConstants.RETURN
+                + UtilConstants.NEW_LINE;
+    }
+
+    /**
+     * Returns to equals methods close string.
+     *
+     * @param equalMethodString equal method string
+     * @return to equals method close string
+     */
+    public static String getEqualsMethodClose(String equalMethodString) {
+        equalMethodString = YangIoUtils.trimAtLast(equalMethodString, UtilConstants.AND);
+        equalMethodString = YangIoUtils.trimAtLast(equalMethodString, UtilConstants.AND);
+        equalMethodString = YangIoUtils.trimAtLast(equalMethodString, UtilConstants.SPACE);
+        equalMethodString = YangIoUtils.trimAtLast(equalMethodString, UtilConstants.NEW_LINE) + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE;
+        return equalMethodString + UtilConstants.EIGHT_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE
+                + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN + UtilConstants.SPACE
+                + UtilConstants.FALSE + UtilConstants.SEMI_COLAN
+                + UtilConstants.NEW_LINE + UtilConstants.FOUR_SPACE_INDENTATION
+                + UtilConstants.CLOSE_CURLY_BRACKET;
+    }
+
+    /**
+     * Equals method for class.
+     *
+     * @param attr attribute info
+     * @return equals method
+     */
+    public static String getEqualsMethod(AttributeInfo attr) {
+        String attributeName = JavaIdentifierSyntax.getLowerCase(attr.getAttributeName());
+        return UtilConstants.SIXTEEN_SPACE_INDENTATION + UtilConstants.SPACE + UtilConstants.OBJECT_STRING + "s"
+                + UtilConstants.PERIOD + UtilConstants.EQUALS_STRING + UtilConstants.OPEN_PARENTHESIS + attributeName
+                + UtilConstants.COMMA + UtilConstants.SPACE + "other." + attributeName + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SPACE + UtilConstants.AND + UtilConstants.AND;
+
+    }
+
+    /**
+     * Returns of method string for class.
+     *
+     * @param name class name
+     * @param attr attribute info
+     * @return of method string
+     */
+    public static String getOfMethod(String name, AttributeInfo attr) {
+
+        String attrQuaifiedType = "";
+        if (attr.isQualifiedName() && (attr.getImportInfo().getPkgInfo() != null)) {
+            attrQuaifiedType = attr.getImportInfo().getPkgInfo() + ".";
+        }
+        attrQuaifiedType = attrQuaifiedType + attr.getImportInfo().getClassInfo();
+
+        return UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.PUBLIC + UtilConstants.SPACE + UtilConstants.STATIC
+                + UtilConstants.SPACE + name + UtilConstants.SPACE + UtilConstants.OF + UtilConstants.OPEN_PARENTHESIS
+                + attrQuaifiedType + UtilConstants.SPACE + UtilConstants.VALUE + UtilConstants.CLOSE_PARENTHESIS
+                + UtilConstants.SPACE + UtilConstants.OPEN_CURLY_BRACKET + UtilConstants.NEW_LINE
+                + UtilConstants.EIGHT_SPACE_INDENTATION + UtilConstants.RETURN + UtilConstants.SPACE + UtilConstants.NEW
+                + UtilConstants.SPACE + name + UtilConstants.OPEN_PARENTHESIS + UtilConstants.VALUE
+                + UtilConstants.CLOSE_PARENTHESIS + UtilConstants.SEMI_COLAN + UtilConstants.NEW_LINE
+                + UtilConstants.FOUR_SPACE_INDENTATION + UtilConstants.CLOSE_CURLY_BRACKET + UtilConstants.NEW_LINE;
+    }
+
 }
