Cleaning up
[iot2.git] / iotjava / iotpolicy / IoTCompiler.java
index 180de2e085ded2b0b1c057f47ccac092b19754f4..a5a6781293882ba2fdf854085b8f8b6b87abd466 100644 (file)
@@ -59,6 +59,7 @@ public class IoTCompiler {
        private String dir;
        private String subdir;
 
+
        /**
         * Class constants
         */
@@ -73,6 +74,7 @@ public class IoTCompiler {
                USERDEFINED             // Assumed as driver classes
        }
 
+
        /**
         * Class constructors
         */
@@ -104,7 +106,6 @@ public class IoTCompiler {
         * data structures.
         * Additionally, the data structure handles are
         * returned from tree-parsing for further process.
-        *
         */
        public void setDataStructures(String origInt, ParseNode pnPol, ParseNode pnReq) {
 
@@ -183,7 +184,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodJavaLocalInterface() writes the method of the interface
+        * HELPER: writeMethodJavaLocalInterface() writes the method of the local interface
         */
        private void writeMethodJavaLocalInterface(Collection<String> methods, InterfaceDecl intDecl) {
 
@@ -326,16 +327,12 @@ public class IoTCompiler {
                        InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
                        List<String> methods = intDecl.getMethods();
                        Set<String> importClasses = getImportClasses(methods, intDecl);
-                       printImportStatements(importClasses);
+                       List<String> stdImportClasses = getStandardJavaIntfaceImportClasses();
+                       List<String> allImportClasses = getAllLibClasses(stdImportClasses, importClasses);
+                       printImportStatements(allImportClasses);
                        // Write interface header
                        println("");
                        println("public interface " + intface + " {");
-                       // Write enum if any...
-                       //EnumDecl enumDecl = (EnumDecl) decHandler.getEnumDecl(intface);
-                       //writeEnumJava(enumDecl);
-                       // Write struct if any...
-                       //StructDecl structDecl = (StructDecl) decHandler.getStructDecl(intface);
-                       //writeStructJava(structDecl);
                        // Write methods
                        writeMethodJavaLocalInterface(methods, intDecl);
                        println("}");
@@ -364,13 +361,16 @@ public class IoTCompiler {
                                DeclarationHandler decHandler = mapIntDeclHand.get(intface);
                                InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
                                // Pass in set of methods and get import classes
-                               Set<String> importClasses = getImportClasses(intMeth.getValue(), intDecl);
-                               printImportStatements(importClasses);
+                               List<String> methods = intDecl.getMethods();
+                               Set<String> importClasses = getImportClasses(methods, intDecl);
+                               List<String> stdImportClasses = getStandardJavaIntfaceImportClasses();
+                               List<String> allImportClasses = getAllLibClasses(stdImportClasses, importClasses);
+                               printImportStatements(allImportClasses);
                                // Write interface header
                                println("");
                                println("public interface " + newIntface + " {\n");
                                // Write methods
-                               writeMethodJavaInterface(intMeth.getValue(), intDecl);
+                               writeMethodJavaInterface(methods, intDecl);
                                println("}");
                                pw.close();
                                System.out.println("IoTCompiler: Generated interface " + newIntface + ".java...");
@@ -387,7 +387,7 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
                        println("private final static int object" + newObjectId + "Id = " + 
                                newObjectId + ";\t//" + newIntface);
                        Set<String> methodIds = intMeth.getValue();
@@ -403,7 +403,7 @@ public class IoTCompiler {
                                i++;
                        }
                        println(" };");
-                       println("private List<Integer> set" + newObjectId + "Allowed;");
+                       println("private static List<Integer> set" + newObjectId + "Allowed;");
                }
        }
 
@@ -414,7 +414,7 @@ public class IoTCompiler {
        private void writePropertiesJavaStub(String intface, String newIntface, boolean callbackExist, Set<String> callbackClasses) {
 
                println("private IoTRMICall rmiCall;");
-               println("private String address;");
+               println("private String callbackAddress;");
                println("private int[] ports;\n");
                // Get the object Id
                Integer objId = mapIntfaceObjId.get(intface);
@@ -446,8 +446,8 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
-                       println("set" + newObjectId + "Allowed = Arrays.asList(object" + newObjectId +"Permission);");
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
+                       println("set" + newObjectId + "Allowed = new ArrayList<Integer>(Arrays.asList(object" + newObjectId +"Permission));");
                }
        }
 
@@ -457,10 +457,10 @@ public class IoTCompiler {
         */
        private void writeConstructorJavaStub(String intface, String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
 
-               println("public " + newStubClass + "(int _port, String _address, int _rev, int[] _ports) throws Exception {");
-               println("address = _address;");
+               println("public " + newStubClass + "(int _port, String _skeletonAddress, String _callbackAddress, int _rev, int[] _ports) throws Exception {");
+               println("callbackAddress = _callbackAddress;");
                println("ports = _ports;");
-               println("rmiCall = new IoTRMICall(_port, _address, _rev);");
+               println("rmiCall = new IoTRMICall(_port, _skeletonAddress, _rev);");
                if (callbackExist) {
                        Iterator it = callbackClasses.iterator();
                        String callbackType = (String) it.next();
@@ -482,7 +482,7 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
                        println("if (!set" + newObjectId + "Allowed.contains(methodId)) {");
                        println("throw new Error(\"Callback object for " + intface + " is not allowed to access method: \" + methodId);");
                        println("}");
@@ -491,7 +491,25 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeConstructorJavaStub() writes the constructor of the stub class
+        * HELPER: writeJavaInitCallbackPermission() writes the permission for callback
+        */
+       private void writeJavaInitCallbackPermission(String intface, InterfaceDecl intDecl, boolean callbackExist) {
+
+               if (callbackExist) {
+                       String method = "___initCallBack()";
+                       int methodNumId = intDecl.getHelperMethodNumId(method);
+                       Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
+                       for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
+                               String newIntface = intMeth.getKey();
+                               int newObjectId = getNewIntfaceObjectId(newIntface);
+                               println("set" + newObjectId + "Allowed.add(" + methodNumId + ");");
+                       }
+               }
+       }
+
+
+       /**
+        * HELPER: writeInitCallbackJavaStub() writes callback initialization in stub
         */
        private void writeInitCallbackJavaStub(String intface, InterfaceDecl intDecl) {
 
@@ -508,11 +526,13 @@ public class IoTCompiler {
                println(intface + "_CallbackSkeleton skel = (" + intface + "_CallbackSkeleton) listCallbackObj.get(objId);");
                println("if (skel != null) {");
                println("skel.invokeMethod(rmiObj);");
-               println("} else {");
+               print("}");
+               println(" else {");
                println("throw new Error(\"" + intface + ": Object with Id \" + objId + \" not found!\");");
                println("}");
                println("}");
-               println("} catch (Exception ex) {");
+               print("}");
+               println(" catch (Exception ex) {");
                println("ex.printStackTrace();");
                println("throw new Error(\"Error instantiating class " + intface + "_CallbackSkeleton!\");");
                println("}");
@@ -521,10 +541,11 @@ public class IoTCompiler {
                println("thread.start();\n");
                // Generate info sending part
                String method = "___initCallBack()";
-               println("int methodId = " + intDecl.getHelperMethodNumId(method) + ";");
+               int methodNumId = intDecl.getHelperMethodNumId(method);
+               println("int methodId = " + methodNumId + ";");
                println("Class<?> retType = void.class;");
                println("Class<?>[] paramCls = new Class<?>[] { int.class, String.class, int.class };");
-               println("Object[] paramObj = new Object[] { ports[0], address, 0 };");
+               println("Object[] paramObj = new Object[] { ports[0], callbackAddress, 0 };");
                println("rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
                println("}\n");
        }
@@ -539,20 +560,20 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
+                       String simpleType = getGenericType(paramType);
                        if (isEnumClass(simpleType)) {
                        // Check if this is enum type
                                if (isArray(param)) {   // An array
-                                       println("int len" + i + " = " + param + ".length;");
-                                       println("int paramEnum" + i + "[] = new int[len];");
+                                       println("int len" + i + " = " + getSimpleIdentifier(param) + ".length;");
+                                       println("int paramEnum" + i + "[] = new int[len" + i + "];");
                                        println("for (int i = 0; i < len" + i + "; i++) {");
-                                       println("paramEnum" + i + "[i] = " + param + "[i].ordinal();");
+                                       println("paramEnum" + i + "[i] = " + getSimpleIdentifier(param) + "[i].ordinal();");
                                        println("}");
                                } else if (isList(paramType)) { // A list
-                                       println("int len" + i + " = " + param + ".size();");
-                                       println("int paramEnum" + i + "[] = new int[len];");
+                                       println("int len" + i + " = " + getSimpleIdentifier(param) + ".size();");
+                                       println("int paramEnum" + i + "[] = new int[len" + i + "];");
                                        println("for (int i = 0; i < len" + i + "; i++) {");
-                                       println("paramEnum" + i + "[i] = " + param + ".get(i).ordinal();");
+                                       println("paramEnum" + i + "[i] = " + getSimpleIdentifier(param) + ".get(i).ordinal();");
                                        println("}");
                                } else {        // Just one element
                                        println("int paramEnum" + i + "[] = new int[1];");
@@ -569,10 +590,10 @@ public class IoTCompiler {
        private void checkAndWriteEnumRetTypeJavaStub(String retType) {
 
                // Strips off array "[]" for return type
-               String pureType = getSimpleArrayType(getSimpleType(retType));
+               String pureType = getSimpleArrayType(getGenericType(retType));
                // Take the inner type of generic
                if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
-                       pureType = getTypeOfGeneric(retType)[0];
+                       pureType = getGenericType(retType);
                if (isEnumClass(pureType)) {
                // Check if this is enum type
                        // Enum decoder
@@ -608,7 +629,7 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
+                       String simpleType = getGenericType(paramType);
                        if (isStructClass(simpleType)) {
                        // Check if this is enum type
                                int methodNumId = intDecl.getMethodNumId(method);
@@ -640,7 +661,7 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
+                       String simpleType = getGenericType(paramType);
                        if (isStructClass(simpleType))
                                return true;
                }
@@ -649,7 +670,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeLengthStructParamClassJavaStub() writes lengths of params
+        * HELPER: writeLengthStructParamClassJavaStub() writes lengths of parameters
         */
        private void writeLengthStructParamClassJavaStub(List<String> methParams, List<String> methPrmTypes) {
 
@@ -661,10 +682,10 @@ public class IoTCompiler {
                        if (isStructClass(simpleType)) {
                                int members = getNumOfMembers(simpleType);
                                if (isArray(param)) {                   // An array
-                                       String structLen = param + ".length";
+                                       String structLen = getSimpleArrayType(param) + ".length";
                                        print(members + "*" + structLen);
                                } else if (isList(paramType)) { // A list
-                                       String structLen = param + ".size()";
+                                       String structLen = getSimpleArrayType(param) + ".size()";
                                        print(members + "*" + structLen);
                                } else
                                        print(Integer.toString(members));
@@ -687,15 +708,21 @@ public class IoTCompiler {
                List<String> memTypes = structDecl.getMemberTypes(simpleType);
                List<String> members = structDecl.getMembers(simpleType);
                if (isArray(param)) {                   // An array
-                       println("for(int i = 0; i < " + param + ".length; i++) {");
+                       println("for(int i = 0; i < " + getSimpleIdentifier(param) + ".length; i++) {");
+                       for (int i = 0; i < members.size(); i++) {
+                               String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
+                               println("paramCls[pos] = " + getSimpleType(getEnumType(prmType)) + ".class;");
+                               print("paramObj[pos++] = " + getSimpleIdentifier(param) + "[i].");
+                               print(getSimpleIdentifier(members.get(i)));
+                               println(";");
+                       }
+                       println("}");
                } else if (isList(paramType)) { // A list
-                       println("for(int i = 0; i < " + param + ".size(); i++) {");
-               }
-               if (isArrayOrList(param, paramType)) {  // An array or list
+                       println("for(int i = 0; i < " + getSimpleIdentifier(param) + ".size(); i++) {");
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
                                println("paramCls[pos] = " + getSimpleType(getEnumType(prmType)) + ".class;");
-                               print("paramObj[pos++] = " + param + "[i].");
+                               print("paramObj[pos++] = " + getSimpleIdentifier(param) + ".get(i).");
                                print(getSimpleIdentifier(members.get(i)));
                                println(";");
                        }
@@ -704,7 +731,7 @@ public class IoTCompiler {
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
                                println("paramCls[pos] = " + getSimpleType(getEnumType(prmType)) + ".class;");
-                               print("paramObj[pos++] = " + param + ".");
+                               print("paramObj[pos++] = " + getSimpleIdentifier(param) + ".");
                                print(getSimpleIdentifier(members.get(i)));
                                println(";");
                        }
@@ -715,7 +742,7 @@ public class IoTCompiler {
        /**
         * HELPER: writeStructParamClassJavaStub() writes parameters if struct is present
         */
-       private void writeStructParamClassJavaStub(List<String> methParams, List<String> methPrmTypes) {
+       private void writeStructParamClassJavaStub(List<String> methParams, List<String> methPrmTypes, String callbackType) {
 
                print("int paramLen = ");
                writeLengthStructParamClassJavaStub(methParams, methPrmTypes);
@@ -730,6 +757,16 @@ public class IoTCompiler {
                        String simpleType = getGenericType(paramType);
                        if (isStructClass(simpleType)) {
                                writeStructMembersJavaStub(simpleType, paramType, param);
+                       } else if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
+                               println("paramCls[pos] = int.class;");
+                               print("paramObj[pos++] = ");
+                               if (isArray(methParams.get(i)))
+                                       print(getSimpleIdentifier(methParams.get(i)) + ".length");
+                               else if (isList(methPrmTypes.get(i)))
+                                       print(getSimpleIdentifier(methParams.get(i)) + ".size()");
+                               else
+                                       print("new Integer(1)");
+                               println(";");
                        } else {
                                String prmType = checkAndGetArray(methPrmTypes.get(i), methParams.get(i));
                                println("paramCls[pos] = " + getSimpleType(getEnumType(prmType)) + ".class;");
@@ -743,7 +780,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructRetMembersJavaStub() writes parameters of struct
+        * HELPER: writeStructRetMembersJavaStub() writes parameters of struct for return statement
         */
        private void writeStructRetMembersJavaStub(String simpleType, String retType) {
 
@@ -782,7 +819,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructReturnJavaStub() writes parameters if struct is present
+        * HELPER: writeStructReturnJavaStub() writes parameters if struct is present for return statement
         */
        private void writeStructReturnJavaStub(String simpleType, String retType) {
 
@@ -832,7 +869,7 @@ public class IoTCompiler {
         * HELPER: writeStdMethodBodyJavaStub() writes the standard method body in the stub class
         */
        private void writeStdMethodBodyJavaStub(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method) {
+                       List<String> methPrmTypes, String method, String callbackType) {
 
                checkAndWriteStructSetupJavaStub(methParams, methPrmTypes, intDecl, method);
                println("int methodId = " + intDecl.getMethodNumId(method) + ";");
@@ -841,12 +878,17 @@ public class IoTCompiler {
                checkAndWriteEnumTypeJavaStub(methParams, methPrmTypes);
                // Generate array of parameter types
                if (isStructPresent(methParams, methPrmTypes)) {
-                       writeStructParamClassJavaStub(methParams, methPrmTypes);
+                       writeStructParamClassJavaStub(methParams, methPrmTypes, callbackType);
                } else {
                        print("Class<?>[] paramCls = new Class<?>[] { ");
                        for (int i = 0; i < methParams.size(); i++) {
-                               String paramType = checkAndGetArray(methPrmTypes.get(i), methParams.get(i));
-                               print(getSimpleType(getEnumType(paramType)) + ".class");
+                               String prmType = methPrmTypes.get(i);
+                               if (checkCallbackType(prmType, callbackType)) { // Check if this has callback object
+                                       print("int.class");
+                               } else { // Generate normal classes if it's not a callback object
+                                       String paramType = checkAndGetArray(methPrmTypes.get(i), methParams.get(i));
+                                       print(getSimpleType(getEnumType(paramType)) + ".class");
+                               }
                                // Check if this is the last element (don't print a comma)
                                if (i != methParams.size() - 1) {
                                        print(", ");
@@ -856,7 +898,17 @@ public class IoTCompiler {
                        // Generate array of parameter objects
                        print("Object[] paramObj = new Object[] { ");
                        for (int i = 0; i < methParams.size(); i++) {
-                               print(getEnumParam(methPrmTypes.get(i), getSimpleIdentifier(methParams.get(i)), i));
+                               String paramType = methPrmTypes.get(i);
+                               if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
+                                       //if (isArray(methPrmTypes.get(i), methParams.get(i)))
+                                       if (isArray(methParams.get(i)))
+                                               print(getSimpleIdentifier(methParams.get(i)) + ".length");
+                                       else if (isList(methPrmTypes.get(i)))
+                                               print(getSimpleIdentifier(methParams.get(i)) + ".size()");
+                                       else
+                                               print("new Integer(1)");
+                               } else
+                                       print(getEnumParam(methPrmTypes.get(i), getSimpleIdentifier(methParams.get(i)), i));
                                // Check if this is the last element (don't print a comma)
                                if (i != methParams.size() - 1) {
                                        print(", ");
@@ -872,16 +924,16 @@ public class IoTCompiler {
                        if (isStructClass(getGenericType(getSimpleArrayType(retType)))) {
                                writeStructReturnJavaStub(getGenericType(getSimpleArrayType(retType)), retType);
                        } else {
-                       // Check if the return value NONPRIMITIVES
-                               if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES) {
-                                       String[] retGenValType = getTypeOfGeneric(retType);
-                                       println("Class<?> retGenValType = " + retGenValType[0] + ".class;");
-                                       println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, retGenValType, paramCls, paramObj);");
-                                       println("return (" + retType + ")retObj;");
-                               } else if (getParamCategory(retType) == ParamCategory.ENUM) {
                                // This is an enum type
+                               if (getParamCategory(getGenericType(getSimpleArrayType(retType))) == ParamCategory.ENUM) {
                                        println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
                                        checkAndWriteEnumRetTypeJavaStub(retType);
+                               } else if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES) {
+                               // Check if the return value NONPRIMITIVES
+                                       String retGenValType = getGenericType(retType);
+                                       println("Class<?> retGenValType = " + retGenValType + ".class;");
+                                       println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, retGenValType, paramCls, paramObj);");
+                                       println("return (" + retType + ")retObj;");
                                } else {
                                        println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
                                        println("return (" + retType + ")retObj;");
@@ -897,7 +949,7 @@ public class IoTCompiler {
        private String returnGenericCallbackType(String paramType) {
 
                if (getParamCategory(paramType) == ParamCategory.NONPRIMITIVES)
-                       return getTypeOfGeneric(paramType)[0];
+                       return getGenericType(paramType);
                else
                        return paramType;
        }
@@ -909,7 +961,10 @@ public class IoTCompiler {
        private boolean checkCallbackType(String paramType, String callbackType) {
 
                String prmType = returnGenericCallbackType(paramType);
-               return callbackType.equals(prmType);
+               if (callbackType == null)       // If there is no callbackType it means not a callback method
+                       return false;
+               else
+                       return callbackType.equals(prmType);
        }
 
 
@@ -922,83 +977,34 @@ public class IoTCompiler {
                println("try {");
                // Check if this is single object, array, or list of objects
                for (int i = 0; i < methParams.size(); i++) {
-
                        String paramType = methPrmTypes.get(i);
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
                                String param = methParams.get(i);
                                if (isArrayOrList(paramType, param)) {  // Generate loop
-                                       println("for (" + paramType + " cb : " + getSimpleIdentifier(param) + ") {");
-                                       println(callbackType + "_CallbackSkeleton skel = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
+                                       println("for (" + getGenericType(paramType) + " cb : " + getSimpleIdentifier(param) + ") {");
+                                       println(callbackType + "_CallbackSkeleton skel" + i + " = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
                                } else
-                                       println(callbackType + "_CallbackSkeleton skel = new " + callbackType + "_CallbackSkeleton(" +
+                                       println(callbackType + "_CallbackSkeleton skel" + i + " = new " + callbackType + "_CallbackSkeleton(" +
                                                getSimpleIdentifier(param) + ", objIdCnt++);");
-                               println("listCallbackObj.add(skel);");
+                               println("listCallbackObj.add(skel" + i + ");");
                                if (isArrayOrList(paramType, param))
                                        println("}");
                        }
                }
-               println("} catch (Exception ex) {");
+               print("}");
+               println(" catch (Exception ex) {");
                println("ex.printStackTrace();");
                println("throw new Error(\"Exception when generating skeleton objects!\");");
                println("}\n");
-               println("int methodId = " + intDecl.getMethodNumId(method) + ";");
-               String retType = intDecl.getMethodType(method);
-               println("Class<?> retType = " + getSimpleType(getEnumType(retType)) + ".class;");
-               // Generate array of parameter types
-               print("Class<?>[] paramCls = new Class<?>[] { ");
-               for (int i = 0; i < methParams.size(); i++) {
-                       String paramType = methPrmTypes.get(i);
-                       if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               print("int.class");
-                       } else { // Generate normal classes if it's not a callback object
-                               String prmType = checkAndGetArray(methPrmTypes.get(i), methParams.get(i));
-                               print(getSimpleType(prmType) + ".class");
-                       }
-                       if (i != methParams.size() - 1) // Check if this is the last element
-                               print(", ");
-               }
-               println(" };");
-               // Generate array of parameter objects
-               print("Object[] paramObj = new Object[] { ");
-               for (int i = 0; i < methParams.size(); i++) {
-                       String paramType = methPrmTypes.get(i);
-                       if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               //if (isArray(methPrmTypes.get(i), methParams.get(i)))
-                               if (isArray(methParams.get(i)))
-                                       print(getSimpleIdentifier(methParams.get(i)) + ".length");
-                               else if (isList(methPrmTypes.get(i)))
-                                       print(getSimpleIdentifier(methParams.get(i)) + ".size()");
-                               else
-                                       print("new Integer(1)");
-                       } else
-                               print(getSimpleIdentifier(methParams.get(i)));
-                       if (i != methParams.size() - 1)
-                               print(", ");
-               }
-               println(" };");
-               // Check if this is "void"
-               if (retType.equals("void")) {
-                       println("rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
-               } else { // We do have a return value
-               // Check if the return value NONPRIMITIVES
-                       if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES) {
-                               String[] retGenValType = getTypeOfGeneric(retType);
-                               println("Class<?> retGenValType = " + retGenValType[0] + ".class;");
-                               println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, retGenValType, paramCls, paramObj);");
-                               println("return (" + retType + ")retObj;");
-                       } else {
-                               println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
-                               println("return (" + retType + ")retObj;");
-                       }
-               }
        }
 
 
        /**
-        * HELPER: writeMethodJavaStub() writes the method of the stub class
+        * HELPER: writeMethodJavaStub() writes the methods of the stub class
         */
        private void writeMethodJavaStub(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses) {
 
+               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
@@ -1026,12 +1032,14 @@ public class IoTCompiler {
                        // Now, write the body of stub!
                        if (isCallbackMethod)
                                writeCallbackMethodBodyJavaStub(intDecl, methParams, methPrmTypes, method, callbackType);
-                       else
-                               writeStdMethodBodyJavaStub(intDecl, methParams, methPrmTypes, method);
+                       //else
+                       writeStdMethodBodyJavaStub(intDecl, methParams, methPrmTypes, method, callbackType);
                        println("}\n");
                        // Write the init callback helper method
-                       if (isCallbackMethod)
+                       if (isCallbackMethod && !isDefined) {
                                writeInitCallbackJavaStub(callbackType, intDecl);
+                               isDefined = true;
+                       }
                }
        }
 
@@ -1089,7 +1097,7 @@ public class IoTCompiler {
                println("private String address;");
                println("private int[] ports;\n");
                // Get the object Id
-               println("private static int objectId = 0;");
+               println("private int objectId = 0;");
                if (callbackExist) {
                // We assume that each class only has one callback interface for now
                        Iterator it = callbackClasses.iterator();
@@ -1195,16 +1203,49 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeStructPermissionJavaSkeleton() writes permission for struct helper
+        */
+       private void writeStructPermissionJavaSkeleton(Collection<String> methods, InterfaceDecl intDecl, String intface) {
+
+               // Use this set to handle two same methodIds
+               for (String method : methods) {
+                       List<String> methParams = intDecl.getMethodParams(method);
+                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+                       // Check for params with structs
+                       for (int i = 0; i < methParams.size(); i++) {
+                               String paramType = methPrmTypes.get(i);
+                               String param = methParams.get(i);
+                               String simpleType = getGenericType(paramType);
+                               if (isStructClass(simpleType)) {
+                                       int methodNumId = intDecl.getMethodNumId(method);
+                                       String helperMethod = methodNumId + "struct" + i;
+                                       int methodHelperNumId = intDecl.getHelperMethodNumId(helperMethod);
+                                       // Iterate over interfaces to give permissions to
+                                       Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
+                                       for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
+                                               String newIntface = intMeth.getKey();
+                                               int newObjectId = getNewIntfaceObjectId(newIntface);
+                                               println("set" + newObjectId + "Allowed.add(" + methodHelperNumId + ");");
+                                       }
+                               }
+                       }
+               }
+       }
+
+
        /**
         * HELPER: writeConstructorJavaSkeleton() writes the constructor of the skeleton class
         */
-       private void writeConstructorJavaSkeleton(String newSkelClass, String intface) {
+       private void writeConstructorJavaSkeleton(String newSkelClass, String intface, InterfaceDecl intDecl, Collection<String> methods, boolean callbackExist) {
 
                println("public " + newSkelClass + "(" + intface + " _mainObj, int _port) throws Exception {");
                println("mainObj = _mainObj;");
                println("rmiObj = new IoTRMIObject(_port);");
                // Generate permission control initialization
                writeConstructorJavaPermission(intface);
+               writeJavaInitCallbackPermission(intface, intDecl, callbackExist);
+               writeStructPermissionJavaSkeleton(methods, intDecl, intface);
                println("___waitRequestInvokeMethod();");
                println("}\n");
        }
@@ -1241,8 +1282,8 @@ public class IoTCompiler {
                        println("public void ___regCB(IoTRMIObject rmiObj) throws IOException {");
                else
                        println("public void ___regCB() throws IOException {");
-               println("Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class },");
-               println("\tnew Class<?>[] { null, null, null });");
+               print("Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class },");
+               println("new Class<?>[] { null, null, null });");
                println("rmiCall = new IoTRMICall((int) paramObj[0], (String) paramObj[1], (int) paramObj[2]);");
                println("}\n");
        }
@@ -1254,6 +1295,7 @@ public class IoTCompiler {
        private void writeMethodJavaSkeleton(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses, 
                        boolean callbackSkeleton) {
 
+               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
@@ -1280,8 +1322,10 @@ public class IoTCompiler {
                        // Now, write the body of skeleton!
                        writeStdMethodBodyJavaSkeleton(methParams, methodId, intDecl.getMethodType(method));
                        println("}\n");
-                       if (isCallbackMethod)
+                       if (isCallbackMethod && !isDefined) {   // Make sure that this function is only defined once!
                                writeInitCallbackJavaSkeleton(callbackSkeleton);
+                               isDefined = true;
+                       }
                }
        }
 
@@ -1289,23 +1333,25 @@ public class IoTCompiler {
        /**
         * HELPER: writeCallbackJavaStubGeneration() writes the callback stub generation part
         */
-       private Map<Integer,String> writeCallbackJavaStubGeneration(List<String> methParams, List<String> methPrmTypes, String callbackType) {
+       private Map<Integer,String> writeCallbackJavaStubGeneration(List<String> methParams, List<String> methPrmTypes, 
+                       String callbackType, boolean isStructMethod) {
 
                Map<Integer,String> mapStubParam = new HashMap<Integer,String>();
+               String offsetPfx = "";
+               if (isStructMethod)
+                       offsetPfx = "offset";
                // Iterate over callback objects
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       //if (callbackType.equals(paramType)) {
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               println("try {");
-                               String exchParamType = checkAndGetParamClass(paramType);
+                               String exchParamType = checkAndGetParamClass(getGenericType(paramType));
                                // Print array if this is array or list if this is a list of callback objects
                                if (isArray(param)) {
-                                       println("int numStubs" + i + " = (int) paramObj[" + i + "];");
+                                       println("int numStubs" + i + " = (int) paramObj[" + offsetPfx + i + "];");
                                        println(exchParamType + "[] stub" + i + " = new " + exchParamType + "[numStubs" + i + "];");
                                } else if (isList(paramType)) {
-                                       println("int numStubs" + i + " = (int) paramObj[" + i + "];");
+                                       println("int numStubs" + i + " = (int) paramObj[" + offsetPfx + i + "];");
                                        println("List<" + exchParamType + "> stub" + i + " = new ArrayList<" + exchParamType + ">();");
                                } else {
                                        println(exchParamType + " stub" + i + " = new " + exchParamType + "_CallbackStub(rmiCall, objIdCnt);");
@@ -1314,7 +1360,7 @@ public class IoTCompiler {
                        }
                        // Generate a loop if needed
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               String exchParamType = checkAndGetParamClass(paramType);
+                               String exchParamType = checkAndGetParamClass(getGenericType(paramType));
                                if (isArray(param)) {
                                        println("for (int objId = 0; objId < numStubs" + i + "; objId++) {");
                                        println("stub" + i + "[objId] = new " + exchParamType + "_CallbackStub(rmiCall, objIdCnt);");
@@ -1336,28 +1382,35 @@ public class IoTCompiler {
        /**
         * HELPER: checkAndWriteEnumTypeJavaSkeleton() writes the enum type (convert from enum to int)
         */
-       private void checkAndWriteEnumTypeJavaSkeleton(List<String> methParams, List<String> methPrmTypes) {
+       private void checkAndWriteEnumTypeJavaSkeleton(List<String> methParams, List<String> methPrmTypes, boolean isStructMethod) {
 
+               String offsetPfx = "";
+               if (isStructMethod)
+                       offsetPfx = "offset";
                // Iterate and find enum declarations
+               boolean printed = false;
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
+                       String simpleType = getGenericType(paramType);
                        if (isEnumClass(simpleType)) {
                        // Check if this is enum type
-                               println("int paramInt" + i + "[] = (int[]) paramObj[" + i + "];");
-                               println(simpleType + "[] enumVals = " + simpleType + ".values();");
+                               println("int paramInt" + i + "[] = (int[]) paramObj[" + offsetPfx + i + "];");
+                               if (!printed) {
+                                       println(simpleType + "[] enumVals = " + simpleType + ".values();");
+                                       printed = true;
+                               }
                                if (isArray(param)) {   // An array
                                        println("int len" + i + " = paramInt" + i + ".length;");
-                                       println(simpleType + "[] paramEnum = new " + simpleType + "[len];");
+                                       println(simpleType + "[] paramEnum" + i + " = new " + simpleType + "[len" + i + "];");
                                        println("for (int i = 0; i < len" + i + "; i++) {");
-                                       println("paramEnum[i] = enumVals[paramInt" + i + "[i]];");
+                                       println("paramEnum" + i + "[i] = enumVals[paramInt" + i + "[i]];");
                                        println("}");
                                } else if (isList(paramType)) { // A list
                                        println("int len" + i + " = paramInt" + i + ".length;");
-                                       println("List<" + simpleType + "> paramEnum = new ArrayList<" + simpleType + ">();");
+                                       println("List<" + simpleType + "> paramEnum" + i + " = new ArrayList<" + simpleType + ">();");
                                        println("for (int i = 0; i < len" + i + "; i++) {");
-                                       println("paramEnum.add(enumVals[paramInt" + i + "[i]]);");
+                                       println("paramEnum" + i + ".add(enumVals[paramInt" + i + "[i]]);");
                                        println("}");
                                } else {        // Just one element
                                        println(simpleType + " paramEnum" + i + " = enumVals[paramInt" + i + "[0]];");
@@ -1373,10 +1426,10 @@ public class IoTCompiler {
        private void checkAndWriteEnumRetTypeJavaSkeleton(String retType, String methodId) {
 
                // Strips off array "[]" for return type
-               String pureType = getSimpleArrayType(getSimpleType(retType));
+               String pureType = getSimpleArrayType(getGenericType(retType));
                // Take the inner type of generic
                if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
-                       pureType = getTypeOfGeneric(retType)[0];
+                       pureType = getGenericType(retType);
                if (isEnumClass(pureType)) {
                // Check if this is enum type
                        // Enum decoder
@@ -1397,10 +1450,10 @@ public class IoTCompiler {
        private void checkAndWriteEnumRetConvJavaSkeleton(String retType) {
 
                // Strips off array "[]" for return type
-               String pureType = getSimpleArrayType(getSimpleType(retType));
+               String pureType = getSimpleArrayType(getGenericType(retType));
                // Take the inner type of generic
                if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
-                       pureType = getTypeOfGeneric(retType)[0];
+                       pureType = getGenericType(retType);
                if (isEnumClass(pureType)) {
                // Check if this is enum type
                        if (isArray(retType)) { // An array
@@ -1411,9 +1464,9 @@ public class IoTCompiler {
                                println("}");
                        } else if (isList(retType)) {   // A list
                                println("int retLen = retEnum.size();");
-                               println("List<" + pureType + "> retEnumVal = new ArrayList<" + pureType + ">();");
+                               println("int[] retEnumVal = new int[retLen];");
                                println("for (int i = 0; i < retLen; i++) {");
-                               println("retEnumVal.add(retEnum[i].ordinal());");
+                               println("retEnumVal[i] = retEnum.get(i).ordinal();");
                                println("}");
                        } else {        // Just one element
                                println("int[] retEnumVal = new int[1];");
@@ -1450,7 +1503,7 @@ public class IoTCompiler {
 
        
        /**
-        * HELPER: writeStructMembersJavaSkeleton() writes parameters of struct
+        * HELPER: writeStructMembersJavaSkeleton() writes member parameters of struct
         */
        private void writeStructMembersJavaSkeleton(String simpleType, String paramType, 
                        String param, String method, InterfaceDecl intDecl, int iVar) {
@@ -1459,14 +1512,12 @@ public class IoTCompiler {
                StructDecl structDecl = getStructDecl(simpleType);
                List<String> memTypes = structDecl.getMemberTypes(simpleType);
                List<String> members = structDecl.getMembers(simpleType);
-               if (isArrayOrList(param, paramType)) {  // An array or list
+               if (isArrayOrList(paramType, param)) {  // An array or list
                        int methodNumId = intDecl.getMethodNumId(method);
                        String counter = "struct" + methodNumId + "Size" + iVar;
                        println("for(int i = 0; i < " + counter + "; i++) {");
                }
-               println("int pos = 0;");
-               if (isArrayOrList(param, paramType)) {  // An array or list
-                       println("for(int i = 0; i < retLen; i++) {");
+               if (isArrayOrList(paramType, param)) {  // An array or list
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
                                println("paramCls[pos] = " + getSimpleType(getEnumType(prmType)) + ".class;");
@@ -1483,13 +1534,13 @@ public class IoTCompiler {
        }
 
 
-
        /**
-        * HELPER: writeStructMembersInitJavaSkeleton() writes parameters of struct
+        * HELPER: writeStructMembersInitJavaSkeleton() writes member parameters initialization of struct
         */
        private void writeStructMembersInitJavaSkeleton(InterfaceDecl intDecl, List<String> methParams,
                        List<String> methPrmTypes, String method) {
 
+               println("int objPos = 0;");
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
@@ -1507,12 +1558,11 @@ public class IoTCompiler {
                                        println("List<" + simpleType + "> paramStruct" + i + " = new ArrayList<" + simpleType + ">();");
                                } else
                                        println(simpleType + " paramStruct" + i + " = new " + simpleType + "();");
-                               println("int objPos = 0;");
                                // Initialize members
                                StructDecl structDecl = getStructDecl(simpleType);
                                List<String> members = structDecl.getMembers(simpleType);
                                List<String> memTypes = structDecl.getMemberTypes(simpleType);
-                               if (isArrayOrList(param, paramType)) {  // An array or list
+                               if (isArrayOrList(paramType, param)) {  // An array or list
                                        println("for(int i = 0; i < " + counter + "; i++) {");
                                }
                                if (isArray(param)) {   // An array
@@ -1540,14 +1590,14 @@ public class IoTCompiler {
                                }
                        } else {
                                // Take offsets of parameters
-                               println("int offset" + i +" = objPos;");
+                               println("int offset" + i +" = objPos++;");
                        }
                }
        }
 
 
        /**
-        * HELPER: writeStructReturnJavaSkeleton() writes parameters if struct is present
+        * HELPER: writeStructReturnJavaSkeleton() writes struct for return statement
         */
        private void writeStructReturnJavaSkeleton(String simpleType, String retType) {
 
@@ -1568,7 +1618,7 @@ public class IoTCompiler {
                StructDecl structDecl = getStructDecl(simpleType);
                List<String> memTypes = structDecl.getMemberTypes(simpleType);
                List<String> members = structDecl.getMembers(simpleType);
-               if (isArrayOrList(retType, retType)) {  // An array or list
+               if (isArray(retType)) { // An array or list
                        println("for(int i = 0; i < retLen; i++) {");
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
@@ -1578,6 +1628,16 @@ public class IoTCompiler {
                                println(";");
                        }
                        println("}");
+               } else if (isList(retType)) {   // An array or list
+                       println("for(int i = 0; i < retLen; i++) {");
+                       for (int i = 0; i < members.size(); i++) {
+                               String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
+                               println("retCls[retPos] = " + getSimpleType(getEnumType(prmType)) + ".class;");
+                               print("retObj[retPos++] = retStruct.get(i).");
+                               print(getEnumParam(memTypes.get(i), getSimpleIdentifier(members.get(i)), i));
+                               println(";");
+                       }
+                       println("}");
                } else {        // Just one struct element
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
@@ -1592,54 +1652,62 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperReturnJavaSkeleton() writes the return value part in skeleton
+        * HELPER: writeMethodHelperReturnJavaSkeleton() writes return statement part in skeleton
         */
        private void writeMethodHelperReturnJavaSkeleton(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method, boolean isCallbackMethod, String callbackType) {
+                       List<String> methPrmTypes, String method, boolean isCallbackMethod, String callbackType,
+                       boolean isStructMethod) {
 
-               checkAndWriteEnumTypeJavaSkeleton(methParams, methPrmTypes);
+               checkAndWriteEnumTypeJavaSkeleton(methParams, methPrmTypes, isStructMethod);
                Map<Integer,String> mapStubParam = null;
-               if (isCallbackMethod)
-                       mapStubParam = writeCallbackJavaStubGeneration(methParams, methPrmTypes, callbackType);
+               if (isCallbackMethod) {
+                       println("try {");
+                       mapStubParam = writeCallbackJavaStubGeneration(methParams, methPrmTypes, callbackType, isStructMethod);
+               }
                // Check if this is "void"
                String retType = intDecl.getMethodType(method);
                if (retType.equals("void")) {
                        print(intDecl.getMethodId(method) + "(");
-               } else if (isEnumClass(getSimpleArrayType(getSimpleType(retType)))) {   // Enum type
+               } else if (isEnumClass(getSimpleArrayType(getGenericType(retType)))) {  // Enum type
                        checkAndWriteEnumRetTypeJavaSkeleton(retType, intDecl.getMethodId(method));
-               } else if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) { // Struct type
+               } else if (isStructClass(getSimpleArrayType(getGenericType(retType)))) {        // Struct type
                        print(retType + " retStruct = " + intDecl.getMethodId(method) + "(");
                } else { // We do have a return value
                        print("Object retObj = " + intDecl.getMethodId(method) + "(");
                }
                for (int i = 0; i < methParams.size(); i++) {
 
-                       if (isCallbackMethod) {
+                       String paramType = methPrmTypes.get(i);
+                       if (isCallbackMethod && checkCallbackType(paramType, callbackType)) {
                                print(mapStubParam.get(i));     // Get the callback parameter
-                       } else if (isEnumClass(getSimpleType(methPrmTypes.get(i)))) { // Enum class
-                               print(getEnumParam(methPrmTypes.get(i), methParams.get(i), i));
-                       } else if (isStructClass(getSimpleType(methPrmTypes.get(i)))) {
+                       } else if (isEnumClass(getGenericType(paramType))) { // Enum class
+                               print(getEnumParam(paramType, methParams.get(i), i));
+                       } else if (isStructClass(getGenericType(paramType))) {
                                print("paramStruct" + i);
                        } else {
-                               String prmType = checkAndGetArray(methPrmTypes.get(i), methParams.get(i));
-                               print("(" + prmType + ") paramObj[offset" + i + "]");
+                               String prmType = checkAndGetArray(paramType, methParams.get(i));
+                               if (isStructMethod)
+                                       print("(" + prmType + ") paramObj[offset" + i + "]");
+                               else
+                                       print("(" + prmType + ") paramObj[" + i + "]");
                        }
                        if (i != methParams.size() - 1)
                                print(", ");
                }
                println(");");
                if (!retType.equals("void")) {
-                       if (isEnumClass(getSimpleArrayType(getSimpleType(retType)))) { // Enum type
+                       if (isEnumClass(getSimpleArrayType(getGenericType(retType)))) { // Enum type
                                checkAndWriteEnumRetConvJavaSkeleton(retType);
                                println("rmiObj.sendReturnObj(retObj);");
-                       } else if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) { // Struct type
-                               writeStructReturnJavaSkeleton(getSimpleArrayType(getSimpleType(retType)), retType);
+                       } else if (isStructClass(getSimpleArrayType(getGenericType(retType)))) { // Struct type
+                               writeStructReturnJavaSkeleton(getSimpleArrayType(getGenericType(retType)), retType);
                                println("rmiObj.sendReturnObj(retCls, retObj);");
                        } else
                                println("rmiObj.sendReturnObj(retObj);");
                }
                if (isCallbackMethod) { // Catch exception if this is callback
-                       println("} catch(Exception ex) {");
+                       print("}");
+                       println(" catch(Exception ex) {");
                        println("ex.printStackTrace();");
                        println("throw new Error(\"Exception from callback object instantiation!\");");
                        println("}");
@@ -1661,6 +1729,7 @@ public class IoTCompiler {
                println(";");
                println("Class<?>[] paramCls = new Class<?>[paramLen];");
                println("Class<?>[] paramClsGen = new Class<?>[paramLen];");
+               println("int pos = 0;");
                // Iterate again over the parameters
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
@@ -1690,7 +1759,7 @@ public class IoTCompiler {
                println("Object[] paramObj = rmiObj.getMethodParams(paramCls, paramClsGen);");
                writeStructMembersInitJavaSkeleton(intDecl, methParams, methPrmTypes, method);
                // Write the return value part
-               writeMethodHelperReturnJavaSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod, callbackType);
+               writeMethodHelperReturnJavaSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod, callbackType, true);
        }
 
 
@@ -1723,8 +1792,10 @@ public class IoTCompiler {
                print("new Class<?>[] { ");
                for (int i = 0; i < methParams.size(); i++) {
                        String prmType = methPrmTypes.get(i);
-                       if (getParamCategory(prmType) == ParamCategory.NONPRIMITIVES)
-                               print(getTypeOfGeneric(prmType)[0] + ".class");
+                       if ((getParamCategory(prmType) == ParamCategory.NONPRIMITIVES) &&
+                               !isEnumClass(getGenericType(prmType)) &&
+                               !callbackClasses.contains(getGenericType(prmType)))
+                                       print(getGenericType(prmType) + ".class");
                        else
                                print("null");
                        if (i != methParams.size() - 1)
@@ -1732,7 +1803,7 @@ public class IoTCompiler {
                }
                println(" });");
                // Write the return value part
-               writeMethodHelperReturnJavaSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod, callbackType);
+               writeMethodHelperReturnJavaSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod, callbackType, false);
        }
 
 
@@ -1761,11 +1832,12 @@ public class IoTCompiler {
                                for (int i = 0; i < methParams.size(); i++) { // Print size variables
                                        String paramType = methPrmTypes.get(i);
                                        String param = methParams.get(i);
-                                       String simpleType = getSimpleType(paramType);
+                                       String simpleType = getGenericType(paramType);
                                        if (isStructClass(simpleType)) {
-                                               if (!begin) {   // Generate comma for not the beginning variable
-                                                       print(", "); begin = false;
-                                               }
+                                               if (!begin)     // Generate comma for not the beginning variable
+                                                       print(", ");
+                                               else
+                                                       begin = false;
                                                int methodNumId = intDecl.getMethodNumId(method);
                                                print("int struct" + methodNumId + "Size" + i);
                                        }
@@ -1802,7 +1874,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperStructSetupJavaSkeleton() writes the method helper of the struct in skeleton class
+        * HELPER: writeMethodHelperStructSetupJavaSkeleton() writes the method helper of struct setup in skeleton class
         */
        private void writeMethodHelperStructSetupJavaSkeleton(Collection<String> methods, 
                        InterfaceDecl intDecl) {
@@ -1816,7 +1888,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = methPrmTypes.get(i);
                                String param = methParams.get(i);
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
                                        print("public int ___");
@@ -1833,7 +1905,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperStructSetupJavaCallbackSkeleton() writes the method helper of the struct in skeleton class
+        * HELPER: writeMethodHelperStructSetupJavaCallbackSkeleton() writes the method helper of struct setup in callback skeleton class
         */
        private void writeMethodHelperStructSetupJavaCallbackSkeleton(Collection<String> methods, 
                        InterfaceDecl intDecl) {
@@ -1847,7 +1919,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = methPrmTypes.get(i);
                                String param = methParams.get(i);
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
                                        print("public int ___");
@@ -1877,7 +1949,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = methPrmTypes.get(i);
                                String param = methParams.get(i);
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
                                        println("int struct" + methodNumId + "Size" + i + " = 0;");
@@ -1888,24 +1960,25 @@ public class IoTCompiler {
        
        
        /**
-        * HELPER: writeInputCountVarStructSkeleton() writes counter variable of struct for skeleton
+        * HELPER: writeInputCountVarStructSkeleton() writes input counter variable of struct for skeleton
         */
        private boolean writeInputCountVarStructSkeleton(String method, InterfaceDecl intDecl) {
 
                List<String> methParams = intDecl.getMethodParams(method);
                List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
                boolean structExist = false;
+               boolean begin = true;
                // Check for params with structs
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
-                       boolean begin = true;
+                       String simpleType = getGenericType(paramType);
                        if (isStructClass(simpleType)) {
                                structExist = true;
-                               if (!begin) {
-                                       print(", "); begin = false;
-                               }
+                               if (!begin)
+                                       print(", ");
+                               else
+                                       begin = false;
                                int methodNumId = intDecl.getMethodNumId(method);
                                print("struct" + methodNumId + "Size" + i);
                        }
@@ -1928,7 +2001,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = methPrmTypes.get(i);
                                String param = methParams.get(i);
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
                                        print("case ");
@@ -1957,7 +2030,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = methPrmTypes.get(i);
                                String param = methParams.get(i);
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
                                        print("case ");
@@ -1981,15 +2054,15 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
                        println("if (_objectId == object" + newObjectId + "Id) {");
                        println("if (!set" + newObjectId + "Allowed.contains(methodId)) {");
                        println("throw new Error(\"Object with object Id: \" + _objectId + \"  is not allowed to access method: \" + methodId);");
                        println("}");
+                       println("}");
                        println("else {");
                        println("throw new Error(\"Object Id: \" + _objectId + \" not recognized!\");");
                        println("}");
-                       println("}");
                }
        }
 
@@ -2069,7 +2142,7 @@ public class IoTCompiler {
                        // Write properties
                        writePropertiesJavaSkeleton(intface, callbackExist, intDecl);
                        // Write constructor
-                       writeConstructorJavaSkeleton(newSkelClass, intface);
+                       writeConstructorJavaSkeleton(newSkelClass, intface, intDecl, methods, callbackExist);
                        // Write methods
                        writeMethodJavaSkeleton(methods, intDecl, callbackClasses, false);
                        // Write method helper
@@ -2090,7 +2163,7 @@ public class IoTCompiler {
 
                println("private " + intface + " mainObj;");
                // For callback skeletons, this is its own object Id
-               println("private static int objectId = 0;");
+               println("private int objectId = 0;");
                // Callback
                if (callbackExist) {
                        println("private static int objIdCnt = 0;");
@@ -2103,7 +2176,7 @@ public class IoTCompiler {
        /**
         * HELPER: writeConstructorJavaCallbackSkeleton() writes the constructor of the skeleton class
         */
-       private void writeConstructorJavaCallbackSkeleton(String newSkelClass, String intface) {
+       private void writeConstructorJavaCallbackSkeleton(String newSkelClass, String intface, InterfaceDecl intDecl, Collection<String> methods) {
 
                println("public " + newSkelClass + "(" + intface + " _mainObj, int _objectId) throws Exception {");
                println("mainObj = _mainObj;");
@@ -2137,11 +2210,12 @@ public class IoTCompiler {
                                for (int i = 0; i < methParams.size(); i++) { // Print size variables
                                        String paramType = methPrmTypes.get(i);
                                        String param = methParams.get(i);
-                                       String simpleType = getSimpleType(paramType);
+                                       String simpleType = getGenericType(paramType);
                                        if (isStructClass(simpleType)) {
-                                               if (!begin) {   // Generate comma for not the beginning variable
-                                                       print(", "); begin = false;
-                                               }
+                                               if (!begin)     // Generate comma for not the beginning variable
+                                                       print(", ");
+                                               else
+                                                       begin = false;
                                                int methodNumId = intDecl.getMethodNumId(method);
                                                print("int struct" + methodNumId + "Size" + i);
                                        }
@@ -2178,7 +2252,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeJavaCallbackWaitRequestInvokeMethod() writes the main loop of the skeleton class
+        * HELPER: writeJavaCallbackWaitRequestInvokeMethod() writes the request invoke method of the callback skeleton class
         */
        private void writeJavaCallbackWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, boolean callbackExist) {
 
@@ -2250,7 +2324,7 @@ public class IoTCompiler {
                        // Write properties
                        writePropertiesJavaCallbackSkeleton(intface, callbackExist);
                        // Write constructor
-                       writeConstructorJavaCallbackSkeleton(newSkelClass, intface);
+                       writeConstructorJavaCallbackSkeleton(newSkelClass, intface, intDecl, methods);
                        // Write methods
                        writeMethodJavaSkeleton(methods, intDecl, callbackClasses, true);
                        // Write method helper
@@ -2265,7 +2339,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodCplusLocalInterface() writes the method of the interface
+        * HELPER: writeMethodCplusLocalInterface() writes the method of the local interface
         */
        private void writeMethodCplusLocalInterface(Collection<String> methods, InterfaceDecl intDecl) {
 
@@ -2383,6 +2457,7 @@ public class IoTCompiler {
                                // Write file headers
                                println("#ifndef _" + stType.toUpperCase() + "_HPP__");
                                println("#define _" + stType.toUpperCase() + "_HPP__");
+                               println("using namespace std;");
                                println("struct " + stType + " {");
                                List<String> structMemberTypes = structDecl.getMemberTypes(stType);
                                List<String> structMembers = structDecl.getMembers(stType);
@@ -2430,11 +2505,6 @@ public class IoTCompiler {
                        Set<String> includeClasses = getIncludeClasses(methods, intDecl, intface, true);
                        printIncludeStatements(includeClasses); println("");
                        println("using namespace std;\n");
-                       // Write enum if any...
-                       //EnumDecl enumDecl = (EnumDecl) decHandler.getEnumDecl(intface);
-                       //writeEnumCplus(enumDecl);
-                       // Write struct if any...
-                       //StructDecl structDecl = (StructDecl) decHandler.getStructDecl(intface);
                        //writeStructCplus(structDecl);
                        println("class " + intface); println("{");
                        println("public:");
@@ -2493,10 +2563,11 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodCplusStub() writes the method of the stub
+        * HELPER: writeMethodCplusStub() writes the methods of the stub
         */
        private void writeMethodCplusStub(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses) {
 
+               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
@@ -2507,7 +2578,7 @@ public class IoTCompiler {
                        String callbackType = null;
                        for (int i = 0; i < methParams.size(); i++) {
 
-                               String paramType = methPrmTypes.get(i);
+                               String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                                // Check if this has callback object
                                if (callbackClasses.contains(paramType)) {
                                        isCallbackMethod = true;
@@ -2525,13 +2596,13 @@ public class IoTCompiler {
                        println(") { ");
                        if (isCallbackMethod)
                                writeCallbackMethodBodyCplusStub(intDecl, methParams, methPrmTypes, method, callbackType);
-                       else
-                               writeStdMethodBodyCplusStub(intDecl, methParams, methPrmTypes, method);
+                       writeStdMethodBodyCplusStub(intDecl, methParams, methPrmTypes, method, callbackType, isCallbackMethod);
                        println("}\n");
                        // Write the init callback helper method
-                       if (isCallbackMethod) {
+                       if (isCallbackMethod && !isDefined) {
                                writeInitCallbackCplusStub(callbackType, intDecl);
                                writeInitCallbackSendInfoCplusStub(intDecl);
+                               isDefined = true;
                        }
                }
        }
@@ -2552,68 +2623,23 @@ public class IoTCompiler {
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
                                String param = methParams.get(i);
                                if (isArrayOrList(paramType, param)) {  // Generate loop
-                                       println("for (" + paramType + "* cb : " + getSimpleIdentifier(param) + ") {");
-                                       println(callbackType + "_CallbackSkeleton* skel = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
+                                       println("for (" + getGenericType(paramType) + "* cb : " + getSimpleIdentifier(param) + ") {");
+                                       println(callbackType + "_CallbackSkeleton* skel" + i + " = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
                                        isArrayOrList = true;
                                        callbackParam = getSimpleIdentifier(param);
                                } else
-                                       println(callbackType + "_CallbackSkeleton* skel = new " + callbackType + "_CallbackSkeleton(" +
+                                       println(callbackType + "_CallbackSkeleton* skel" + i + " = new " + callbackType + "_CallbackSkeleton(" +
                                                getSimpleIdentifier(param) + ", objIdCnt++);");
-                               println("vecCallbackObj.push_back(skel);");
-                               if (isArrayOrList(paramType, param))
+                               println("vecCallbackObj.push_back(skel" + i + ");");
+                               if (isArrayOrList)
                                        println("}");
+                               print("int ___paramCB" + i + " = ");
+                               if (isArrayOrList)
+                                       println(callbackParam + ".size();");
+                               else
+                                       println("1;");
                        }
                }
-               println("int numParam = " + methParams.size() + ";");
-               println("int methodId = " + intDecl.getMethodNumId(method) + ";");
-               String retType = intDecl.getMethodType(method);
-               String retTypeC = checkAndGetCplusType(retType);
-               println("string retType = \"" + checkAndGetCplusArrayType(retTypeC) + "\";");
-               // Generate array of parameter types
-               print("string paramCls[] = { ");
-               for (int i = 0; i < methParams.size(); i++) {
-                       String paramType = methPrmTypes.get(i);
-                       if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               print("\"int\"");
-                       } else { // Generate normal classes if it's not a callback object
-                               String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(paramTypeC, methParams.get(i));
-                               print("\"" + prmType + "\"");
-                       }
-                       if (i != methParams.size() - 1) // Check if this is the last element
-                               print(", ");
-               }
-               println(" };");
-               print("int ___paramCB = ");
-               if (isArrayOrList)
-                       println(callbackParam + ".size();");
-               else
-                       println("1;");
-               // Generate array of parameter objects
-               print("void* paramObj[] = { ");
-               for (int i = 0; i < methParams.size(); i++) {
-                       String paramType = methPrmTypes.get(i);
-                       if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               print("&___paramCB");
-                       } else
-                               print(getSimpleIdentifier(methParams.get(i)));
-                       if (i != methParams.size() - 1)
-                               print(", ");
-               }
-               println(" };");
-               // Check if this is "void"
-               if (retType.equals("void")) {
-                       println("void* retObj = NULL;");
-                       println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
-               } else { // We do have a return value
-                       if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
-                               println(checkAndGetCplusType(retType) + " retVal;");
-                       else
-                               println(checkAndGetCplusType(retType) + " retVal = " + generateCplusInitializer(retType) + ";");
-                       println("void* retObj = &retVal;");
-                       println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
-                       println("return retVal;");
-               }
        }
 
 
@@ -2626,14 +2652,13 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
-                       if (isEnumClass(simpleType)) {
+                       if (isEnumClass(getGenericType(paramType))) {
                        // Check if this is enum type
                                if (isArrayOrList(paramType, param)) {  // An array or vector
-                                       println("int len" + i + " = " + param + ".size();");
-                                       println("vector<int> paramEnum" + i + "(len);");
+                                       println("int len" + i + " = " + getSimpleIdentifier(param) + ".size();");
+                                       println("vector<int> paramEnum" + i + "(len" + i + ");");
                                        println("for (int i = 0; i < len" + i + "; i++) {");
-                                       println("paramEnum" + i + "[i] = (int) " + param + "[i];");
+                                       println("paramEnum" + i + "[i] = (int) " + getSimpleIdentifier(param) + "[i];");
                                        println("}");
                                } else {        // Just one element
                                        println("vector<int> paramEnum" + i + "(1);");
@@ -2650,10 +2675,10 @@ public class IoTCompiler {
        private void checkAndWriteEnumRetTypeCplusStub(String retType) {
 
                // Strips off array "[]" for return type
-               String pureType = getSimpleArrayType(getSimpleType(retType));
+               String pureType = getSimpleArrayType(getGenericType(retType));
                // Take the inner type of generic
                if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
-                       pureType = getTypeOfGeneric(retType)[0];
+                       pureType = getGenericType(retType);
                if (isEnumClass(pureType)) {
                // Check if this is enum type
                        println("vector<int> retEnumInt;");
@@ -2683,7 +2708,7 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
+                       String simpleType = getGenericType(paramType);
                        if (isStructClass(simpleType)) {
                        // Check if this is enum type
                                println("int numParam" + i + " = 1;");
@@ -2693,7 +2718,7 @@ public class IoTCompiler {
                                println("string retTypeStruct" + i + " = \"void\";");
                                println("string paramClsStruct" + i + "[] = { \"int\" };");
                                print("int structLen" + i + " = ");
-                               if (isArrayOrList(param, paramType)) {  // An array
+                               if (isArrayOrList(paramType, param)) {  // An array
                                        println(getSimpleArrayType(param) + ".size();");
                                } else {        // Just one element
                                        println("1;");
@@ -2720,8 +2745,8 @@ public class IoTCompiler {
                        String simpleType = getGenericType(paramType);
                        if (isStructClass(simpleType)) {
                                int members = getNumOfMembers(simpleType);
-                               if (isArrayOrList(param, paramType)) {                  // An array
-                                       String structLen = param + ".size()";
+                               if (isArrayOrList(paramType, param)) {  // An array or list
+                                       String structLen = getSimpleIdentifier(param) + ".size()";
                                        print(members + "*" + structLen);
                                } else
                                        print(Integer.toString(members));
@@ -2735,7 +2760,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructMembersCplusStub() writes parameters of struct
+        * HELPER: writeStructMembersCplusStub() writes member parameters of struct
         */
        private void writeStructMembersCplusStub(String simpleType, String paramType, String param) {
 
@@ -2743,24 +2768,22 @@ public class IoTCompiler {
                StructDecl structDecl = getStructDecl(simpleType);
                List<String> memTypes = structDecl.getMemberTypes(simpleType);
                List<String> members = structDecl.getMembers(simpleType);
-               if (isArrayOrList(param, paramType)) {  // An array or list
-                       println("for(int i = 0; i < " + param + ".size(); i++) {");
+               if (isArrayOrList(paramType, param)) {  // An array or list
+                       println("for(int i = 0; i < " + getSimpleIdentifier(param) + ".size(); i++) {");
                }
-               if (isArrayOrList(param, paramType)) {  // An array or list
+               if (isArrayOrList(paramType, param)) {  // An array or list
                        for (int i = 0; i < members.size(); i++) {
-                               String prmTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println("paramCls[pos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
-                               print("paramObj[pos++] = &" + param + "[i].");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("paramCls[pos] = \"" + prmTypeC + "\";");
+                               print("paramObj[pos++] = &" + getSimpleIdentifier(param) + "[i].");
                                print(getSimpleIdentifier(members.get(i)));
                                println(";");
                        }
                        println("}");
                } else {        // Just one struct element
                        for (int i = 0; i < members.size(); i++) {
-                               String prmTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println("paramCls[pos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("paramCls[pos] = \"" + prmTypeC + "\";");
                                print("paramObj[pos++] = &" + param + ".");
                                print(getSimpleIdentifier(members.get(i)));
                                println(";");
@@ -2770,9 +2793,9 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructParamClassCplusStub() writes parameters if struct is present
+        * HELPER: writeStructParamClassCplusStub() writes member parameters of struct
         */
-       private void writeStructParamClassCplusStub(List<String> methParams, List<String> methPrmTypes) {
+       private void writeStructParamClassCplusStub(List<String> methParams, List<String> methPrmTypes, String callbackType) {
 
                print("int numParam = ");
                writeLengthStructParamClassCplusStub(methParams, methPrmTypes);
@@ -2787,10 +2810,12 @@ public class IoTCompiler {
                        String simpleType = getGenericType(paramType);
                        if (isStructClass(simpleType)) {
                                writeStructMembersCplusStub(simpleType, paramType, param);
+                       } else if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
+                               println("paramCls[pos] = \"int\";");
+                               println("paramObj[pos++] = &___paramCB" + i + ";");
                        } else {
-                               String prmTypeC = checkAndGetCplusType(methPrmTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(prmTypeC, methParams.get(i));
-                               println("paramCls[pos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+                               String prmTypeC = checkAndGetCplusArgClsType(methPrmTypes.get(i), methParams.get(i));
+                               println("paramCls[pos] = \"" + prmTypeC + "\";");
                                print("paramObj[pos++] = &");
                                print(getEnumParam(methPrmTypes.get(i), getSimpleIdentifier(methParams.get(i)), i));
                                println(";");
@@ -2801,7 +2826,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructRetMembersCplusStub() writes parameters of struct
+        * HELPER: writeStructRetMembersCplusStub() writes member parameters of struct for return statement
         */
        private void writeStructRetMembersCplusStub(String simpleType, String retType) {
 
@@ -2831,7 +2856,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructReturnCplusStub() writes parameters if struct is present
+        * HELPER: writeStructReturnCplusStub() writes member parameters of struct for return statement
         */
        private void writeStructReturnCplusStub(String simpleType, String retType) {
 
@@ -2866,17 +2891,15 @@ public class IoTCompiler {
                if (isArrayOrList(retType, retType)) {  // An array or list
                        println("for(int i = 0; i < retLen; i++) {");
                        for (int i = 0; i < members.size(); i++) {
-                               String prmTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println("retCls[retPos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("retCls[retPos] = \"" + prmTypeC + "\";");
                                println("retObj[retPos++] = &retParam" + i + "[i];");
                        }
                        println("}");
                } else {        // Just one struct element
                        for (int i = 0; i < members.size(); i++) {
-                               String prmTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println("retCls[retPos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("retCls[retPos] = \"" + prmTypeC + "\";");
                                println("retObj[retPos++] = &retParam" + i + ";");
                        }
                }
@@ -2893,34 +2916,41 @@ public class IoTCompiler {
         * HELPER: writeStdMethodBodyCplusStub() writes the standard method body in the stub class
         */
        private void writeStdMethodBodyCplusStub(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method) {
+                       List<String> methPrmTypes, String method, String callbackType, boolean isCallbackMethod) {
 
                checkAndWriteStructSetupCplusStub(methParams, methPrmTypes, intDecl, method);
                println("int methodId = " + intDecl.getMethodNumId(method) + ";");
                String retType = intDecl.getMethodType(method);
-               String retTypeC = checkAndGetCplusType(retType);
-               println("string retType = \"" + checkAndGetCplusArrayType(getStructType(getEnumType(retTypeC))) + "\";");
+               println("string retType = \"" + checkAndGetCplusRetClsType(getStructType(getEnumType(retType))) + "\";");
+               checkAndWriteEnumTypeCplusStub(methParams, methPrmTypes);
                // Generate array of parameter types
                if (isStructPresent(methParams, methPrmTypes)) {
-                       writeStructParamClassCplusStub(methParams, methPrmTypes);
+                       writeStructParamClassCplusStub(methParams, methPrmTypes, callbackType);
                } else {
                        println("int numParam = " + methParams.size() + ";");
                        print("string paramCls[] = { ");
                        for (int i = 0; i < methParams.size(); i++) {
-                               String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
-                               String paramType = checkAndGetCplusArrayType(paramTypeC, methParams.get(i));
-                               print("\"" + getEnumType(paramType) + "\"");
+                               String paramType = returnGenericCallbackType(methPrmTypes.get(i));
+                               if (checkCallbackType(paramType, callbackType)) {
+                                       print("\"int\"");
+                               } else {
+                                       String paramTypeC = checkAndGetCplusArgClsType(methPrmTypes.get(i), methParams.get(i));
+                                       print("\"" + paramTypeC + "\"");
+                               }
                                // Check if this is the last element (don't print a comma)
                                if (i != methParams.size() - 1) {
                                        print(", ");
                                }
                        }
                        println(" };");
-                       checkAndWriteEnumTypeCplusStub(methParams, methPrmTypes);
                        // Generate array of parameter objects
                        print("void* paramObj[] = { ");
                        for (int i = 0; i < methParams.size(); i++) {
-                               print("&" + getEnumParam(methPrmTypes.get(i), getSimpleIdentifier(methParams.get(i)), i));
+                               String paramType = returnGenericCallbackType(methPrmTypes.get(i));
+                               if (checkCallbackType(paramType, callbackType)) // Check if this has callback object
+                                       print("&___paramCB" + i);
+                               else
+                                       print("&" + getEnumParam(methPrmTypes.get(i), getSimpleIdentifier(methParams.get(i)), i));
                                // Check if this is the last element (don't print a comma)
                                if (i != methParams.size() - 1) {
                                        print(", ");
@@ -2938,13 +2968,15 @@ public class IoTCompiler {
                                writeStructReturnCplusStub(getGenericType(getSimpleArrayType(retType)), retType);
                        } else {
                        // Check if the return value NONPRIMITIVES
-                               if (getParamCategory(retType) == ParamCategory.ENUM) {
+                               if (isEnumClass(getSimpleArrayType(getGenericType(retType)))) {
                                        checkAndWriteEnumRetTypeCplusStub(retType);
                                } else {
-                                       if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
+                                       //if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
+                                       if (isArrayOrList(retType,retType))
                                                println(checkAndGetCplusType(retType) + " retVal;");
-                                       else
+                                       else {
                                                println(checkAndGetCplusType(retType) + " retVal = " + generateCplusInitializer(retType) + ";");
+                                       }
                                        println("void* retObj = &retVal;");
                                        println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
                                        println("return retVal;");
@@ -2962,9 +2994,9 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
-                       println("const static int object" + newObjectId + "Id = " + newObjectId + ";");
-                       println("const static set<int> set" + newObjectId + "Allowed;");
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
+                       println("const static int object" + newObjectId + "Id = " + newObjectId + ";\t//" + newIntface);
+                       println("static set<int> set" + newObjectId + "Allowed;");
                }
        }       
 
@@ -2974,8 +3006,7 @@ public class IoTCompiler {
        private void writePropertiesCplusStub(String intface, String newIntface, boolean callbackExist, Set<String> callbackClasses) {
 
                println("IoTRMICall *rmiCall;");
-               //println("IoTRMIObject\t\t\t*rmiObj;");
-               println("string address;");
+               println("string callbackAddress;");
                println("vector<int> ports;\n");
                // Get the object Id
                Integer objId = mapIntfaceObjId.get(intface);
@@ -3003,12 +3034,11 @@ public class IoTCompiler {
        private void writeConstructorCplusStub(String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
 
                println(newStubClass + 
-                       "(int _port, const char* _address, int _rev, bool* _bResult, vector<int> _ports) {");
-               println("address = _address;");
+                       "(int _port, const char* _skeletonAddress, const char* _callbackAddress, int _rev, bool* _bResult, vector<int> _ports) {");
+               println("callbackAddress = _callbackAddress;");
                println("ports = _ports;");
-               println("rmiCall = new IoTRMICall(_port, _address, _rev, _bResult);");
+               println("rmiCall = new IoTRMICall(_port, _skeletonAddress, _rev, _bResult);");
                if (callbackExist) {
-                       println("objIdCnt = 0;");
                        Iterator it = callbackClasses.iterator();
                        String callbackType = (String) it.next();
                        println("thread th1 (&" + newStubClass + "::___initCallBack, this);");
@@ -3057,10 +3087,10 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
                        println("if (set" + newObjectId + "Allowed.find(methodId) == set" + newObjectId + "Allowed.end()) {");
                        println("cerr << \"Callback object for " + intface + " is not allowed to access method: \" << methodId;");
-                       println("exit(-1);");
+                       println("return;");
                        println("}");
                }
        }
@@ -3082,10 +3112,11 @@ public class IoTCompiler {
                println(intface + "_CallbackSkeleton* skel = dynamic_cast<" + intface + 
                        "_CallbackSkeleton*> (vecCallbackObj.at(objId));");
                println("skel->invokeMethod(rmiObj);");
-               println("} else {");
+               print("}");
+               println(" else {");
                println("cerr << \"Illegal object Id: \" << to_string(objId);");
                // TODO: perhaps need to change this into "throw" to make it cleaner (allow stack unfolding)
-               println("exit(-1);");
+               println("return;");
                println("}");
                println("}");
                println("}\n");
@@ -3093,7 +3124,25 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeInitCallbackSendInfoCplusStub() writes the initialization of callback
+        * HELPER: writeCplusInitCallbackPermission() writes the permission for callback
+        */
+       private void writeCplusInitCallbackPermission(String intface, InterfaceDecl intDecl, boolean callbackExist) {
+
+               if (callbackExist) {
+                       String method = "___initCallBack()";
+                       int methodNumId = intDecl.getHelperMethodNumId(method);
+                       Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
+                       for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
+                               String newIntface = intMeth.getKey();
+                               int newObjectId = getNewIntfaceObjectId(newIntface);
+                               println("set" + newObjectId + "Allowed.insert(" + methodNumId + ");");
+                       }
+               }
+       }
+
+
+       /**
+        * HELPER: writeInitCallbackSendInfoCplusStub() writes the initialization (send info part) of callback
         */
        private void writeInitCallbackSendInfoCplusStub(InterfaceDecl intDecl) {
 
@@ -3101,11 +3150,12 @@ public class IoTCompiler {
                println("void ___regCB() {");
                println("int numParam = 3;");
                String method = "___initCallBack()";
-               println("int methodId = " + intDecl.getHelperMethodNumId(method) + ";");
+               int methodNumId = intDecl.getHelperMethodNumId(method);
+               println("int methodId = " + methodNumId + ";");
                println("string retType = \"void\";");
-               println("string paramCls[] = { \"int\", \"string\", \"int\" };");
+               println("string paramCls[] = { \"int\", \"String\", \"int\" };");
                println("int rev = 0;");
-               println("void* paramObj[] = { &ports[0], &address, &rev };");
+               println("void* paramObj[] = { &ports[0], &callbackAddress, &rev };");
                println("void* retObj = NULL;");
                println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
                println("}\n");
@@ -3153,8 +3203,15 @@ public class IoTCompiler {
                                // Write methods
                                writeMethodCplusStub(methods, intDecl, callbackClasses);
                                print("}"); println(";");
-                               if (callbackExist)
-                                       writePermissionInitializationCplus(intface, newStubClass, intDecl);
+                               if (callbackExist) {
+                                       Iterator it = callbackClasses.iterator();
+                                       String callbackType = (String) it.next();
+                                       // Generate permission stuff for callback stubs
+                                       DeclarationHandler decHandlerCallback = mapIntDeclHand.get(callbackType);
+                                       InterfaceDecl intDeclCallback = (InterfaceDecl) decHandlerCallback.getInterfaceDecl(callbackType);
+                                       writePermissionInitializationCplus(callbackType, newStubClass, intDeclCallback);
+                               }
+                               writeObjectIdCountInitializationCplus(newStubClass, callbackExist);
                                println("#endif");
                                pw.close();
                                System.out.println("IoTCompiler: Generated stub class " + newStubClass + ".hpp...");
@@ -3170,7 +3227,7 @@ public class IoTCompiler {
 
                println("IoTRMICall *rmiCall;");
                // Get the object Id
-               println("static int objectId;");
+               println("int objectId;");
                if (callbackExist) {
                // We assume that each class only has one callback interface for now
                        Iterator it = callbackClasses.iterator();
@@ -3248,8 +3305,15 @@ public class IoTCompiler {
                                // Write methods
                                writeMethodCplusStub(methods, intDecl, callbackClasses);
                                println("};");
-                               if (callbackExist)
-                                       writePermissionInitializationCplus(intface, newStubClass, intDecl);
+                               if (callbackExist) {
+                                       Iterator it = callbackClasses.iterator();
+                                       String callbackType = (String) it.next();
+                                       // Generate permission stuff for callback stubs
+                                       DeclarationHandler decHandlerCallback = mapIntDeclHand.get(callbackType);
+                                       InterfaceDecl intDeclCallback = (InterfaceDecl) decHandlerCallback.getInterfaceDecl(callbackType);
+                                       writePermissionInitializationCplus(callbackType, newStubClass, intDeclCallback);
+                               }
+                               writeObjectIdCountInitializationCplus(newStubClass, callbackExist);
                                println("#endif");
                                pw.close();
                                System.out.println("IoTCompiler: Generated callback stub class " + newIntface + ".hpp...");
@@ -3281,6 +3345,16 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeObjectIdCountInitializationCplus() writes the initialization of objIdCnt variable
+        */
+       private void writeObjectIdCountInitializationCplus(String newSkelClass, boolean callbackExist) {
+
+               if (callbackExist)
+                       println("int " + newSkelClass + "::objIdCnt = 0;");
+       }
+
+
        /**
         * HELPER: writePermissionInitializationCplus() writes the initialization of permission set
         */
@@ -3290,8 +3364,8 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
-                       print("const set<int> " + newSkelClass + "::set" + newObjectId + "Allowed {");
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
+                       print("set<int> " + newSkelClass + "::set" + newObjectId + "Allowed { ");
                        Set<String> methodIds = intMeth.getValue();
                        int i = 0;
                        for (String methodId : methodIds) {
@@ -3308,20 +3382,48 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeStructPermissionCplusSkeleton() writes permission for struct helper
+        */
+       private void writeStructPermissionCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, String intface) {
+
+               // Use this set to handle two same methodIds
+               for (String method : methods) {
+                       List<String> methParams = intDecl.getMethodParams(method);
+                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+                       // Check for params with structs
+                       for (int i = 0; i < methParams.size(); i++) {
+                               String paramType = methPrmTypes.get(i);
+                               String param = methParams.get(i);
+                               String simpleType = getGenericType(paramType);
+                               if (isStructClass(simpleType)) {
+                                       int methodNumId = intDecl.getMethodNumId(method);
+                                       String helperMethod = methodNumId + "struct" + i;
+                                       int helperMethodNumId = intDecl.getHelperMethodNumId(helperMethod);
+                                       // Iterate over interfaces to give permissions to
+                                       Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
+                                       for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
+                                               String newIntface = intMeth.getKey();
+                                               int newObjectId = getNewIntfaceObjectId(newIntface);
+                                               println("set" + newObjectId + "Allowed.insert(" + helperMethodNumId + ");");
+                                       }
+                               }
+                       }
+               }
+       }
+
+
        /**
         * HELPER: writeConstructorCplusSkeleton() writes the constructor of the skeleton class
         */
-       private void writeConstructorCplusSkeleton(String newSkelClass, String intface, boolean callbackExist) {
+       private void writeConstructorCplusSkeleton(String newSkelClass, String intface, boolean callbackExist, InterfaceDecl intDecl, Collection<String> methods) {
 
                println(newSkelClass + "(" + intface + " *_mainObj, int _port) {");
                println("bool _bResult = false;");
                println("mainObj = _mainObj;");
                println("rmiObj = new IoTRMIObject(_port, &_bResult);");
-               // Callback
-               if (callbackExist) {
-                       println("objIdCnt = 0;");
-               }
-               //println("set0Allowed = Arrays.asList(object0Permission);");
+               writeCplusInitCallbackPermission(intface, intDecl, callbackExist);
+               writeStructPermissionCplusSkeleton(methods, intDecl, intface);
                println("___waitRequestInvokeMethod();");
                println("}\n");
        }
@@ -3391,7 +3493,9 @@ public class IoTCompiler {
                println("int param1 = 0;");
                println("string param2 = \"\";");
                println("int param3 = 0;");
+               println("string paramCls[] = { \"int\", \"String\", \"int\" };");
                println("void* paramObj[] = { &param1, &param2, &param3 };");
+               println("rmiObj->getMethodParams(paramCls, numParam, paramObj);");
                println("bool bResult = false;");
                println("rmiCall = new IoTRMICall(param1, param2.c_str(), param3, &bResult);");
                println("}\n");
@@ -3404,6 +3508,7 @@ public class IoTCompiler {
        private void writeMethodCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, 
                        Set<String> callbackClasses, boolean callbackSkeleton) {
 
+               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
@@ -3433,8 +3538,10 @@ public class IoTCompiler {
                        // Now, write the body of skeleton!
                        writeStdMethodBodyCplusSkeleton(methParams, methodId, intDecl.getMethodType(method));
                        println("}\n");
-                       if (isCallbackMethod)
+                       if (isCallbackMethod && !isDefined) {
                                writeInitCallbackCplusSkeleton(callbackSkeleton);
+                               isDefined = true;
+                       }
                }
        }
 
@@ -3448,11 +3555,8 @@ public class IoTCompiler {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
                        //if (callbackType.equals(paramType)) {
-                       if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               String exchParamType = checkAndGetParamClass(paramType);
-                               // Print array if this is array or list if this is a list of callback objects
+                       if (checkCallbackType(paramType, callbackType)) // Check if this has callback object
                                println("int numStubs" + i + " = 0;");
-                       }
                }
        }
 
@@ -3468,13 +3572,13 @@ public class IoTCompiler {
                        String param = methParams.get(i);
                        // Generate a loop if needed
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
-                               String exchParamType = checkAndGetParamClass(paramType);
+                               String exchParamType = checkAndGetParamClass(getGenericType(paramType));
                                if (isArrayOrList(paramType, param)) {
-                                       println("vector<" + exchParamType + "> stub;");
+                                       println("vector<" + exchParamType + "*> stub" + i + ";");
                                        println("for (int objId = 0; objId < numStubs" + i + "; objId++) {");
                                        println(exchParamType + "* cb" + i + " = new " + exchParamType + "_CallbackStub(rmiCall, objIdCnt);");
-                                       println("stub" + i + ".push_back(cb);");
-                                       println("vecCallbackObj.push_back(cb);");
+                                       println("stub" + i + ".push_back(cb" + i + ");");
+                                       println("vecCallbackObj.push_back(cb" + i + ");");
                                        println("objIdCnt++;");
                                        println("}");
                                } else {
@@ -3496,7 +3600,7 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
                        String param = methParams.get(i);
-                       String simpleType = getSimpleType(paramType);
+                       String simpleType = getGenericType(paramType);
                        if (isEnumClass(simpleType)) {
                        // Check if this is enum type
                                if (isArrayOrList(paramType, param)) {  // An array
@@ -3520,10 +3624,10 @@ public class IoTCompiler {
        private void checkAndWriteEnumRetTypeCplusSkeleton(String retType) {
 
                // Strips off array "[]" for return type
-               String pureType = getSimpleArrayType(getSimpleType(retType));
+               String pureType = getSimpleArrayType(getGenericType(retType));
                // Take the inner type of generic
                if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
-                       pureType = getTypeOfGeneric(retType)[0];
+                       pureType = getGenericType(retType);
                if (isEnumClass(pureType)) {
                // Check if this is enum type
                        // Enum decoder
@@ -3542,7 +3646,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperReturnCplusSkeleton() writes the return value part in skeleton
+        * HELPER: writeMethodInputParameters() writes the parameter variables for C++ skeleton
         */
        private void writeMethodInputParameters(List<String> methParams, List<String> methPrmTypes, 
                        Set<String> callbackClasses, String methodId) {
@@ -3552,9 +3656,9 @@ public class IoTCompiler {
                        String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                        if (callbackClasses.contains(paramType))
                                print("stub" + i);
-                       else if (isEnumClass(getSimpleType(paramType))) // Check if this is enum type
+                       else if (isEnumClass(getGenericType(paramType)))        // Check if this is enum type
                                print("paramEnum" + i);
-                       else if (isStructClass(getSimpleType(paramType)))       // Struct type
+                       else if (isStructClass(getGenericType(paramType)))      // Struct type
                                print("paramStruct" + i);
                        else
                                print(getSimpleIdentifier(methParams.get(i)));
@@ -3567,7 +3671,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperReturnCplusSkeleton() writes the return value part in skeleton
+        * HELPER: writeMethodHelperReturnCplusSkeleton() writes the return statement part in skeleton
         */
        private void writeMethodHelperReturnCplusSkeleton(InterfaceDecl intDecl, List<String> methParams,
                        List<String> methPrmTypes, String method, boolean isCallbackMethod, String callbackType,
@@ -3584,26 +3688,26 @@ public class IoTCompiler {
                if (retType.equals("void")) {
                        writeMethodInputParameters(methParams, methPrmTypes, callbackClasses, methodId);
                } else { // We do have a return value
-                       if (isEnumClass(getSimpleArrayType(getSimpleType(retType)))) // Enum type
+                       if (isEnumClass(getSimpleArrayType(getGenericType(retType)))) // Enum type
                                print(checkAndGetCplusType(retType) + " retEnum = ");
-                       else if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+                       else if (isStructClass(getSimpleArrayType(getGenericType(retType)))) // Struct type
                                print(checkAndGetCplusType(retType) + " retStruct = ");
                        else
                                print(checkAndGetCplusType(retType) + " retVal = ");
                        writeMethodInputParameters(methParams, methPrmTypes, callbackClasses, methodId);
                        checkAndWriteEnumRetTypeCplusSkeleton(retType);
-                       if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
-                               writeStructReturnCplusSkeleton(getSimpleArrayType(getSimpleType(retType)), retType);
-                       if (isEnumClass(getSimpleArrayType(getSimpleType(retType)))) // Enum type
+                       if (isStructClass(getSimpleArrayType(getGenericType(retType)))) // Struct type
+                               writeStructReturnCplusSkeleton(getSimpleArrayType(getGenericType(retType)), retType);
+                       if (isEnumClass(getSimpleArrayType(getGenericType(retType)))) // Enum type
                                println("void* retObj = &retEnumInt;");
                        else
-                               if (!isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+                               if (!isStructClass(getSimpleArrayType(getGenericType(retType)))) // Struct type
                                        println("void* retObj = &retVal;");
                        String retTypeC = checkAndGetCplusType(retType);
-                       if (isStructClass(getSimpleArrayType(getSimpleType(retType)))) // Struct type
+                       if (isStructClass(getSimpleArrayType(getGenericType(retType)))) // Struct type
                                println("rmiObj->sendReturnObj(retObj, retCls, numRetObj);");
                        else
-                               println("rmiObj->sendReturnObj(retObj, \"" + getEnumType(checkAndGetCplusArrayType(retTypeC)) + "\");");
+                               println("rmiObj->sendReturnObj(retObj, \"" + checkAndGetCplusRetClsType(getEnumType(retType)) + "\");");
                }
        }
 
@@ -3625,9 +3729,8 @@ public class IoTCompiler {
                                callbackType = paramType;
                                print("\"int\"");
                        } else {        // Generate normal classes if it's not a callback object
-                               String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(paramTypeC, methParams.get(i));
-                               print("\"" + getEnumType(prmType) + "\"");
+                               String paramTypeC = checkAndGetCplusArgClsType(methPrmTypes.get(i), methParams.get(i));
+                               print("\"" + paramTypeC + "\"");
                        }
                        if (i != methParams.size() - 1) {
                                print(", ");
@@ -3641,12 +3744,14 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                        if (!callbackClasses.contains(paramType)) {
-                               String methPrmType = checkAndGetCplusType(methPrmTypes.get(i));
-                               if (isEnumClass(getSimpleType(methPrmType))) {  // Check if this is enum type
+                               String methParamType = methPrmTypes.get(i);
+                               if (isEnumClass(getSimpleArrayType(getGenericType(methParamType)))) {   
+                               // Check if this is enum type
                                        println("vector<int> paramEnumInt" + i + ";");
                                } else {
+                                       String methPrmType = checkAndGetCplusType(methParamType);
                                        String methParamComplete = checkAndGetCplusArray(methPrmType, methParams.get(i));
-                                       println(methParamComplete + ";");
+                    println(methParamComplete + ";");
                                }
                        }
                }
@@ -3656,7 +3761,7 @@ public class IoTCompiler {
                        String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                        if (callbackClasses.contains(paramType))
                                print("&numStubs" + i);
-                       else if (isEnumClass(getSimpleType(paramType))) // Check if this is enum type
+                       else if (isEnumClass(getGenericType(paramType)))        // Check if this is enum type
                                print("&paramEnumInt" + i);
                        else
                                print("&" + getSimpleIdentifier(methParams.get(i)));
@@ -3672,7 +3777,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructMembersCplusSkeleton() writes parameters of struct
+        * HELPER: writeStructMembersCplusSkeleton() writes member parameters of struct
         */
        private void writeStructMembersCplusSkeleton(String simpleType, String paramType, 
                        String param, String method, InterfaceDecl intDecl, int iVar) {
@@ -3683,46 +3788,42 @@ public class IoTCompiler {
                List<String> members = structDecl.getMembers(simpleType);
                int methodNumId = intDecl.getMethodNumId(method);
                String counter = "struct" + methodNumId + "Size" + iVar;
-               if (isArrayOrList(param, paramType)) {  // An array or list
-                       println("for(int i = 0; i < " + counter + "; i++) {");
-               }
                // Set up variables
-               if (isArrayOrList(param, paramType)) {  // An array or list
+               if (isArrayOrList(paramType, param)) {  // An array or list
                        for (int i = 0; i < members.size(); i++) {
                                String prmTypeC = checkAndGetCplusType(memTypes.get(i));
                                String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println(getSimpleType(getEnumType(prmType)) + " param" + i + "[" + counter + "];");
+                               println(getSimpleType(getEnumType(prmType)) + " param" + iVar + i + "[" + counter + "];");
                        }
                } else {        // Just one struct element
                        for (int i = 0; i < members.size(); i++) {
                                String prmTypeC = checkAndGetCplusType(memTypes.get(i));
                                String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println(getSimpleType(getEnumType(prmType)) + " param" + i + ";");
+                               println(getSimpleType(getEnumType(prmType)) + " param" + iVar + i + ";");
                        }
                }
-               println("int pos = 0;");
-               if (isArrayOrList(param, paramType)) {  // An array or list
-                       println("for(int i = 0; i < retLen; i++) {");
+               if (isArrayOrList(paramType, param)) {  // An array or list
+                       println("for(int i = 0; i < " + counter + "; i++) {");
+               }
+               if (isArrayOrList(paramType, param)) {  // An array or list
                        for (int i = 0; i < members.size(); i++) {
-                               String prmTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println("paramCls[pos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
-                               println("paramObj[pos++] = &param" + i + "[i];");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("paramCls[pos] = \"" + prmTypeC + "\";");
+                               println("paramObj[pos++] = &param" + iVar + i + "[i];");
                        }
                        println("}");
                } else {        // Just one struct element
                        for (int i = 0; i < members.size(); i++) {
-                               String prmTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(prmTypeC, members.get(i));
-                               println("paramCls[pos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
-                               println("paramObj[pos++] = &param" + i + ";");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("paramCls[pos] = \"" + prmTypeC + "\";");
+                               println("paramObj[pos++] = &param" + iVar + i + ";");
                        }
                }
        }
 
 
        /**
-        * HELPER: writeStructMembersInitCplusSkeleton() writes parameters of struct
+        * HELPER: writeStructMembersInitCplusSkeleton() writes member parameters initialization of struct
         */
        private void writeStructMembersInitCplusSkeleton(InterfaceDecl intDecl, List<String> methParams,
                        List<String> methPrmTypes, String method) {
@@ -3735,25 +3836,25 @@ public class IoTCompiler {
                                int methodNumId = intDecl.getMethodNumId(method);
                                String counter = "struct" + methodNumId + "Size" + i;
                                // Declaration
-                               if (isArrayOrList(param, paramType)) {  // An array or list
-                                       println("vector<" + simpleType + "> paramStruct" + i + ";");
+                               if (isArrayOrList(paramType, param)) {  // An array or list
+                                       println("vector<" + simpleType + "> paramStruct" + i + "(" + counter + ");");
                                } else
                                        println(simpleType + " paramStruct" + i + ";");
                                // Initialize members
                                StructDecl structDecl = getStructDecl(simpleType);
                                List<String> members = structDecl.getMembers(simpleType);
                                List<String> memTypes = structDecl.getMemberTypes(simpleType);
-                               if (isArrayOrList(param, paramType)) {  // An array or list
+                               if (isArrayOrList(paramType, param)) {  // An array or list
                                        println("for(int i = 0; i < " + counter + "; i++) {");
                                        for (int j = 0; j < members.size(); j++) {
                                                print("paramStruct" + i + "[i]." + getSimpleIdentifier(members.get(j)));
-                                               println(" = param" + j + "[i];");
+                                               println(" = param" + i + j + "[i];");
                                        }
                                        println("}");
                                } else {        // Just one struct element
                                        for (int j = 0; j < members.size(); j++) {
                                                print("paramStruct" + i + "." + getSimpleIdentifier(members.get(j)));
-                                               println(" = param" + j + ";");
+                                               println(" = param" + i + j + ";");
                                        }
                                }
                        }
@@ -3762,7 +3863,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeStructReturnCplusSkeleton() writes parameters if struct is present
+        * HELPER: writeStructReturnCplusSkeleton() writes parameters of struct for return statement
         */
        private void writeStructReturnCplusSkeleton(String simpleType, String retType) {
 
@@ -3785,9 +3886,8 @@ public class IoTCompiler {
                if (isArrayOrList(retType, retType)) {  // An array or list
                        println("for(int i = 0; i < retLen; i++) {");
                        for (int i = 0; i < members.size(); i++) {
-                               String paramTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(paramTypeC, members.get(i));
-                               println("retCls[retPos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("retCls[retPos] = \"" + prmTypeC + "\";");
                                print("retObj[retPos++] = &retStruct[i].");
                                print(getEnumParam(memTypes.get(i), getSimpleIdentifier(members.get(i)), i));
                                println(";");
@@ -3795,9 +3895,8 @@ public class IoTCompiler {
                        println("}");
                } else {        // Just one struct element
                        for (int i = 0; i < members.size(); i++) {
-                               String paramTypeC = checkAndGetCplusType(memTypes.get(i));
-                               String prmType = checkAndGetCplusArrayType(paramTypeC, members.get(i));
-                               println("retCls[retPos] = \"" + getSimpleType(getEnumType(prmType)) + "\";");
+                               String prmTypeC = checkAndGetCplusArgClsType(memTypes.get(i), members.get(i));
+                               println("retCls[retPos] = \"" + prmTypeC + "\";");
                                print("retObj[retPos++] = &retStruct.");
                                print(getEnumParam(memTypes.get(i), getSimpleIdentifier(members.get(i)), i));
                                println(";");
@@ -3821,6 +3920,7 @@ public class IoTCompiler {
                println(";");
                println("string paramCls[numParam];");
                println("void* paramObj[numParam];");
+               println("int pos = 0;");
                // Iterate again over the parameters
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = methPrmTypes.get(i);
@@ -3832,22 +3932,22 @@ public class IoTCompiler {
                                String prmType = returnGenericCallbackType(methPrmTypes.get(i));
                                if (callbackClasses.contains(prmType)) {
                                        isCallbackMethod = true;
-                                       callbackType = paramType;
-                                       writeCallbackCplusNumStubs(methParams, methPrmTypes, callbackType);
+                                       callbackType = prmType;
+                                       println("int numStubs" + i + " = 0;");
                                        println("paramCls[pos] = \"int\";");
                                        println("paramObj[pos++] = &numStubs" + i + ";");
                                } else {        // Generate normal classes if it's not a callback object
                                        String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
-                                       String prmTypeC = checkAndGetCplusArrayType(paramTypeC, methParams.get(i));
-                                       if (isEnumClass(getSimpleType(paramTypeC))) {   // Check if this is enum type
+                                       if (isEnumClass(getGenericType(paramTypeC))) {  // Check if this is enum type
                                                println("vector<int> paramEnumInt" + i + ";");
                                        } else {
                                                String methParamComplete = checkAndGetCplusArray(paramTypeC, methParams.get(i));
                                                println(methParamComplete + ";");
                                        }
-                                       println("paramCls[pos] = \"" + getEnumType(prmTypeC) + "\";");
-                                       if (isEnumClass(getSimpleType(paramType)))      // Check if this is enum type
-                                               println("paramObj[pos++] = &paramEnumInt" + i);
+                                       String prmTypeC = checkAndGetCplusArgClsType(methPrmTypes.get(i), methParams.get(i));
+                                       println("paramCls[pos] = \"" + prmTypeC + "\";");
+                                       if (isEnumClass(getGenericType(paramType)))     // Check if this is enum type
+                                               println("paramObj[pos++] = &paramEnumInt" + i + ";");
                                        else
                                                println("paramObj[pos++] = &" + getSimpleIdentifier(methParams.get(i)) + ";");
                                }
@@ -3884,11 +3984,12 @@ public class IoTCompiler {
                                for (int i = 0; i < methParams.size(); i++) { // Print size variables
                                        String paramType = methPrmTypes.get(i);
                                        String param = methParams.get(i);
-                                       String simpleType = getSimpleType(paramType);
+                                       String simpleType = getGenericType(paramType);
                                        if (isStructClass(simpleType)) {
-                                               if (!begin) {   // Generate comma for not the beginning variable
-                                                       print(", "); begin = false;
-                                               }
+                                               if (!begin)     // Generate comma for not the beginning variable
+                                                       print(", ");
+                                               else
+                                                       begin = false;
                                                int methodNumId = intDecl.getMethodNumId(method);
                                                print("int struct" + methodNumId + "Size" + i);
                                        }
@@ -3918,7 +4019,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperStructSetupCplusSkeleton() writes the method helper of the struct in skeleton class
+        * HELPER: writeMethodHelperStructSetupCplusSkeleton() writes the method helper of struct in skeleton class
         */
        private void writeMethodHelperStructSetupCplusSkeleton(Collection<String> methods, 
                        InterfaceDecl intDecl) {
@@ -3932,7 +4033,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = methPrmTypes.get(i);
                                String param = methParams.get(i);
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
                                        print("int ___");
@@ -3953,7 +4054,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperStructSetupCplusCallbackSkeleton() writes the method helper of the struct in skeleton class
+        * HELPER: writeMethodHelperStructSetupCplusCallbackSkeleton() writes the method helper of struct in skeleton class
         */
        private void writeMethodHelperStructSetupCplusCallbackSkeleton(Collection<String> methods, 
                        InterfaceDecl intDecl) {
@@ -3967,7 +4068,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = methPrmTypes.get(i);
                                String param = methParams.get(i);
-                               String simpleType = getSimpleType(paramType);
+                               String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
                                        print("int ___");
@@ -3996,16 +4097,16 @@ public class IoTCompiler {
                Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
-                       int newObjectId = mapNewIntfaceObjId.get(newIntface);
+                       int newObjectId = getNewIntfaceObjectId(newIntface);
                        println("if (_objectId == object" + newObjectId + "Id) {");
                        println("if (set" + newObjectId + "Allowed.find(methodId) == set" + newObjectId + "Allowed.end()) {");
                        println("cerr << \"Object with object Id: \" << _objectId << \"  is not allowed to access method: \" << methodId << endl;");
-                       println("exit(-1);");
+                       println("return;");
+                       println("}");
                        println("}");
                        println("else {");
                        println("cerr << \"Object Id: \" << _objectId << \" not recognized!\" << endl;");
-                       println("exit(-1);");
-                       println("}");
+                       println("return;");
                        println("}");
                }
        }
@@ -4094,7 +4195,7 @@ public class IoTCompiler {
                        writePropertiesCplusSkeleton(intface, callbackExist, callbackClasses);
                        println("public:\n");
                        // Write constructor
-                       writeConstructorCplusSkeleton(newSkelClass, intface, callbackExist);
+                       writeConstructorCplusSkeleton(newSkelClass, intface, callbackExist, intDecl, methods);
                        // Write deconstructor
                        writeDeconstructorCplusSkeleton(newSkelClass, callbackExist, callbackClasses);
                        // Write methods
@@ -4105,6 +4206,7 @@ public class IoTCompiler {
                        writeCplusWaitRequestInvokeMethod(methods, intDecl, callbackExist, intface);
                        println("};");
                        writePermissionInitializationCplus(intface, newSkelClass, intDecl);
+                       writeObjectIdCountInitializationCplus(newSkelClass, callbackExist);
                        println("#endif");
                        pw.close();
                        System.out.println("IoTCompiler: Generated skeleton class " + newSkelClass + ".hpp...");
@@ -4119,7 +4221,7 @@ public class IoTCompiler {
 
                println(intface + " *mainObj;");
                // Keep track of object Ids of all stubs registered to this interface
-               println("static int objectId;");
+               println("int objectId;");
                // Callback
                if (callbackExist) {
                        Iterator it = callbackClasses.iterator();
@@ -4137,15 +4239,11 @@ public class IoTCompiler {
        /**
         * HELPER: writeConstructorCplusCallbackSkeleton() writes the constructor of the skeleton class
         */
-       private void writeConstructorCplusCallbackSkeleton(String newSkelClass, String intface, boolean callbackExist) {
+       private void writeConstructorCplusCallbackSkeleton(String newSkelClass, String intface, boolean callbackExist, InterfaceDecl intDecl, Collection<String> methods) {
 
                println(newSkelClass + "(" + intface + " *_mainObj, int _objectId) {");
                println("mainObj = _mainObj;");
                println("objectId = _objectId;");
-               // Callback
-               if (callbackExist) {
-                       println("objIdCnt = 0;");
-               }
                println("}\n");
        }
 
@@ -4177,7 +4275,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperCplusCallbackSkeleton() writes the method helper of the callback skeleton class
+        * HELPER: writeMethodHelperCplusCallbackSkeleton() writes the method helper of callback skeleton class
         */
        private void writeMethodHelperCplusCallbackSkeleton(Collection<String> methods, InterfaceDecl intDecl, 
                        Set<String> callbackClasses) {
@@ -4202,11 +4300,12 @@ public class IoTCompiler {
                                for (int i = 0; i < methParams.size(); i++) { // Print size variables
                                        String paramType = methPrmTypes.get(i);
                                        String param = methParams.get(i);
-                                       String simpleType = getSimpleType(paramType);
+                                       String simpleType = getGenericType(paramType);
                                        if (isStructClass(simpleType)) {
-                                               if (!begin) {   // Generate comma for not the beginning variable
-                                                       print(", "); begin = false;
-                                               }
+                                               if (!begin)     // Generate comma for not the beginning variable
+                                                       print(", ");
+                                               else
+                                                       begin = false;
                                                int methodNumId = intDecl.getMethodNumId(method);
                                                print("int struct" + methodNumId + "Size" + i);
                                        }
@@ -4236,7 +4335,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeCplusCallbackWaitRequestInvokeMethod() writes the main loop of the skeleton class
+        * HELPER: writeCplusCallbackWaitRequestInvokeMethod() writes the request invoke method of the skeleton callback class
         */
        private void writeCplusCallbackWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, 
                        boolean callbackExist) {
@@ -4281,7 +4380,6 @@ public class IoTCompiler {
        }
 
 
-
        /**
         * generateCplusCallbackSkeletonClass() generate callback skeletons based on the methods list in C++
         */
@@ -4318,7 +4416,7 @@ public class IoTCompiler {
                        writePropertiesCplusCallbackSkeleton(intface, callbackExist, callbackClasses);
                        println("public:\n");
                        // Write constructor
-                       writeConstructorCplusCallbackSkeleton(newSkelClass, intface, callbackExist);
+                       writeConstructorCplusCallbackSkeleton(newSkelClass, intface, callbackExist, intDecl, methods);
                        // Write deconstructor
                        writeDeconstructorCplusCallbackSkeleton(newSkelClass, callbackExist, callbackClasses);
                        // Write methods
@@ -4328,6 +4426,7 @@ public class IoTCompiler {
                        // Write waitRequestInvokeMethod() - main loop
                        writeCplusCallbackWaitRequestInvokeMethod(methods, intDecl, callbackExist);
                        println("};");
+                       writeObjectIdCountInitializationCplus(newSkelClass, callbackExist);
                        println("#endif");
                        pw.close();
                        System.out.println("IoTCompiler: Generated callback skeleton class " + newSkelClass + ".hpp...");
@@ -4365,35 +4464,6 @@ public class IoTCompiler {
        }
 
 
-       /**
-        * generateReturnStmt() generate return statement based on methType
-        */
-       public String generateReturnStmt(String methType) {
-
-               // Generate dummy returns for now
-               if (methType.equals("short")||
-                       methType.equals("int")  ||
-                       methType.equals("long") ||
-                       methType.equals("float")||
-                       methType.equals("double")) {
-
-                       return "1";
-               } else if ( methType.equals("String")) {
-  
-                       return "\"a\"";
-               } else if ( methType.equals("char") ||
-                                       methType.equals("byte")) {
-
-                       return "\'a\'";
-               } else if ( methType.equals("boolean")) {
-
-                       return "true";
-               } else {
-                       return "null";
-               }
-       }
-
-
        /**
         * setDirectory() sets a new directory for stub files
         */
@@ -4439,7 +4509,7 @@ public class IoTCompiler {
                        pn = (ParseNode) parse.parse().value;
                } catch (Exception e) {
                        e.printStackTrace();
-                       throw new Error("IoTCompiler: ERROR parsing policy file or wrong command line option: " + file);
+                       throw new Error("IoTCompiler: ERROR parsing policy file or wrong command line option: " + file + "\n");
                }
 
                return pn;
@@ -4447,7 +4517,7 @@ public class IoTCompiler {
 
 
        /**================
-        * Helper functions
+        * Basic helper functions
         **================
         */
        boolean newline=true;
@@ -4470,12 +4540,18 @@ public class IoTCompiler {
        /**
         * This function converts Java to C++ type for compilation
         */
-       private String convertType(String jType) {
+       private String convertType(String type) {
 
-               return mapPrimitives.get(jType);
+               if (mapPrimitives.containsKey(type))
+                       return mapPrimitives.get(type);
+               else
+                       return type;
        }
 
 
+       /**
+        * A collection of methods with print-to-file functionality
+        */
        private void println(String str) {
                if (newline) {
                        int tab = tablevel;
@@ -4546,7 +4622,22 @@ public class IoTCompiler {
        }
 
 
-       // Return parameter category, i.e. PRIMITIVES, NONPRIMITIVES, or USERDEFINED
+       // Check and find object Id for new interface in mapNewIntfaceObjId (callbacks)
+       // Throw an error if the new interface is not found!
+       // Basically the compiler needs to parse the policy (and requires) files for callback class first
+       private int getNewIntfaceObjectId(String newIntface) {
+
+               if (!mapNewIntfaceObjId.containsKey(newIntface)) {
+                       throw new Error("IoTCompiler: Need to parse policy and requires files for callback class first! " +
+                                                       "Please place the two files for callback class in front...\n");
+               } else {
+                       int retObjId = mapNewIntfaceObjId.get(newIntface);
+                       return retObjId;
+               }
+       }
+
+
+       // Return parameter category, i.e. PRIMITIVES, NONPRIMITIVES, USERDEFINED, ENUM, or STRUCT
        private ParamCategory getParamCategory(String paramType) {
 
                if (mapPrimitives.containsKey(paramType)) {
@@ -4564,7 +4655,7 @@ public class IoTCompiler {
 
 
        // Return full class name for non-primitives to generate Java import statements
-       // e.g. java.util.Set for Set, java.util.Map for Map
+       // e.g. java.util.Set for Set
        private String getNonPrimitiveJavaClass(String paramNonPrimitives) {
 
                return mapNonPrimitivesJava.get(paramNonPrimitives);
@@ -4572,7 +4663,7 @@ public class IoTCompiler {
 
 
        // Return full class name for non-primitives to generate Cplus include statements
-       // e.g. #include <set> for Set, #include <map> for Map
+       // e.g. #include <set> for Set
        private String getNonPrimitiveCplusClass(String paramNonPrimitives) {
 
                return mapNonPrimitivesCplus.get(paramNonPrimitives);
@@ -4592,6 +4683,18 @@ public class IoTCompiler {
        }
 
 
+       // Generate a set of standard classes for import statements
+       private List<String> getStandardJavaIntfaceImportClasses() {
+
+               List<String> importClasses = new ArrayList<String>();
+               // Add the standard list first
+               importClasses.add("java.util.List");
+               importClasses.add("java.util.ArrayList");
+
+               return importClasses;
+       }
+
+
        // Generate a set of standard classes for import statements
        private List<String> getStandardJavaImportClasses() {
 
@@ -4622,7 +4725,7 @@ public class IoTCompiler {
        }
 
 
-       // Generate a set of standard classes for import statements
+       // Combine all classes for import statements
        private List<String> getAllLibClasses(Collection<String> stdLibClasses, Collection<String> libClasses) {
 
                List<String> allLibClasses = new ArrayList<String>(stdLibClasses);
@@ -4632,7 +4735,6 @@ public class IoTCompiler {
                                allLibClasses.add(str);
                        }
                }
-
                return allLibClasses;
        }
 
@@ -4696,7 +4798,7 @@ public class IoTCompiler {
                String pureType = getSimpleArrayType(type);
                // Take the inner type of generic
                if (getParamCategory(type) == ParamCategory.NONPRIMITIVES)
-                       pureType = getTypeOfGeneric(type)[0];
+                       pureType = getGenericType(type);
                if (isEnumClass(pureType)) {
                        String enumType = "int[]";
                        return enumType;
@@ -4704,6 +4806,21 @@ public class IoTCompiler {
                        return type;
        }
 
+       // Handle and return the correct enum declaration translate into int* for C
+       private String getEnumCplusClsType(String type) {
+
+               // Strips off array "[]" for return type
+               String pureType = getSimpleArrayType(type);
+               // Take the inner type of generic
+               if (getParamCategory(type) == ParamCategory.NONPRIMITIVES)
+                       pureType = getGenericType(type);
+               if (isEnumClass(pureType)) {
+                       String enumType = "int*";
+                       return enumType;
+               } else
+                       return type;
+       }
+
 
        // Handle and return the correct struct declaration
        private String getStructType(String type) {
@@ -4712,7 +4829,7 @@ public class IoTCompiler {
                String pureType = getSimpleArrayType(type);
                // Take the inner type of generic
                if (getParamCategory(type) == ParamCategory.NONPRIMITIVES)
-                       pureType = getTypeOfGeneric(type)[0];
+                       pureType = getGenericType(type);
                if (isStructClass(pureType)) {
                        String structType = "int";
                        return structType;
@@ -4844,6 +4961,7 @@ public class IoTCompiler {
        }
 
 
+       // Print import statements into file
        private void printImportStatements(Collection<String> importClasses) {
 
                for(String cls : importClasses) {
@@ -4852,6 +4970,7 @@ public class IoTCompiler {
        }
 
 
+       // Print include statements into file
        private void printIncludeStatements(Collection<String> includeClasses) {
 
                for(String cls : includeClasses) {
@@ -4907,6 +5026,7 @@ public class IoTCompiler {
        }
 
 
+       // Checks and gets type in C++
        private String checkAndGetCplusType(String paramType) {
 
                if (getParamCategory(paramType) == ParamCategory.PRIMITIVES) {
@@ -4917,26 +5037,25 @@ public class IoTCompiler {
                        if (paramType.contains("<") && paramType.contains(">")) {
 
                                String genericClass = getSimpleType(paramType);
-                               String[] genericType = getTypeOfGeneric(paramType);
+                               String genericType = getGenericType(paramType);
                                String cplusTemplate = null;
-                               if (genericType.length == 1) // Generic/template with one type
-                                       cplusTemplate = getNonPrimitiveCplusClass(genericClass) + 
-                                               "<" + convertType(genericType[0]) + ">";
-                               else // Generic/template with two types
-                                       cplusTemplate = getNonPrimitiveCplusClass(genericClass) + 
-                                               "<" + convertType(genericType[0]) + "," + convertType(genericType[1]) + ">";
+                               cplusTemplate = getNonPrimitiveCplusClass(genericClass);
+                               if(getParamCategory(getGenericType(paramType)) == ParamCategory.USERDEFINED) {
+                                       cplusTemplate = cplusTemplate + "<" + genericType + "*>";
+                               } else {
+                                       cplusTemplate = cplusTemplate + "<" + convertType(genericType) + ">";
+                               }
                                return cplusTemplate;
                        } else
                                return getNonPrimitiveCplusClass(paramType);
                } else if(paramType.contains("[]")) {   // Array type (used for return type only)
-                       String cArray = "vector<" + getSimpleArrayType(paramType) + ">";
+                       String cArray = "vector<" + convertType(getSimpleArrayType(paramType)) + ">";
                        return cArray;
                } else if(getParamCategory(paramType) == ParamCategory.USERDEFINED) {
                        return paramType + "*";
                } else
                        // Just return it as is if it's not non-primitives
                        return paramType;
-                       //return checkAndGetParamClass(paramType, true);
        }
 
 
@@ -4997,6 +5116,52 @@ public class IoTCompiler {
        }
 
 
+       // Return the class type for class resolution (for return value)
+       // - Check and return C++ array class, e.g. int A[] into int*
+       // - Check and return C++ vector class, e.g. List<Integer> A into vector<int>
+       private String checkAndGetCplusRetClsType(String paramType) {
+
+               String paramTypeRet = null;
+               // Check for array declaration
+               if (paramType.contains("[]")) {
+                       String type = paramType.split("\\[\\]")[0];
+                       paramTypeRet = getSimpleArrayType(type) + "*";
+               } else if (paramType.contains("<") && paramType.contains(">")) {
+                       // Just return it as is if it's not an array
+                       String type = paramType.split("<")[1].split(">")[0];
+                       paramTypeRet = "vector<" + getGenericType(type) + ">";
+               } else
+                       paramTypeRet = paramType;
+
+               return paramTypeRet;
+       }
+
+
+       // Return the class type for class resolution (for method arguments)
+       // - Check and return C++ array class, e.g. int A[] into int*
+       // - Check and return C++ vector class, e.g. List<Integer> A into vector<int>
+       private String checkAndGetCplusArgClsType(String paramType, String param) {
+
+               String paramTypeRet = getEnumCplusClsType(paramType);
+               if (!paramTypeRet.equals(paramType)) 
+               // Just return if it is an enum type
+               // Type will still be the same if it's not an enum type
+                       return paramTypeRet;
+
+               // Check for array declaration
+               if (param.contains("[]")) {
+                       paramTypeRet = getSimpleArrayType(paramType) + "*";
+               } else if (paramType.contains("<") && paramType.contains(">")) {
+                       // Just return it as is if it's not an array
+                       String type = paramType.split("<")[1].split(">")[0];
+                       paramTypeRet = "vector<" + getGenericType(type) + ">";
+               } else
+                       paramTypeRet = paramType;
+
+               return paramTypeRet;
+       }
+
+
        // Detect array declaration, e.g. int A[],
        //              then generate type "int[]"
        private String checkAndGetArray(String paramType, String param) {
@@ -5026,7 +5191,8 @@ public class IoTCompiler {
        }
 
 
-       // Is array? For return type we put the return type as input parameter
+       // Is array? 
+       // For return type we use retType as input parameter
        private boolean isArray(String param) {
 
                // Check for array declaration
@@ -5054,6 +5220,9 @@ public class IoTCompiler {
                // Check if this is generics
                if(getParamCategory(paramType) == ParamCategory.USERDEFINED) {
                        return exchangeParamType(paramType);
+               } else if (isList(paramType) &&
+                               (getParamCategory(getGenericType(paramType)) == ParamCategory.USERDEFINED)) {
+                       return "List<" + exchangeParamType(getGenericType(paramType)) + ">";
                } else
                        return paramType;
        }
@@ -5077,7 +5246,7 @@ public class IoTCompiler {
                        } else {
                                throw new Error("IoTCompiler: Ambiguous stub interfaces: " + setExchInt.toString() + 
                                        ". Only one new interface can be declared if the object " + intface +
-                                       " needs to be passed in as an input parameter!");
+                                       " needs to be passed in as an input parameter!\n");
                        }
                } else {
                // NULL value - this means policy files missing
@@ -5086,7 +5255,7 @@ public class IoTCompiler {
                                " If this is an array please type the brackets after the variable name," +
                                " e.g. \"String str[]\", not \"String[] str\"." +
                                " If this is a Collections (Java) / STL (C++) type, this compiler only" +
-                               " supports List/ArrayList (Java) or list (C++).");
+                               " supports List/ArrayList (Java) or list (C++).\n");
                }
        }
 
@@ -5145,12 +5314,12 @@ public class IoTCompiler {
                                        // Error checking
                                        if (!args[i].equals("-java") &&
                                                !args[i].equals("-cplus")) {
-                                               throw new Error("IoTCompiler: ERROR - unrecognized command line option: " + args[i]);
+                                               throw new Error("IoTCompiler: ERROR - unrecognized command line option: " + args[i] + "\n");
                                        } else {
                                                if (i + 1 < args.length) {
                                                        comp.setDirectory(args[i+1]);
                                                } else
-                                                       throw new Error("IoTCompiler: ERROR - please provide <directory> after option: " + args[i]);
+                                                       throw new Error("IoTCompiler: ERROR - please provide <directory> after option: " + args[i] + "\n");
 
                                                if (args[i].equals("-java")) {
                                                        comp.generateEnumJava();
@@ -5178,11 +5347,9 @@ public class IoTCompiler {
                } else {
                // Need to at least have exactly 2 parameters, i.e. main policy file and requires file
                        IoTCompiler.printUsage();
-                       throw new Error("IoTCompiler: At least two arguments (main and requires policy files) have to be provided!");
+                       throw new Error("IoTCompiler: At least two arguments (main and requires policy files) have to be provided!\n");
                }
        }
 }
 
 
-
-