Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/iot2
[iot2.git] / iotjava / iotpolicy / IoTCompiler.java
index c0e932a7d0a42355ceec45759ef3f6f072e69fae..a1144919e47a8f3e8e62be71e4fb692d9fe7c4f5 100644 (file)
@@ -48,6 +48,7 @@ public class IoTCompiler {
        private Map<String,ParseTreeHandler> mapIntfacePTH;
        private Map<String,DeclarationHandler> mapIntDeclHand;
        private Map<String,Map<String,Set<String>>> mapInt2NewInts;
+       private Map<String,String> mapInt2NewIntName;
        // Data structure to store our types (primitives and non-primitives) for compilation
        private Map<String,String> mapPrimitives;
        private Map<String,String> mapNonPrimitivesJava;
@@ -58,6 +59,10 @@ public class IoTCompiler {
        private PrintWriter pw;
        private String dir;
        private String subdir;
+       private Map<String,Integer> mapPortCount;       // Counter for ports
+       private static int portCount = 0;
+       private static int countObjId = 1;                      // Always increment object Id for a new stub/skeleton
+       private String mainClass;
 
 
        /**
@@ -83,6 +88,7 @@ public class IoTCompiler {
                mapIntfacePTH = new HashMap<String,ParseTreeHandler>();
                mapIntDeclHand = new HashMap<String,DeclarationHandler>();
                mapInt2NewInts = new HashMap<String,Map<String,Set<String>>>();
+               mapInt2NewIntName = new HashMap<String,String>();
                mapIntfaceObjId = new HashMap<String,Integer>();
                mapNewIntfaceObjId = new HashMap<String,Integer>();
                mapPrimitives = new HashMap<String,String>();
@@ -91,9 +97,11 @@ public class IoTCompiler {
                        arraysToMap(mapNonPrimitivesJava, IoTRMITypes.nonPrimitivesJava, IoTRMITypes.nonPrimitiveJavaLibs);
                mapNonPrimitivesCplus = new HashMap<String,String>();
                        arraysToMap(mapNonPrimitivesCplus, IoTRMITypes.nonPrimitivesJava, IoTRMITypes.nonPrimitivesCplus);
+               mapPortCount = new HashMap<String,Integer>();
                pw = null;
                dir = OUTPUT_DIRECTORY;
                subdir = null;
+               mainClass = null;
        }
 
 
@@ -136,7 +144,7 @@ public class IoTCompiler {
                mapIntfacePTH.put(origInt, ptHandler);
                mapIntDeclHand.put(origInt, decHandler);
                // Set object Id counter to 0 for each interface
-               mapIntfaceObjId.put(origInt, new Integer(0));
+               mapIntfaceObjId.put(origInt, countObjId++);
        }
 
 
@@ -177,11 +185,20 @@ public class IoTCompiler {
                        }
                        // Add interface and methods information into map
                        mapNewIntMethods.put(strInt, setMethods);
+                       // Map new interface method name to the original interface
+                       // TODO: perhaps need to check in the future if we have more than 1 stub interface for one original interface
+                       mapInt2NewIntName.put(origInt, strInt);
+                       if (mainClass == null)  // Take the first class as the main class (whichever is placed first in the order of compilation files)
+                               mainClass = origInt;
                }
                // Map the map of interface-methods to the original interface
                mapInt2NewInts.put(origInt, mapNewIntMethods);
        }
 
+       
+/*================
+ * Java generation
+ *================/
 
        /**
         * HELPER: writeMethodJavaLocalInterface() writes the method of the local interface
@@ -342,6 +359,17 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: updateIntfaceObjIdMap() updates the mapping between new interface and object Id
+        */
+       private void updateIntfaceObjIdMap(String intface, String newIntface) {
+
+               // We are assuming that we only generate one stub per one skeleton at this point @Feb 2017
+               Integer objId = mapIntfaceObjId.get(intface);
+               mapNewIntfaceObjId.put(newIntface, objId);
+       }
+
+
        /**
         * generateJavaInterfaces() generate stub interfaces based on the methods list in Java
         */
@@ -361,7 +389,7 @@ public class IoTCompiler {
                                DeclarationHandler decHandler = mapIntDeclHand.get(intface);
                                InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
                                // Pass in set of methods and get import classes
-                               List<String> methods = intDecl.getMethods();
+                               Set<String> methods = intMeth.getValue();
                                Set<String> importClasses = getImportClasses(methods, intDecl);
                                List<String> stdImportClasses = getStandardJavaIntfaceImportClasses();
                                List<String> allImportClasses = getAllLibClasses(stdImportClasses, importClasses);
@@ -369,6 +397,7 @@ public class IoTCompiler {
                                // Write interface header
                                println("");
                                println("public interface " + newIntface + " {\n");
+                               updateIntfaceObjIdMap(intface, newIntface);
                                // Write methods
                                writeMethodJavaInterface(methods, intDecl);
                                println("}");
@@ -388,8 +417,8 @@ public class IoTCompiler {
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
                        int newObjectId = getNewIntfaceObjectId(newIntface);
-                       println("private final static int object" + newObjectId + "Id = " + 
-                               newObjectId + ";\t//" + newIntface);
+                       //println("private final static int object" + newObjectId + "Id = " + 
+                       //      newObjectId + ";\t//" + newIntface);
                        Set<String> methodIds = intMeth.getValue();
                        print("private static Integer[] object" + newObjectId + "Permission = { ");
                        int i = 0;
@@ -411,28 +440,21 @@ public class IoTCompiler {
        /**
         * HELPER: writePropertiesJavaStub() writes the properties of the stub class
         */
-       private void writePropertiesJavaStub(String intface, String newIntface, boolean callbackExist, Set<String> callbackClasses) {
+       private void writePropertiesJavaStub(String intface, Set<String> methods, InterfaceDecl intDecl) {
 
-               println("private IoTRMICall rmiCall;");
-               println("private String callbackAddress;");
-               println("private int[] ports;\n");
                // Get the object Id
                Integer objId = mapIntfaceObjId.get(intface);
-               println("private final static int objectId = " + objId + ";");
-               mapNewIntfaceObjId.put(newIntface, objId);
-               mapIntfaceObjId.put(intface, objId++);
-               if (callbackExist) {
-               // We assume that each class only has one callback interface for now
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       println("// Callback properties");
-                       println("private IoTRMIObject rmiObj;");
-                       println("List<" + callbackType + "> listCallbackObj;");
-                       println("private static int objIdCnt = 0;");
-                       // Generate permission stuff for callback stubs
-                       DeclarationHandler decHandler = mapIntDeclHand.get(callbackType);
-                       InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(callbackType);
-                       writePropertiesJavaPermission(callbackType, intDecl);
+               println("private int objectId = " + objId + ";");
+               println("private IoTRMIComm rmiComm;");
+               // Write the list of AtomicBoolean variables
+               println("// Synchronization variables");
+               for (String method : methods) {
+                       // Generate AtomicBooleans for methods that have return values
+                       String returnType = intDecl.getMethodType(method);
+                       int methodNumId = intDecl.getMethodNumId(method);
+                       if (!returnType.equals("void")) {
+                               println("private AtomicBoolean retValueReceived" + methodNumId + " = new AtomicBoolean(false);");
+                       }
                }
                println("\n");
        }
@@ -455,99 +477,58 @@ public class IoTCompiler {
        /**
         * HELPER: writeConstructorJavaStub() writes the constructor of the stub class
         */
-       private void writeConstructorJavaStub(String intface, String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
+       private void writeConstructorJavaStub(String intface, String newStubClass, Set<String> methods, InterfaceDecl intDecl) {
 
-               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, _skeletonAddress, _rev);");
-               if (callbackExist) {
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       writeConstructorJavaPermission(intface);
-                       println("listCallbackObj = new ArrayList<" + callbackType + ">();");
-                       println("___initCallBack();");
+               println("public " + newStubClass + "(int _localPortSend, int _localPortRecv, int _portSend, int _portRecv, String _skeletonAddress, int _rev) throws Exception {");
+               println("if (_localPortSend != 0 && _localPortRecv != 0) {");
+               println("rmiComm = new IoTRMICommClient(_localPortSend, _localPortRecv, _portSend, _portRecv, _skeletonAddress, _rev);");
+               println("} else");
+               println("{");
+               println("rmiComm = new IoTRMICommClient(_portSend, _portRecv, _skeletonAddress, _rev);");
+               println("}");
+               // Register the AtomicBoolean variables
+               for (String method : methods) {
+                       // Generate AtomicBooleans for methods that have return values
+                       String returnType = intDecl.getMethodType(method);
+                       int methodNumId = intDecl.getMethodNumId(method);
+                       if (!returnType.equals("void")) {
+                               println("rmiComm.registerStub(objectId, " + methodNumId + ", retValueReceived" + methodNumId + ");");
+                       }
                }
+               println("IoTRMIUtil.mapStub.put(objectId, this);");
                println("}\n");
        }
 
 
        /**
-        * HELPER: writeJavaMethodCallbackPermission() writes permission checks in stub for callbacks
-        */
-       private void writeJavaMethodCallbackPermission(String intface) {
-
-               println("int methodId = IoTRMIObject.getMethodId(method);");
-               // Get all the different stubs
-               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("if (!set" + newObjectId + "Allowed.contains(methodId)) {");
-                       println("throw new Error(\"Callback object for " + intface + " is not allowed to access method: \" + methodId);");
-                       println("}");
-               }
-       }
-
-
-       /**
-        * HELPER: writeJavaInitCallbackPermission() writes the permission for callback
+        * HELPER: writeCallbackConstructorJavaStub() writes the callback constructor of the stub class
         */
-       private void writeJavaInitCallbackPermission(String intface, InterfaceDecl intDecl, boolean callbackExist) {
+       private void writeCallbackConstructorJavaStub(String intface, String newStubClass, Set<String> methods, InterfaceDecl intDecl) {
 
-               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 + ");");
+               println("public " + newStubClass + "(IoTRMIComm _rmiComm, int _objectId) throws Exception {");
+               println("rmiComm = _rmiComm;");
+               println("objectId = _objectId;");
+               // Register the AtomicBoolean variables
+               for (String method : methods) {
+                       // Generate AtomicBooleans for methods that have return values
+                       String returnType = intDecl.getMethodType(method);
+                       int methodNumId = intDecl.getMethodNumId(method);
+                       if (!returnType.equals("void")) {
+                               println("rmiComm.registerStub(objectId, " + methodNumId + ", retValueReceived" + methodNumId + ");");
                        }
                }
+               println("}\n");
        }
 
 
        /**
-        * HELPER: writeInitCallbackJavaStub() writes callback initialization in stub
+        * HELPER: getPortCount() gets port count for different stubs and skeletons
         */
-       private void writeInitCallbackJavaStub(String intface, InterfaceDecl intDecl) {
+       private int getPortCount(String intface) {
 
-               println("public void ___initCallBack() {");
-               // Generate main thread for callbacks
-               println("Thread thread = new Thread() {");
-               println("public void run() {");
-               println("try {");
-               println("rmiObj = new IoTRMIObject(ports[0]);");
-               println("while (true) {");
-               println("byte[] method = rmiObj.getMethodBytes();");
-               writeJavaMethodCallbackPermission(intface);
-               println("int objId = IoTRMIObject.getObjectId(method);");
-               println(intface + "_CallbackSkeleton skel = (" + intface + "_CallbackSkeleton) listCallbackObj.get(objId);");
-               println("if (skel != null) {");
-               println("skel.invokeMethod(rmiObj);");
-               print("}");
-               println(" else {");
-               println("throw new Error(\"" + intface + ": Object with Id \" + objId + \" not found!\");");
-               println("}");
-               println("}");
-               print("}");
-               println(" catch (Exception ex) {");
-               println("ex.printStackTrace();");
-               println("throw new Error(\"Error instantiating class " + intface + "_CallbackSkeleton!\");");
-               println("}");
-               println("}");
-               println("};");
-               println("thread.start();\n");
-               // Generate info sending part
-               String method = "___initCallBack()";
-               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], callbackAddress, 0 };");
-               println("rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
-               println("}\n");
+               if (!mapPortCount.containsKey(intface))
+                       mapPortCount.put(intface, portCount++);
+               return mapPortCount.get(intface);
        }
 
 
@@ -587,8 +568,10 @@ public class IoTCompiler {
        /**
         * HELPER: checkAndWriteEnumRetTypeJavaStub() writes the enum return type (convert from enum to int)
         */
-       private void checkAndWriteEnumRetTypeJavaStub(String retType) {
+       private void checkAndWriteEnumRetTypeJavaStub(String retType, String method, InterfaceDecl intDecl) {
 
+               // Write the wait-for-return-value part
+               writeWaitForReturnValueJava(method, intDecl, "Object retObj = rmiComm.getReturnValue(retType, null);");
                // Strips off array "[]" for return type
                String pureType = getSimpleArrayType(getGenericType(retType));
                // Take the inner type of generic
@@ -635,7 +618,6 @@ public class IoTCompiler {
                                int methodNumId = intDecl.getMethodNumId(method);
                                String helperMethod = methodNumId + "struct" + i;
                                println("int methodIdStruct" + i + " = " + intDecl.getHelperMethodNumId(helperMethod) + ";");
-                               println("Class<?> retTypeStruct" + i + " = void.class;");
                                println("Class<?>[] paramClsStruct" + i + " = new Class<?>[] { int.class };");
                                if (isArray(param)) {   // An array
                                        println("Object[] paramObjStruct" + i + " = new Object[] { " + getSimpleArrayType(param) + ".length };");
@@ -644,9 +626,8 @@ public class IoTCompiler {
                                } else {        // Just one element
                                        println("Object[] paramObjStruct" + i + " = new Object[] { new Integer(1) };");
                                }
-                               println("rmiCall.remoteCall(objectId, methodIdStruct" + i + 
-                                               ", retTypeStruct" + i + ", null, paramClsStruct" + i + 
-                                               ", paramObjStruct" + i + ");\n");
+                               println("rmiComm.remoteCall(objectId, methodIdStruct" + i + 
+                                               ", paramClsStruct" + i + ", paramObjStruct" + i + ");\n");
                        }
                }
        }
@@ -742,7 +723,7 @@ public class IoTCompiler {
        /**
         * HELPER: writeStructParamClassJavaStub() writes parameters if struct is present
         */
-       private void writeStructParamClassJavaStub(List<String> methParams, List<String> methPrmTypes, String callbackType) {
+       private void writeStructParamClassJavaStub(List<String> methParams, List<String> methPrmTypes, Set<String> callbackType) {
 
                print("int paramLen = ");
                writeLengthStructParamClassJavaStub(methParams, methPrmTypes);
@@ -758,15 +739,8 @@ public class IoTCompiler {
                        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(";");
+                               println("paramCls[pos] = int[].class;");
+                               println("paramObj[pos++] = objIdSent" + i + ";");
                        } else {
                                String prmType = checkAndGetArray(methPrmTypes.get(i), methParams.get(i));
                                println("paramCls[pos] = " + getSimpleType(getEnumType(prmType)) + ".class;");
@@ -795,7 +769,7 @@ public class IoTCompiler {
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
                                print("structRet[i]." + getSimpleIdentifier(members.get(i)));
-                               println(" = (" + getSimpleType(getEnumType(prmType)) + ") retObj[retObjPos++];");
+                               println(" = (" + getSimpleType(getEnumType(prmType)) + ") retActualObj[retObjPos++];");
                        }
                        println("}");
                } else if (isList(retType)) {   // A list
@@ -803,7 +777,7 @@ public class IoTCompiler {
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
                                print("structRetMem." + getSimpleIdentifier(members.get(i)));
-                               println(" = (" + getSimpleType(getEnumType(prmType)) + ") retObj[retObjPos++];");
+                               println(" = (" + getSimpleType(getEnumType(prmType)) + ") retActualObj[retObjPos++];");
                        }
                        println("structRet.add(structRetMem);");
                        println("}");
@@ -811,7 +785,7 @@ public class IoTCompiler {
                        for (int i = 0; i < members.size(); i++) {
                                String prmType = checkAndGetArray(memTypes.get(i), members.get(i));
                                print("structRet." + getSimpleIdentifier(members.get(i)));
-                               println(" = (" + getSimpleType(getEnumType(prmType)) + ") retObj[retObjPos++];");
+                               println(" = (" + getSimpleType(getEnumType(prmType)) + ") retActualObj[retObjPos++];");
                        }
                }
                println("return structRet;");
@@ -821,12 +795,12 @@ public class IoTCompiler {
        /**
         * HELPER: writeStructReturnJavaStub() writes parameters if struct is present for return statement
         */
-       private void writeStructReturnJavaStub(String simpleType, String retType) {
+       private void writeStructReturnJavaStub(String simpleType, String retType, String method, InterfaceDecl intDecl) {
 
-               // Handle the returned struct!!!
-               println("Object retLenObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
+               // Handle the returned struct size
+               writeWaitForReturnValueJava(method, intDecl, "Object retObj = rmiComm.getReturnValue(retType, null);");
                // Minimum retLen is 1 if this is a single struct object
-               println("int retLen = (int) retLenObj;");
+               println("int retLen = (int) retObj;");
                int numMem = getNumOfMembers(simpleType);
                println("Class<?>[] retCls = new Class<?>[" + numMem + "*retLen];");
                println("Class<?>[] retClsVal = new Class<?>[" + numMem + "*retLen];");
@@ -850,7 +824,9 @@ public class IoTCompiler {
                                println("retClsVal[retPos++] = null;");
                        }
                }
-               println("Object[] retObj = rmiCall.getStructObjects(retCls, retClsVal);");
+               //println("Object[] retActualObj = rmiComm.getStructObjects(retCls, retClsVal);");
+               // Handle the actual returned struct
+               writeWaitForReturnValueJava(method, intDecl, "Object[] retActualObj = rmiComm.getStructObjects(retCls, retClsVal);");
                if (isArray(retType)) {                 // An array
                        println(simpleType + "[] structRet = new " + simpleType + "[retLen];");
                        println("for(int i = 0; i < retLen; i++) {");
@@ -865,11 +841,25 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeWaitForReturnValueJava() writes the synchronization part for return values
+        */
+       private void writeWaitForReturnValueJava(String method, InterfaceDecl intDecl, String getReturnValue) {
+
+               println("// Waiting for return value");         
+               int methodNumId = intDecl.getMethodNumId(method);
+               println("while (!retValueReceived" + methodNumId + ".get());");
+               println(getReturnValue);
+               println("retValueReceived" + methodNumId + ".set(false);");
+               println("rmiComm.setGetReturnBytes();\n");
+       }
+
+
        /**
         * HELPER: writeStdMethodBodyJavaStub() writes the standard method body in the stub class
         */
        private void writeStdMethodBodyJavaStub(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method, String callbackType) {
+                       List<String> methPrmTypes, String method, Set<String> callbackType) {
 
                checkAndWriteStructSetupJavaStub(methParams, methPrmTypes, intDecl, method);
                println("int methodId = " + intDecl.getMethodNumId(method) + ";");
@@ -884,7 +874,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String prmType = methPrmTypes.get(i);
                                if (checkCallbackType(prmType, callbackType)) { // Check if this has callback object
-                                       print("int.class");
+                                       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");
@@ -900,13 +890,7 @@ public class IoTCompiler {
                        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)");
+                                       print("objIdSent" + i);
                                } else
                                        print(getEnumParam(methPrmTypes.get(i), getSimpleIdentifier(methParams.get(i)), i));
                                // Check if this is the last element (don't print a comma)
@@ -916,26 +900,26 @@ public class IoTCompiler {
                        }
                        println(" };");
                }
+               // Send method call first and wait for return value separately
+               println("rmiComm.remoteCall(objectId, methodId, paramCls, paramObj);");
                // 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
+               if (!retType.equals("void")) { // We do have a return value
                        // Generate array of parameter types
                        if (isStructClass(getGenericType(getSimpleArrayType(retType)))) {
-                               writeStructReturnJavaStub(getGenericType(getSimpleArrayType(retType)), retType);
+                               writeStructReturnJavaStub(getGenericType(getSimpleArrayType(retType)), retType, method, intDecl);
                        } else {
                                // 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);
+                                       //println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
+                                       checkAndWriteEnumRetTypeJavaStub(retType, method, intDecl);
                                } 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);");
+                                       writeWaitForReturnValueJava(method, intDecl, "Object retObj = rmiComm.getReturnValue(retType, retGenValType);");
                                        println("return (" + retType + ")retObj;");
                                } else {
-                                       println("Object retObj = rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);");
+                                       writeWaitForReturnValueJava(method, intDecl, "Object retObj = rmiComm.getReturnValue(retType, null);");
                                        println("return (" + retType + ")retObj;");
                                }
                        }
@@ -955,6 +939,24 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: checkCallbackType() checks the callback type
+        */
+       private boolean checkCallbackType(String paramType, Set<String> callbackType) {
+
+               String prmType = returnGenericCallbackType(paramType);
+               if (callbackType == null)       // If there is no callbackType it means not a callback method
+                       return false;
+               else {
+                       for (String type : callbackType) {
+                               if (type.equals(prmType))
+                                       return true;    // Check callbackType one by one
+                       }
+                       return false;
+               }
+       }
+
+
        /**
         * HELPER: checkCallbackType() checks the callback type
         */
@@ -968,40 +970,66 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeCallbackInstantiationMethodBodyJavaStub() writes the callback object instantiation in the method of the stub class
+        */
+       private void writeCallbackInstantiationMethodBodyJavaStub(String paramIdent, String callbackType, int counter, boolean isMultipleCallbacks) {
+
+               println("if (!IoTRMIUtil.mapSkel.containsKey(" + paramIdent + ")) {");
+               println("int newObjIdSent = rmiComm.getObjectIdCounter();");
+               if (isMultipleCallbacks)
+                       println("objIdSent" + counter + "[cnt" + counter + "++] = newObjIdSent;");
+               else
+                       println("objIdSent" + counter + "[0] = newObjIdSent;");
+               println("rmiComm.decrementObjectIdCounter();");
+               println(callbackType + "_Skeleton skel" + counter + " = new " + callbackType + "_Skeleton(" + paramIdent + ", rmiComm, newObjIdSent);");
+               println("IoTRMIUtil.mapSkel.put(" + paramIdent + ", skel" + counter + ");");
+               println("IoTRMIUtil.mapSkelId.put(" + paramIdent + ", newObjIdSent);");
+               println("Thread thread = new Thread() {");
+               println("public void run() {");
+               println("try {");
+               println("skel" + counter + ".___waitRequestInvokeMethod();");
+               println("} catch (Exception ex) {");
+               println("ex.printStackTrace();");
+               println("throw new Error(\"Exception when trying to run ___waitRequestInvokeMethod() for " + 
+                       callbackType + "_Skeleton!\");");
+               println("}");
+               println("}");
+               println("};");
+               println("thread.start();");
+               println("while(!skel" + counter + ".didAlreadyInitWaitInvoke());");
+               println("}");
+               println("else");
+               println("{");
+               println("int newObjIdSent = IoTRMIUtil.mapSkelId.get(" + paramIdent + ");");
+               if (isMultipleCallbacks)
+                       println("objIdSent" + counter + "[cnt" + counter + "++] = newObjIdSent;");
+               else
+                       println("objIdSent" + counter + "[0] = newObjIdSent;");
+               println("}");
+       }
+
+
        /**
         * HELPER: writeCallbackMethodBodyJavaStub() writes the callback method of the stub class
         */
        private void writeCallbackMethodBodyJavaStub(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method, String callbackType) {
+                       List<String> methPrmTypes, String method, Set<String> callbackType) {
 
-               println("try {");
-               // Check if this is single object, array, or list of objects
+               // Determine callback object counter type (List vs. single variable)
                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[] objIdSent" + i + " = ");
                                String param = methParams.get(i);
-                               if (isArrayOrList(paramType, param)) {  // Generate loop
-                                       println("for (" + getGenericType(paramType) + " cb : " + getSimpleIdentifier(param) + ") {");
-                                       println(callbackType + "_CallbackSkeleton skel" + i + " = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
-                               } else
-                                       println(callbackType + "_CallbackSkeleton skel" + i + " = new " + callbackType + "_CallbackSkeleton(" +
-                                               getSimpleIdentifier(param) + ", objIdCnt++);");
-                               println("listCallbackObj.add(skel" + i + ");");
-                               if (isArrayOrList(paramType, param))
-                                       println("}");
+                               if (isArray(methParams.get(i)))
+                                       println("new int[" + getSimpleIdentifier(methParams.get(i)) + ".length];");
+                               else if (isList(methPrmTypes.get(i)))
+                                       println("new int[" + getSimpleIdentifier(methParams.get(i)) + ".size()];");
+                               else
+                                       println("new int[1];");
                        }
                }
-               print("}");
-               println(" catch (Exception ex) {");
-               println("ex.printStackTrace();");
-               println("throw new Error(\"Exception when generating skeleton objects!\");");
-               println("}\n");
-       }
-
-
-/*     private void writeCallbackMethodBodyJavaStub(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method, String callbackType) {
-
                println("try {");
                // Check if this is single object, array, or list of objects
                for (int i = 0; i < methParams.size(); i++) {
@@ -1009,12 +1037,11 @@ 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("int cnt" + i + " = 0;");
                                        println("for (" + getGenericType(paramType) + " cb : " + getSimpleIdentifier(param) + ") {");
-                                       println(callbackType + "_CallbackSkeleton skel" + i + " = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
+                                       writeCallbackInstantiationMethodBodyJavaStub("cb", returnGenericCallbackType(paramType), i, true);
                                } else
-                                       println(callbackType + "_CallbackSkeleton skel" + i + " = new " + callbackType + "_CallbackSkeleton(" +
-                                               getSimpleIdentifier(param) + ", objIdCnt++);");
-                               println("listCallbackObj.add(skel" + i + ");");
+                                       writeCallbackInstantiationMethodBodyJavaStub(getSimpleIdentifier(param), returnGenericCallbackType(paramType), i, false);
                                if (isArrayOrList(paramType, param))
                                        println("}");
                        }
@@ -1024,65 +1051,14 @@ public class IoTCompiler {
                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 methods of the stub class
         */
-       private void writeMethodJavaStub(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses) {
+       private void writeMethodJavaStub(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses, String newStubClass) {
 
-               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
@@ -1090,14 +1066,16 @@ public class IoTCompiler {
                        print("public " + intDecl.getMethodType(method) + " " +
                                intDecl.getMethodId(method) + "(");
                        boolean isCallbackMethod = false;
-                       String callbackType = null;
+                       //String callbackType = null;
+                       Set<String> callbackType = new HashSet<String>();
                        for (int i = 0; i < methParams.size(); i++) {
 
                                String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                                // Check if this has callback object
                                if (callbackClasses.contains(paramType)) {
                                        isCallbackMethod = true;
-                                       callbackType = paramType;       
+                                       //callbackType = paramType;
+                                       callbackType.add(paramType);
                                        // Even if there're 2 callback arguments, we expect them to be of the same interface
                                }
                                print(methPrmTypes.get(i) + " " + methParams.get(i));
@@ -1113,115 +1091,23 @@ public class IoTCompiler {
                        //else
                        writeStdMethodBodyJavaStub(intDecl, methParams, methPrmTypes, method, callbackType);
                        println("}\n");
-                       // Write the init callback helper method
-                       if (isCallbackMethod && !isDefined) {
-                               writeInitCallbackJavaStub(callbackType, intDecl);
-                               isDefined = true;
-                       }
-               }
-       }
-
-
-       /**
-        * generateJavaStubClasses() generate stubs based on the methods list in Java
-        */
-       public void generateJavaStubClasses() throws IOException {
-
-               // Create a new directory
-               String path = createDirectories(dir, subdir);
-               for (String intface : mapIntfacePTH.keySet()) {
-
-                       Map<String,Set<String>> mapNewIntMethods = mapInt2NewInts.get(intface);
-                       for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
-
-                               // Open a new file to write into
-                               String newIntface = intMeth.getKey();
-                               String newStubClass = newIntface + "_Stub";
-                               FileWriter fw = new FileWriter(path + "/" + newStubClass + ".java");
-                               pw = new PrintWriter(new BufferedWriter(fw));
-                               DeclarationHandler decHandler = mapIntDeclHand.get(intface);
-                               InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
-                               // Pass in set of methods and get import classes
-                               Set<String> methods = intMeth.getValue();
-                               Set<String> importClasses = getImportClasses(methods, intDecl);
-                               List<String> stdImportClasses = getStandardJavaImportClasses();
-                               List<String> allImportClasses = getAllLibClasses(stdImportClasses, importClasses);
-                               printImportStatements(allImportClasses); println("");
-                               // Find out if there are callback objects
-                               Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
-                               boolean callbackExist = !callbackClasses.isEmpty();
-                               // Write class header
-                               println("public class " + newStubClass + " implements " + newIntface + " {\n");
-                               // Write properties
-                               writePropertiesJavaStub(intface, newIntface, callbackExist, callbackClasses);
-                               // Write constructor
-                               writeConstructorJavaStub(intface, newStubClass, callbackExist, callbackClasses);
-                               // Write methods
-                               writeMethodJavaStub(intMeth.getValue(), intDecl, callbackClasses);
-                               println("}");
-                               pw.close();
-                               System.out.println("IoTCompiler: Generated stub class " + newStubClass + ".java...");
-                       }
                }
        }
 
 
        /**
-        * HELPER: writePropertiesJavaCallbackStub() writes the properties of the callback stub class
+        * HELPER: getStubInterface() gets stub interface name based on original interface
         */
-       private void writePropertiesJavaCallbackStub(String intface, String newIntface, boolean callbackExist, Set<String> callbackClasses) {
+       public String getStubInterface(String intface) {
 
-               println("private IoTRMICall rmiCall;");
-               println("private String address;");
-               println("private int[] ports;\n");
-               // Get the object Id
-               println("private int objectId = 0;");
-               if (callbackExist) {
-               // We assume that each class only has one callback interface for now
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       println("// Callback properties");
-                       println("private IoTRMIObject rmiObj;");
-                       println("List<" + callbackType + "> listCallbackObj;");
-                       println("private static int objIdCnt = 0;");
-                       // Generate permission stuff for callback stubs
-                       DeclarationHandler decHandler = mapIntDeclHand.get(callbackType);
-                       InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(callbackType);
-                       writePropertiesJavaPermission(callbackType, intDecl);
-               }
-               println("\n");
+               return mapInt2NewIntName.get(intface);
        }
 
 
        /**
-        * HELPER: writeConstructorJavaCallbackStub() writes the constructor of the callback stub class
-        */
-       private void writeConstructorJavaCallbackStub(String intface, String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
-
-               // TODO: If we want callback in callback, then we need to add address and port initializations
-               println("public " + newStubClass + "(IoTRMICall _rmiCall, int _objectId) throws Exception {");
-               println("objectId = _objectId;");
-               println("rmiCall = _rmiCall;");
-               if (callbackExist) {
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       writeConstructorJavaPermission(intface);
-                       println("listCallbackObj = new ArrayList<" + callbackType + ">();");
-                       println("___initCallBack();");
-                       println("// TODO: Add address and port initialization here if we want callback in callback!");
-               }
-               println("}\n");
-       }
-
-
-       /**
-        * generateJavaCallbackStubClasses() generate callback stubs based on the methods list in Java
-        * <p>
-        * Callback stubs gets the IoTRMICall objects from outside of the class as contructor input
-        * because all these stubs are populated by the class that takes in this object as a callback
-        * object. In such a class, we only use one socket, hence one IoTRMICall, for all callback objects.
+        * generateJavaStubClasses() generate stubs based on the methods list in Java
         */
-       public void generateJavaCallbackStubClasses() throws IOException {
+       public void generateJavaStubClasses() throws IOException {
 
                // Create a new directory
                String path = createDirectories(dir, subdir);
@@ -1232,7 +1118,7 @@ public class IoTCompiler {
 
                                // Open a new file to write into
                                String newIntface = intMeth.getKey();
-                               String newStubClass = newIntface + "_CallbackStub";
+                               String newStubClass = newIntface + "_Stub";
                                FileWriter fw = new FileWriter(path + "/" + newStubClass + ".java");
                                pw = new PrintWriter(new BufferedWriter(fw));
                                DeclarationHandler decHandler = mapIntDeclHand.get(intface);
@@ -1249,15 +1135,16 @@ public class IoTCompiler {
                                // Write class header
                                println("public class " + newStubClass + " implements " + newIntface + " {\n");
                                // Write properties
-                               writePropertiesJavaCallbackStub(intface, newIntface, callbackExist, callbackClasses);
+                               writePropertiesJavaStub(intface, intMeth.getValue(), intDecl);
                                // Write constructor
-                               writeConstructorJavaCallbackStub(intface, newStubClass, callbackExist, callbackClasses);
+                               writeConstructorJavaStub(intface, newStubClass, intMeth.getValue(), intDecl);
+                               // Write callback constructor (used if this stub is treated as a callback stub)
+                               writeCallbackConstructorJavaStub(intface, newStubClass, intMeth.getValue(), intDecl);
                                // Write methods
-                               // TODO: perhaps need to generate callback for callback
-                               writeMethodJavaStub(intMeth.getValue(), intDecl, callbackClasses);
+                               writeMethodJavaStub(intMeth.getValue(), intDecl, callbackClasses, newStubClass);
                                println("}");
                                pw.close();
-                               System.out.println("IoTCompiler: Generated callback stub class " + newStubClass + ".java...");
+                               System.out.println("IoTCompiler: Generated stub class " + newStubClass + ".java...");
                        }
                }
        }
@@ -1266,16 +1153,18 @@ public class IoTCompiler {
        /**
         * HELPER: writePropertiesJavaSkeleton() writes the properties of the skeleton class
         */
-       private void writePropertiesJavaSkeleton(String intface, boolean callbackExist, InterfaceDecl intDecl) {
+       private void writePropertiesJavaSkeleton(String intface, InterfaceDecl intDecl) {
 
                println("private " + intface + " mainObj;");
-               //println("private int ports;");
-               println("private IoTRMIObject rmiObj;\n");
-               // Callback
-               if (callbackExist) {
-                       println("private static int objIdCnt = 0;");
-                       println("private IoTRMICall rmiCall;");
-               }
+               //println("private int objectId = 0;");
+               Integer objId = mapIntfaceObjId.get(intface);
+               println("private int objectId = " + objId + ";");
+               println("// Communications and synchronizations");
+               println("private IoTRMIComm rmiComm;");
+               println("private AtomicBoolean didAlreadyInitWaitInvoke;");
+               println("private AtomicBoolean methodReceived;");
+               println("private byte[] methodBytes = null;");
+               println("// Permissions");
                writePropertiesJavaPermission(intface, intDecl);
                println("\n");
        }
@@ -1315,16 +1204,52 @@ public class IoTCompiler {
        /**
         * HELPER: writeConstructorJavaSkeleton() writes the constructor of the skeleton class
         */
-       private void writeConstructorJavaSkeleton(String newSkelClass, String intface, InterfaceDecl intDecl, Collection<String> methods, boolean callbackExist) {
+       private void writeConstructorJavaSkeleton(String newSkelClass, String intface, InterfaceDecl intDecl, 
+                       Collection<String> methods, boolean callbackExist) {
 
-               println("public " + newSkelClass + "(" + intface + " _mainObj, int _port) throws Exception {");
+               println("public " + newSkelClass + "(" + intface + " _mainObj, int _portSend, int _portRecv) throws Exception {");
                println("mainObj = _mainObj;");
-               println("rmiObj = new IoTRMIObject(_port);");
+               println("rmiComm = new IoTRMICommServer(_portSend, _portRecv);");
                // Generate permission control initialization
                writeConstructorJavaPermission(intface);
-               writeJavaInitCallbackPermission(intface, intDecl, callbackExist);
                writeStructPermissionJavaSkeleton(methods, intDecl, intface);
+               println("IoTRMIUtil.mapSkel.put(_mainObj, this);");
+               println("IoTRMIUtil.mapSkelId.put(_mainObj, objectId);");
+               println("didAlreadyInitWaitInvoke = new AtomicBoolean(false);");
+               println("methodReceived = new AtomicBoolean(false);");
+               println("rmiComm.registerSkeleton(objectId, methodReceived);");
+               println("Thread thread1 = new Thread() {");
+               println("public void run() {");
+               println("try {");
                println("___waitRequestInvokeMethod();");
+               println("}");
+               println("catch (Exception ex)");
+               println("{");
+               println("ex.printStackTrace();");
+               println("}");
+               println("}");
+               println("};");
+               println("thread1.start();");
+               println("}\n");
+       }
+
+
+       /**
+        * HELPER: writeCallbackConstructorJavaSkeleton() writes the constructor of the skeleton class
+        */
+       private void writeCallbackConstructorJavaSkeleton(String newSkelClass, String intface, InterfaceDecl intDecl, 
+                       Collection<String> methods, boolean callbackExist) {
+
+               println("public " + newSkelClass + "(" + intface + " _mainObj, IoTRMIComm _rmiComm, int _objectId) throws Exception {");
+               println("mainObj = _mainObj;");
+               println("rmiComm = _rmiComm;");
+               println("objectId = _objectId;");
+               // Generate permission control initialization
+               writeConstructorJavaPermission(intface);
+               writeStructPermissionJavaSkeleton(methods, intDecl, intface);
+               println("didAlreadyInitWaitInvoke = new AtomicBoolean(false);");
+               println("methodReceived = new AtomicBoolean(false);");
+               println("rmiComm.registerSkeleton(objectId, methodReceived);");
                println("}\n");
        }
 
@@ -1350,46 +1275,21 @@ public class IoTCompiler {
        }
 
 
-       /**
-        * HELPER: writeInitCallbackJavaSkeleton() writes the init callback method for skeleton class
-        */
-       private void writeInitCallbackJavaSkeleton(boolean callbackSkeleton) {
-
-               // This is a callback skeleton generation
-               if (callbackSkeleton)
-                       println("public void ___regCB(IoTRMIObject rmiObj) throws IOException {");
-               else
-                       println("public void ___regCB() throws IOException {");
-               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");
-       }
-
-
        /**
         * HELPER: writeMethodJavaSkeleton() writes the method of the skeleton class
         */
-       private void writeMethodJavaSkeleton(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses, 
-                       boolean callbackSkeleton) {
+       private void writeMethodJavaSkeleton(Collection<String> methods, InterfaceDecl intDecl) {
 
-               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
                        List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
                        String methodId = intDecl.getMethodId(method);
                        print("public " + intDecl.getMethodType(method) + " " + methodId + "(");
-                       boolean isCallbackMethod = false;
-                       String callbackType = null;
                        for (int i = 0; i < methParams.size(); i++) {
 
                                String origParamType = methPrmTypes.get(i);
                                String paramType = checkAndGetParamClass(origParamType);
-                               if (callbackClasses.contains(origParamType)) { // Check if this has callback object
-                                       isCallbackMethod = true;
-                                       callbackType = origParamType;   
-                               }
                                print(paramType + " " + methParams.get(i));
                                // Check if this is the last element (don't print a comma)
                                if (i != methParams.size() - 1) {
@@ -1400,19 +1300,33 @@ public class IoTCompiler {
                        // Now, write the body of skeleton!
                        writeStdMethodBodyJavaSkeleton(methParams, methodId, intDecl.getMethodType(method));
                        println("}\n");
-                       if (isCallbackMethod && !isDefined) {   // Make sure that this function is only defined once!
-                               writeInitCallbackJavaSkeleton(callbackSkeleton);
-                               isDefined = true;
-                       }
                }
        }
 
 
+       /**
+        * HELPER: writeCallbackInstantiationJavaStubGeneration() writes the instantiation of callback stubs
+        */
+       private void writeCallbackInstantiationJavaStubGeneration(String exchParamType, int counter) {
+
+               println(exchParamType + " newStub" + counter + " = null;");
+               println("if(!IoTRMIUtil.mapStub.containsKey(objIdRecv" + counter + ")) {");
+               println("newStub" + counter + " = new " + exchParamType + "_Stub(rmiComm, objIdRecv" + counter + ");");
+               println("IoTRMIUtil.mapStub.put(objIdRecv" + counter + ", newStub" + counter + ");");
+               println("rmiComm.setObjectIdCounter(objIdRecv" + counter + ");");
+               println("rmiComm.decrementObjectIdCounter();");
+               println("}");
+               println("else {");
+               println("newStub" + counter + " = (" + exchParamType + "_Stub) IoTRMIUtil.mapStub.get(objIdRecv" + counter + ");");
+               println("}");
+       }
+
+
        /**
         * HELPER: writeCallbackJavaStubGeneration() writes the callback stub generation part
         */
        private Map<Integer,String> writeCallbackJavaStubGeneration(List<String> methParams, List<String> methPrmTypes, 
-                       String callbackType, boolean isStructMethod) {
+                       Set<String> callbackType, boolean isStructMethod) {
 
                Map<Integer,String> mapStubParam = new HashMap<Integer,String>();
                String offsetPfx = "";
@@ -1425,31 +1339,35 @@ public class IoTCompiler {
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
                                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[" + offsetPfx + i + "];");
+                               println("int[] stubIdArray" + i + " = (int[]) paramObj[" + offsetPfx + i + "];");
+                               if (isArray(param)) {                           
+                                       println("int numStubs" + i + " = stubIdArray" + i + ".length;");
                                        println(exchParamType + "[] stub" + i + " = new " + exchParamType + "[numStubs" + i + "];");
                                } else if (isList(paramType)) {
-                                       println("int numStubs" + i + " = (int) paramObj[" + offsetPfx + i + "];");
+                                       println("int numStubs" + i + " = stubIdArray" + i + ".length;");
                                        println("List<" + exchParamType + "> stub" + i + " = new ArrayList<" + exchParamType + ">();");
                                } else {
-                                       println(exchParamType + " stub" + i + " = new " + exchParamType + "_CallbackStub(rmiCall, objIdCnt);");
-                                       println("objIdCnt++;");
+                                       println("int objIdRecv" + i + " = stubIdArray" + i + "[0];");
+                                       writeCallbackInstantiationJavaStubGeneration(exchParamType, i);
                                }
                        }
                        // Generate a loop if needed
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
                                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);");
-                                       println("objIdCnt++;");
+                                       println("for (int i = 0; i < numStubs" + i + "; i++) {");
+                                       println("int objIdRecv" + i + " = stubIdArray" + i + "[i];");
+                                       writeCallbackInstantiationJavaStubGeneration(exchParamType, i);
+                                       println("stub" + i + "[i] = newStub" + i + ";");
                                        println("}");
                                } else if (isList(paramType)) {
-                                       println("for (int objId = 0; objId < numStubs" + i + "; objId++) {");
-                                       println("stub" + i + ".add(new " + exchParamType + "_CallbackStub(rmiCall, objIdCnt));");
-                                       println("objIdCnt++;");
+                                       println("for (int i = 0; i < numStubs" + i + "; i++) {");
+                                       println("int objIdRecv" + i + " = stubIdArray" + i + "[i];");
+                                       writeCallbackInstantiationJavaStubGeneration(exchParamType, i);
+                                       println("stub" + i + ".add(newStub" + i + ");");
                                        println("}");
-                               }
+                               } else
+                                       println(exchParamType + " stub" + i + " = newStub" + i + ";");
                                mapStubParam.put(i, "stub" + i);        // List of all stub parameters
                        }
                }
@@ -1687,7 +1605,7 @@ public class IoTCompiler {
                else    // Just single struct object
                        println("int retLen = 1;");
                println("Object retLenObj = retLen;");
-               println("rmiObj.sendReturnObj(retLenObj);");
+               println("rmiComm.sendReturnObj(retLenObj, localMethodBytes);");
                int numMem = getNumOfMembers(simpleType);
                println("Class<?>[] retCls = new Class<?>[" + numMem + "*retLen];");
                println("Object[] retObj = new Object[" + numMem + "*retLen];");
@@ -1733,7 +1651,7 @@ public class IoTCompiler {
         * 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, Set<String> callbackType,
                        boolean isStructMethod) {
 
                checkAndWriteEnumTypeJavaSkeleton(methParams, methPrmTypes, isStructMethod);
@@ -1776,12 +1694,12 @@ public class IoTCompiler {
                if (!retType.equals("void")) {
                        if (isEnumClass(getSimpleArrayType(getGenericType(retType)))) { // Enum type
                                checkAndWriteEnumRetConvJavaSkeleton(retType);
-                               println("rmiObj.sendReturnObj(retObj);");
+                               println("rmiComm.sendReturnObj(retObj, localMethodBytes);");
                        } else if (isStructClass(getSimpleArrayType(getGenericType(retType)))) { // Struct type
                                writeStructReturnJavaSkeleton(getSimpleArrayType(getGenericType(retType)), retType);
-                               println("rmiObj.sendReturnObj(retCls, retObj);");
+                               println("rmiComm.sendReturnObj(retCls, retObj, localMethodBytes);");
                        } else
-                               println("rmiObj.sendReturnObj(retObj);");
+                               println("rmiComm.sendReturnObj(retObj, localMethodBytes);");
                }
                if (isCallbackMethod) { // Catch exception if this is callback
                        print("}");
@@ -1801,7 +1719,10 @@ public class IoTCompiler {
 
                // Generate array of parameter objects
                boolean isCallbackMethod = false;
-               String callbackType = null;
+               //String callbackType = null;
+               Set<String> callbackType = new HashSet<String>();
+               println("byte[] localMethodBytes = methodBytes;");
+               println("rmiComm.setGetMethodBytes();");
                print("int paramLen = ");
                writeLengthStructParamClassSkeleton(methParams, methPrmTypes, method, intDecl);
                println(";");
@@ -1819,8 +1740,9 @@ public class IoTCompiler {
                                String prmType = returnGenericCallbackType(methPrmTypes.get(i));
                                if (callbackClasses.contains(prmType)) {
                                        isCallbackMethod = true;
-                                       callbackType = prmType;
-                                       println("paramCls[pos] = int.class;");
+                                       //callbackType = prmType;
+                                       callbackType.add(prmType);
+                                       println("paramCls[pos] = int[].class;");
                                        println("paramClsGen[pos++] = null;");
                                } else {        // Generate normal classes if it's not a callback object
                                        String paramTypeOth = checkAndGetArray(methPrmTypes.get(i), methParams.get(i));
@@ -1834,7 +1756,7 @@ public class IoTCompiler {
                                }
                        }
                }
-               println("Object[] paramObj = rmiObj.getMethodParams(paramCls, paramClsGen);");
+               println("Object[] paramObj = rmiComm.getMethodParams(paramCls, paramClsGen, localMethodBytes);");
                writeStructMembersInitJavaSkeleton(intDecl, methParams, methPrmTypes, method);
                // Write the return value part
                writeMethodHelperReturnJavaSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod, callbackType, true);
@@ -1849,15 +1771,19 @@ public class IoTCompiler {
 
                // Generate array of parameter objects
                boolean isCallbackMethod = false;
-               String callbackType = null;
-               print("Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { ");
+               //String callbackType = null;
+               Set<String> callbackType = new HashSet<String>();
+               println("byte[] localMethodBytes = methodBytes;");
+               println("rmiComm.setGetMethodBytes();");
+               print("Object[] paramObj = rmiComm.getMethodParams(new Class<?>[] { ");
                for (int i = 0; i < methParams.size(); i++) {
 
                        String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                        if (callbackClasses.contains(paramType)) {
                                isCallbackMethod = true;
-                               callbackType = paramType;
-                               print("int.class");
+                               //callbackType = paramType;
+                               callbackType.add(paramType);
+                               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(getEnumType(prmType)) + ".class");
@@ -1865,9 +1791,9 @@ public class IoTCompiler {
                        if (i != methParams.size() - 1)
                                print(", ");
                }
-               println(" }, ");
+               //println(" }, ");
                // Generate generic class if it's a generic type.. null otherwise
-               print("new Class<?>[] { ");
+               print(" }, new Class<?>[] { ");
                for (int i = 0; i < methParams.size(); i++) {
                        String prmType = methPrmTypes.get(i);
                        if ((getParamCategory(prmType) == ParamCategory.NONPRIMITIVES) &&
@@ -1879,7 +1805,7 @@ public class IoTCompiler {
                        if (i != methParams.size() - 1)
                                print(", ");
                }
-               println(" });");
+               println(" }, localMethodBytes);");
                // Write the return value part
                writeMethodHelperReturnJavaSkeleton(intDecl, methParams, methPrmTypes, method, isCallbackMethod, callbackType, false);
        }
@@ -1973,7 +1899,9 @@ public class IoTCompiler {
                                        String helperMethod = methodNumId + "struct" + i;
                                        println(helperMethod + "() {");
                                        // Now, write the helper body of skeleton!
-                                       println("Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, new Class<?>[] { null });");
+                                       println("byte[] localMethodBytes = methodBytes;");
+                                       println("rmiComm.setGetMethodBytes();");
+                                       println("Object[] paramObj = rmiComm.getMethodParams(new Class<?>[] { int.class }, new Class<?>[] { null }, localMethodBytes);");
                                        println("return (int) paramObj[0];");
                                        println("}\n");
                                }
@@ -2004,7 +1932,7 @@ public class IoTCompiler {
                                        String helperMethod = methodNumId + "struct" + i;
                                        println(helperMethod + "(IoTRMIObject rmiObj) {");
                                        // Now, write the helper body of skeleton!
-                                       println("Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, new Class<?>[] { null });");
+                                       println("Object[] paramObj = rmiComm.getMethodParams(new Class<?>[] { int.class }, new Class<?>[] { null });");
                                        println("return (int) paramObj[0];");
                                        println("}\n");
                                }
@@ -2036,11 +1964,39 @@ public class IoTCompiler {
                }
        }
        
+
+       /**
+        * HELPER: writeInputCountVarStructJavaSkeleton() writes input counter variable of struct for skeleton
+        */
+       private boolean writeInputCountVarStructJavaSkeleton(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 = getGenericType(paramType);
+                       if (isStructClass(simpleType)) {
+                               structExist = true;
+                               if (!begin)
+                                       print(", ");
+                               else
+                                       begin = false;
+                               int methodNumId = intDecl.getMethodNumId(method);
+                               print("struct" + methodNumId + "Size" + i + "Final");
+                       }
+               }
+               return structExist;
+       }
+
        
        /**
-        * HELPER: writeInputCountVarStructSkeleton() writes input counter variable of struct for skeleton
+        * HELPER: writeInputCountVarStructCplusSkeleton() writes input counter variable of struct for skeleton
         */
-       private boolean writeInputCountVarStructSkeleton(String method, InterfaceDecl intDecl) {
+       private boolean writeInputCountVarStructCplusSkeleton(String method, InterfaceDecl intDecl) {
 
                List<String> methParams = intDecl.getMethodParams(method);
                List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
@@ -2066,9 +2022,9 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodCallStructSkeleton() writes method call for wait invoke in skeleton
+        * HELPER: writeMethodCallStructJavaSkeleton() writes method call for wait invoke in skeleton
         */
-       private void writeMethodCallStructSkeleton(Collection<String> methods, InterfaceDecl intDecl) {
+       private void writeMethodCallStructJavaSkeleton(Collection<String> methods, InterfaceDecl intDecl) {
 
                // Use this set to handle two same methodIds
                for (String method : methods) {
@@ -2094,6 +2050,35 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeMethodCallStructCplusSkeleton() writes method call for wait invoke in skeleton
+        */
+       private void writeMethodCallStructCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl) {
+
+               // 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);
+                                       print("case ");
+                                       String helperMethod = methodNumId + "struct" + i;
+                                       String tempVar = "struct" + methodNumId + "Size" + i;
+                                       print(intDecl.getHelperMethodNumId(helperMethod) + ": ");
+                                       print(tempVar + " = ___");
+                                       println(helperMethod + "(skel); break;");
+                               }
+                       }
+               }
+       }
+
+
        /**
         * HELPER: writeMethodCallStructCallbackSkeleton() writes method call for wait invoke in skeleton
         */
@@ -2133,256 +2118,123 @@ public class IoTCompiler {
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
                        int newObjectId = getNewIntfaceObjectId(newIntface);
-                       println("if (_objectId == object" + newObjectId + "Id) {");
+                       println("if (_objectId == objectId) {");
                        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("continue;");
                        println("}");
                }
        }
 
 
        /**
-        * HELPER: writeJavaWaitRequestInvokeMethod() writes the main loop of the skeleton class
+        * HELPER: writeFinalInputCountVarStructSkeleton() writes the final version of input counter variable of struct for skeleton
         */
-       private void writeJavaWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, boolean callbackExist, String intface) {
+       private boolean writeFinalInputCountVarStructSkeleton(String method, InterfaceDecl intDecl) {
 
-               // Use this set to handle two same methodIds
-               Set<String> uniqueMethodIds = new HashSet<String>();
-               println("private void ___waitRequestInvokeMethod() throws IOException {");
-               // Write variables here if we have callbacks or enums or structs
-               writeCountVarStructSkeleton(methods, intDecl);
-               println("while (true) {");
-               println("rmiObj.getMethodBytes();");
-               println("int _objectId = rmiObj.getObjectId();");
-               println("int methodId = rmiObj.getMethodId();");
-               // Generate permission check
-               writeJavaMethodPermission(intface);
-               println("switch (methodId) {");
-               // Print methods and method Ids
-               for (String method : methods) {
-                       String methodId = intDecl.getMethodId(method);
-                       int methodNumId = intDecl.getMethodNumId(method);
-                       print("case " + methodNumId + ": ___");
-                       String helperMethod = methodId;
-                       if (uniqueMethodIds.contains(methodId))
-                               helperMethod = helperMethod + methodNumId;
-                       else
-                               uniqueMethodIds.add(methodId);
-                       print(helperMethod + "(");
-                       writeInputCountVarStructSkeleton(method, intDecl);
-                       println("); break;");
-               }
-               String method = "___initCallBack()";
-               // Print case -9999 (callback handler) if callback exists
-               if (callbackExist) {
-                       int methodId = intDecl.getHelperMethodNumId(method);
-                       println("case " + methodId + ": ___regCB(); break;");
-               }
-               writeMethodCallStructSkeleton(methods, intDecl);
-               println("default: ");
-               println("throw new Error(\"Method Id \" + methodId + \" not recognized!\");");
-               println("}");
-               println("}");
-               println("}\n");
-       }
-
-
-       /**
-        * generateJavaSkeletonClass() generate skeletons based on the methods list in Java
-        */
-       public void generateJavaSkeletonClass() throws IOException {
-
-               // Create a new directory
-               String path = createDirectories(dir, subdir);
-               for (String intface : mapIntfacePTH.keySet()) {
-                       // Open a new file to write into
-                       String newSkelClass = intface + "_Skeleton";
-                       FileWriter fw = new FileWriter(path + "/" + newSkelClass + ".java");
-                       pw = new PrintWriter(new BufferedWriter(fw));
-                       // Pass in set of methods and get import classes
-                       DeclarationHandler decHandler = mapIntDeclHand.get(intface);
-                       InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
-                       List<String> methods = intDecl.getMethods();
-                       Set<String> importClasses = getImportClasses(methods, intDecl);
-                       List<String> stdImportClasses = getStandardJavaImportClasses();
-                       List<String> allImportClasses = getAllLibClasses(stdImportClasses, importClasses);
-                       printImportStatements(allImportClasses);
-                       // Find out if there are callback objects
-                       Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
-                       boolean callbackExist = !callbackClasses.isEmpty();
-                       // Write class header
-                       println("");
-                       println("public class " + newSkelClass  + " implements " + intface + " {\n");
-                       // Write properties
-                       writePropertiesJavaSkeleton(intface, callbackExist, intDecl);
-                       // Write constructor
-                       writeConstructorJavaSkeleton(newSkelClass, intface, intDecl, methods, callbackExist);
-                       // Write methods
-                       writeMethodJavaSkeleton(methods, intDecl, callbackClasses, false);
-                       // Write method helper
-                       writeMethodHelperJavaSkeleton(methods, intDecl, callbackClasses);
-                       // Write waitRequestInvokeMethod() - main loop
-                       writeJavaWaitRequestInvokeMethod(methods, intDecl, callbackExist, intface);
-                       println("}");
-                       pw.close();
-                       System.out.println("IoTCompiler: Generated skeleton class " + newSkelClass + ".java...");
-               }
-       }
-
-
-       /**
-        * HELPER: writePropertiesJavaCallbackSkeleton() writes the properties of the callback skeleton class
-        */
-       private void writePropertiesJavaCallbackSkeleton(String intface, boolean callbackExist) {
-
-               println("private " + intface + " mainObj;");
-               // For callback skeletons, this is its own object Id
-               println("private int objectId = 0;");
-               // Callback
-               if (callbackExist) {
-                       println("private static int objIdCnt = 0;");
-                       println("private IoTRMICall rmiCall;");
-               }
-               println("\n");
-       }
-
-
-       /**
-        * HELPER: writeConstructorJavaCallbackSkeleton() writes the constructor of the skeleton class
-        */
-       private void writeConstructorJavaCallbackSkeleton(String newSkelClass, String intface, InterfaceDecl intDecl, Collection<String> methods) {
-
-               println("public " + newSkelClass + "(" + intface + " _mainObj, int _objectId) throws Exception {");
-               println("mainObj = _mainObj;");
-               println("objectId = _objectId;");
-               println("}\n");
-       }
-
-
-       /**
-        * HELPER: writeMethodHelperJavaCallbackSkeleton() writes the method helper of the callback skeleton class
-        */
-       private void writeMethodHelperJavaCallbackSkeleton(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses) {
-
-               // Use this set to handle two same methodIds
-               Set<String> uniqueMethodIds = new HashSet<String>();
-               for (String method : methods) {
-
-                       List<String> methParams = intDecl.getMethodParams(method);
-                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
-                       if (isStructPresent(methParams, methPrmTypes)) {        // Treat struct differently
-                               String methodId = intDecl.getMethodId(method);
-                               print("public void ___");
-                               String helperMethod = methodId;
-                               if (uniqueMethodIds.contains(methodId))
-                                       helperMethod = helperMethod + intDecl.getMethodNumId(method);
-                               else
-                                       uniqueMethodIds.add(methodId);
-                               String retType = intDecl.getMethodType(method);
-                               print(helperMethod + "(");
-                               boolean begin = true;
-                               for (int i = 0; i < methParams.size(); i++) { // Print size variables
-                                       String paramType = methPrmTypes.get(i);
-                                       String param = methParams.get(i);
-                                       String simpleType = getGenericType(paramType);
-                                       if (isStructClass(simpleType)) {
-                                               if (!begin)     // Generate comma for not the beginning variable
-                                                       print(", ");
-                                               else
-                                                       begin = false;
-                                               int methodNumId = intDecl.getMethodNumId(method);
-                                               print("int struct" + methodNumId + "Size" + i);
-                                       }
-                               }
-                               // Check if this is "void"
-                               if (retType.equals("void"))
-                                       println(", IoTRMIObject rmiObj) {");
-                               else
-                                       println(", IoTRMIObject rmiObj) throws IOException {");
-                               writeMethodHelperStructJavaSkeleton(intDecl, methParams, methPrmTypes, method, callbackClasses);
-                               println("}\n");
-                       } else {
-                               String methodId = intDecl.getMethodId(method);
-                               print("public void ___");
-                               String helperMethod = methodId;
-                               if (uniqueMethodIds.contains(methodId))
-                                       helperMethod = helperMethod + intDecl.getMethodNumId(method);
-                               else
-                                       uniqueMethodIds.add(methodId);
-                               // Check if this is "void"
-                               String retType = intDecl.getMethodType(method);
-                               if (retType.equals("void"))
-                                       println(helperMethod + "(IoTRMIObject rmiObj) {");
-                               else
-                                       println(helperMethod + "(IoTRMIObject rmiObj) throws IOException {");
-                               // Now, write the helper body of skeleton!
-                               writeStdMethodHelperBodyJavaSkeleton(intDecl, methParams, methPrmTypes, method, callbackClasses);
-                               println("}\n");
+               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 = getGenericType(paramType);
+                       if (isStructClass(simpleType)) {
+                               structExist = true;
+                               int methodNumId = intDecl.getMethodNumId(method);
+                               println("final int struct" + methodNumId + "Size" + i + 
+                                       "Final = struct" + methodNumId + "Size" + i + ";");
                        }
                }
-               // Write method helper for structs
-               writeMethodHelperStructSetupJavaCallbackSkeleton(methods, intDecl);
+               return structExist;
        }
 
 
        /**
-        * HELPER: writeJavaCallbackWaitRequestInvokeMethod() writes the request invoke method of the callback skeleton class
+        * HELPER: writeJavaWaitRequestInvokeMethod() writes the main loop of the skeleton class
         */
-       private void writeJavaCallbackWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, boolean callbackExist) {
+       private void writeJavaWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, String intface) {
 
                // Use this set to handle two same methodIds
                Set<String> uniqueMethodIds = new HashSet<String>();
-               println("public void invokeMethod(IoTRMIObject rmiObj) throws IOException {");
+               println("public void ___waitRequestInvokeMethod() throws IOException {");
                // Write variables here if we have callbacks or enums or structs
                writeCountVarStructSkeleton(methods, intDecl);
-               // Write variables here if we have callbacks or enums or structs
-               println("int methodId = rmiObj.getMethodId();");
-               // TODO: code the permission check here!
+               println("didAlreadyInitWaitInvoke.compareAndSet(false, true);");
+               println("while (true) {");
+               println("if (!methodReceived.get()) {");
+               println("continue;");
+               println("}");
+               println("methodBytes = rmiComm.getMethodBytes();");
+               println("methodReceived.set(false);");
+               println("int _objectId = IoTRMIComm.getObjectId(methodBytes);");
+               println("int methodId = IoTRMIComm.getMethodId(methodBytes);");
+               // Generate permission check
+               writeJavaMethodPermission(intface);
                println("switch (methodId) {");
                // Print methods and method Ids
                for (String method : methods) {
                        String methodId = intDecl.getMethodId(method);
                        int methodNumId = intDecl.getMethodNumId(method);
-                       print("case " + methodNumId + ": ___");
+                       println("case " + methodNumId + ":");
+                       // Check for stuct counters
+                       writeFinalInputCountVarStructSkeleton(method, intDecl);
+                       println("new Thread() {");
+                       println("public void run() {");
+                       println("try {");
+                       print("___");
                        String helperMethod = methodId;
                        if (uniqueMethodIds.contains(methodId))
                                helperMethod = helperMethod + methodNumId;
                        else
                                uniqueMethodIds.add(methodId);
                        print(helperMethod + "(");
-                       if (writeInputCountVarStructSkeleton(method, intDecl))
-                               println(", rmiObj); break;");
-                       else
-                               println("rmiObj); break;");
+                       writeInputCountVarStructJavaSkeleton(method, intDecl);
+                       println(");");
+                       println("}");
+                       println("catch (Exception ex) {");
+                       println("ex.printStackTrace();");
+                       println("}");
+                       println("}");
+                       println("}.start();");
+                       println("break;");
                }
                String method = "___initCallBack()";
-               // Print case -9999 (callback handler) if callback exists
-               if (callbackExist) {
-                       int methodId = intDecl.getHelperMethodNumId(method);
-                       println("case " + methodId + ": ___regCB(rmiObj); break;");
-               }
-               writeMethodCallStructCallbackSkeleton(methods, intDecl);
+               writeMethodCallStructJavaSkeleton(methods, intDecl);
                println("default: ");
                println("throw new Error(\"Method Id \" + methodId + \" not recognized!\");");
                println("}");
+               println("}");
+               println("}\n");
+       }
+
+
+       /**
+        * HELPER: writeReturnDidAlreadyInitWaitInvoke() writes the function to return didAlreadyInitWaitInvoke
+        */
+       private void writeReturnDidAlreadyInitWaitInvoke() {
+
+               println("public boolean didAlreadyInitWaitInvoke() {");
+               println("return didAlreadyInitWaitInvoke.get();");
                println("}\n");
        }
 
 
        /**
-        * generateJavaCallbackSkeletonClass() generate callback skeletons based on the methods list in Java
+        * generateJavaSkeletonClass() generate skeletons based on the methods list in Java
         */
-       public void generateJavaCallbackSkeletonClass() throws IOException {
+       public void generateJavaSkeletonClass() throws IOException {
 
                // Create a new directory
                String path = createDirectories(dir, subdir);
                for (String intface : mapIntfacePTH.keySet()) {
                        // Open a new file to write into
-                       String newSkelClass = intface + "_CallbackSkeleton";
+                       String newSkelClass = intface + "_Skeleton";
                        FileWriter fw = new FileWriter(path + "/" + newSkelClass + ".java");
                        pw = new PrintWriter(new BufferedWriter(fw));
                        // Pass in set of methods and get import classes
@@ -2400,21 +2252,31 @@ public class IoTCompiler {
                        println("");
                        println("public class " + newSkelClass  + " implements " + intface + " {\n");
                        // Write properties
-                       writePropertiesJavaCallbackSkeleton(intface, callbackExist);
+                       writePropertiesJavaSkeleton(intface, intDecl);
                        // Write constructor
-                       writeConstructorJavaCallbackSkeleton(newSkelClass, intface, intDecl, methods);
+                       writeConstructorJavaSkeleton(newSkelClass, intface, intDecl, methods, callbackExist);
+                       // Write constructor that is called when this object is a callback object
+                       writeCallbackConstructorJavaSkeleton(newSkelClass, intface, intDecl, methods, callbackExist);
+                       // Write function to return didAlreadyInitWaitInvoke
+                       writeReturnDidAlreadyInitWaitInvoke();
                        // Write methods
-                       writeMethodJavaSkeleton(methods, intDecl, callbackClasses, true);
+                       writeMethodJavaSkeleton(methods, intDecl);
                        // Write method helper
-                       writeMethodHelperJavaCallbackSkeleton(methods, intDecl, callbackClasses);
+                       writeMethodHelperJavaSkeleton(methods, intDecl, callbackClasses);
                        // Write waitRequestInvokeMethod() - main loop
-                       writeJavaCallbackWaitRequestInvokeMethod(methods, intDecl, callbackExist);
+                       writeJavaWaitRequestInvokeMethod(methods, intDecl, intface);
                        println("}");
                        pw.close();
-                       System.out.println("IoTCompiler: Generated callback skeleton class " + newSkelClass + ".java...");
+                       System.out.println("IoTCompiler: Generated skeleton class " + newSkelClass + ".java...");
                }
        }
 
+       
+/*================================================================================
+ *
+ *             C++ generation
+ *
+ *================================================================================/
 
        /**
         * HELPER: writeMethodCplusLocalInterface() writes the method of the local interface
@@ -2583,7 +2445,9 @@ public class IoTCompiler {
                        Set<String> includeClasses = getIncludeClasses(methods, intDecl, intface, true);
                        printIncludeStatements(includeClasses); println("");
                        println("using namespace std;\n");
-                       //writeStructCplus(structDecl);
+                       Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
+                       if (!intface.equals(mainClass)) // Forward declare if not main class
+                               writeMethodCplusInterfaceForwardDecl(methods, intDecl, callbackClasses, true);
                        println("class " + intface); println("{");
                        println("public:");
                        // Write methods
@@ -2596,6 +2460,33 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeMethodCplusInterfaceForwardDecl() writes the forward declaration of the interface
+        */
+       private void writeMethodCplusInterfaceForwardDecl(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses, boolean needNewIntface) {
+
+               Set<String> isDefined = new HashSet<String>();
+               for (String method : methods) {
+
+                       List<String> methParams = intDecl.getMethodParams(method);
+                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+                       for (int i = 0; i < methParams.size(); i++) {
+                               String paramType = returnGenericCallbackType(methPrmTypes.get(i));
+                               // Check if this has callback object
+                               if (callbackClasses.contains(paramType)) {
+                                       if (!isDefined.contains(paramType)) {
+                                               if (needNewIntface)
+                                                       println("class " + getStubInterface(paramType) + ";\n");
+                                               else
+                                                       println("class " + paramType + ";\n");
+                                               isDefined.add(paramType);
+                                       }                                               
+                               }
+                       }
+               }
+       }
+
+
        /**
         * generateCPlusInterfaces() generate stub interfaces based on the methods list in C++
         * <p>
@@ -2620,17 +2511,19 @@ public class IoTCompiler {
                                println("#ifndef _" + newIntface.toUpperCase() + "_HPP__");
                                println("#define _" + newIntface.toUpperCase() + "_HPP__");
                                println("#include <iostream>");
+                               updateIntfaceObjIdMap(intface, newIntface);
                                // Pass in set of methods and get import classes
-                               Set<String> includeClasses = getIncludeClasses(intMeth.getValue(), intDecl, intface, false);
-                               List<String> stdIncludeClasses = getStandardCplusIncludeClasses();
-                               List<String> allIncludeClasses = getAllLibClasses(stdIncludeClasses, includeClasses);
-                               printIncludeStatements(allIncludeClasses); println("");                 
+                               Set<String> methods = intMeth.getValue();
+                               Set<String> includeClasses = getIncludeClasses(methods, intDecl, intface, false);
+                               printIncludeStatements(includeClasses); println("");
                                println("using namespace std;\n");
+                               Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
+                               writeMethodCplusInterfaceForwardDecl(methods, intDecl, callbackClasses, false);
                                println("class " + newIntface);
                                println("{");
                                println("public:");
                                // Write methods
-                               writeMethodCplusInterface(intMeth.getValue(), intDecl);
+                               writeMethodCplusInterface(methods, intDecl);
                                println("};");
                                println("#endif");
                                pw.close();
@@ -2641,26 +2534,57 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodCplusStub() writes the methods of the stub
+        * HELPER: writeMethodDeclCplusStub() writes the method declarations of the stub
         */
-       private void writeMethodCplusStub(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses) {
+       private void writeMethodDeclCplusStub(Collection<String> methods, InterfaceDecl intDecl) {
 
-               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
                        List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
                        print(checkAndGetCplusType(intDecl.getMethodType(method)) + " " +
                                intDecl.getMethodId(method) + "(");
+                       for (int i = 0; i < methParams.size(); i++) {
+
+                               String paramType = returnGenericCallbackType(methPrmTypes.get(i));
+                               String methPrmType = checkAndGetCplusType(methPrmTypes.get(i));
+                               String methParamComplete = checkAndGetCplusArray(methPrmType, methParams.get(i));
+                               print(methParamComplete);
+                               // Check if this is the last element (don't print a comma)
+                               if (i != methParams.size() - 1) {
+                                       print(", ");
+                               }
+                       }
+                       println(");");
+               }
+       }
+
+
+       /**
+        * HELPER: writeMethodCplusStub() writes the methods of the stub
+        */
+       private void writeMethodCplusStub(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses, String newStubClass) {
+
+               for (String method : methods) {
+
+                       List<String> methParams = intDecl.getMethodParams(method);
+                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+                       // Print the mutex lock first
+                       int methodNumId = intDecl.getMethodNumId(method);
+                       String mutexVar = "mtx" + newStubClass + "MethodExec" + methodNumId;
+                       println("mutex " + mutexVar + ";");
+                       print(checkAndGetCplusType(intDecl.getMethodType(method)) + " " + newStubClass + "::" +
+                               intDecl.getMethodId(method) + "(");
                        boolean isCallbackMethod = false;
-                       String callbackType = null;
+                       Set<String> callbackType = new HashSet<String>();
                        for (int i = 0; i < methParams.size(); i++) {
 
                                String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                                // Check if this has callback object
                                if (callbackClasses.contains(paramType)) {
                                        isCallbackMethod = true;
-                                       callbackType = paramType;       
+                                       //callbackType = paramType;
+                                       callbackType.add(paramType);
                                        // Even if there're 2 callback arguments, we expect them to be of the same interface
                                }
                                String methPrmType = checkAndGetCplusType(methPrmTypes.get(i));
@@ -2672,50 +2596,67 @@ public class IoTCompiler {
                                }
                        }
                        println(") { ");
+                       println("lock_guard<mutex> guard(" + mutexVar + ");");
                        if (isCallbackMethod)
                                writeCallbackMethodBodyCplusStub(intDecl, methParams, methPrmTypes, method, callbackType);
                        writeStdMethodBodyCplusStub(intDecl, methParams, methPrmTypes, method, callbackType, isCallbackMethod);
                        println("}\n");
-                       // Write the init callback helper method
-                       if (isCallbackMethod && !isDefined) {
-                               writeInitCallbackCplusStub(callbackType, intDecl);
-                               writeInitCallbackSendInfoCplusStub(intDecl);
-                               isDefined = true;
-                       }
+
                }
        }
 
 
+       /**
+        * HELPER: writeCallbackInstantiationMethodBodyCplusStub() writes the callback object instantiation in the method of the stub class
+        */
+       private void writeCallbackInstantiationMethodBodyCplusStub(String paramIdent, String callbackType, int counter) {
+
+               println("auto it" + counter + " = IoTRMIUtil::mapSkel->find(" + paramIdent + ");");
+               println("if (it" + counter + " == IoTRMIUtil::mapSkel->end()) {");
+               println("int newObjIdSent = rmiComm->getObjectIdCounter();");
+               println("objIdSent" + counter + ".push_back(newObjIdSent);");
+               println("rmiComm->decrementObjectIdCounter();");
+               println(callbackType + "_Skeleton* skel" + counter + " = new " + callbackType + "_Skeleton(" + paramIdent + ", rmiComm, newObjIdSent);");
+               println("IoTRMIUtil::mapSkel->insert(make_pair(" + paramIdent + ", skel" + counter + "));");
+               println("IoTRMIUtil::mapSkelId->insert(make_pair(" + paramIdent + ", newObjIdSent));");
+               println("thread th" + counter + " (&" + callbackType + "_Skeleton::___waitRequestInvokeMethod, std::ref(skel" + counter + 
+                       "), std::ref(skel" + counter +"));");
+               println("th" + counter + ".detach();");
+               println("while(!skel" + counter + "->didInitWaitInvoke());");
+               println("}");
+               println("else");
+               println("{");
+               println("auto itId = IoTRMIUtil::mapSkelId->find(" + paramIdent + ");");
+               println("objIdSent" + counter + ".push_back(itId->second);");
+               println("}");
+       }
+
+
        /**
         * HELPER: writeCallbackMethodBodyCplusStub() writes the callback method of the stub class
         */
        private void writeCallbackMethodBodyCplusStub(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method, String callbackType) {
+                       List<String> methPrmTypes, String method, Set<String> callbackType) {
 
                // Check if this is single object, array, or list of objects
                boolean isArrayOrList = false;
                String callbackParam = null;
                for (int i = 0; i < methParams.size(); i++) {
-
                        String paramType = methPrmTypes.get(i);
                        if (checkCallbackType(paramType, callbackType)) { // Check if this has callback object
+                               println("vector<int> objIdSent" + i + ";");
                                String param = methParams.get(i);
-                               if (isArrayOrList(paramType, param)) {  // Generate loop
+                               if (isArrayOrList(paramType, param)) {  // Generate loop                                
                                        println("for (" + getGenericType(paramType) + "* cb : " + getSimpleIdentifier(param) + ") {");
-                                       println(callbackType + "_CallbackSkeleton* skel" + i + " = new " + callbackType + "_CallbackSkeleton(cb, objIdCnt++);");
+                                       writeCallbackInstantiationMethodBodyCplusStub("cb", returnGenericCallbackType(paramType), i);
                                        isArrayOrList = true;
                                        callbackParam = getSimpleIdentifier(param);
-                               } else
-                                       println(callbackType + "_CallbackSkeleton* skel" + i + " = new " + callbackType + "_CallbackSkeleton(" +
-                                               getSimpleIdentifier(param) + ", objIdCnt++);");
-                               println("vecCallbackObj.push_back(skel" + i + ");");
+                               } else {
+                                       writeCallbackInstantiationMethodBodyCplusStub(getSimpleIdentifier(param), returnGenericCallbackType(paramType), i);
+                               }
                                if (isArrayOrList)
                                        println("}");
-                               print("int ___paramCB" + i + " = ");
-                               if (isArrayOrList)
-                                       println(callbackParam + ".size();");
-                               else
-                                       println("1;");
+                               println("vector<int> ___paramCB" + i + " = objIdSent" + i + ";");
                        }
                }
        }
@@ -2750,7 +2691,7 @@ public class IoTCompiler {
        /**
         * HELPER: checkAndWriteEnumRetTypeCplusStub() writes the enum return type (convert from enum to int)
         */
-       private void checkAndWriteEnumRetTypeCplusStub(String retType) {
+       private void checkAndWriteEnumRetTypeCplusStub(String retType, String method, InterfaceDecl intDecl) {
 
                // Strips off array "[]" for return type
                String pureType = getSimpleArrayType(getGenericType(retType));
@@ -2761,7 +2702,8 @@ public class IoTCompiler {
                // Check if this is enum type
                        println("vector<int> retEnumInt;");
                        println("void* retObj = &retEnumInt;");
-                       println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
+                       println("rmiComm->remoteCall(objectId, methodId, paramCls, paramObj, numParam);");
+                       writeWaitForReturnValueCplus(method, intDecl, "rmiComm->getReturnValue(retType, retObj);");
                        if (isArrayOrList(retType, retType)) {  // An array or vector
                                println("int retLen = retEnumInt.size();");
                                println("vector<" + pureType + "> retVal(retLen);");
@@ -2793,7 +2735,7 @@ public class IoTCompiler {
                                int methodNumId = intDecl.getMethodNumId(method);
                                String helperMethod = methodNumId + "struct" + i;
                                println("int methodIdStruct" + i + " = " + intDecl.getHelperMethodNumId(helperMethod) + ";");
-                               println("string retTypeStruct" + i + " = \"void\";");
+                               //println("string retTypeStruct" + i + " = \"void\";");
                                println("string paramClsStruct" + i + "[] = { \"int\" };");
                                print("int structLen" + i + " = ");
                                if (isArrayOrList(paramType, param)) {  // An array
@@ -2802,10 +2744,10 @@ public class IoTCompiler {
                                        println("1;");
                                }
                                println("void* paramObjStruct" + i + "[] = { &structLen" + i + " };");
-                               println("void* retStructLen" + i + " = NULL;");
-                               println("rmiCall->remoteCall(objectId, methodIdStruct" + i + 
-                                               ", retTypeStruct" + i + ", paramClsStruct" + i + ", paramObjStruct" + i + 
-                                               ", numParam" + i + ", retStructLen" + i + ");\n");
+                               //println("void* retStructLen" + i + " = NULL;");
+                               println("rmiComm->remoteCall(objectId, methodIdStruct" + i + 
+                                               ", paramClsStruct" + i + ", paramObjStruct" + i + 
+                                               ", numParam" + i + ");\n");
                        }
                }
        }
@@ -2873,7 +2815,7 @@ public class IoTCompiler {
        /**
         * HELPER: writeStructParamClassCplusStub() writes member parameters of struct
         */
-       private void writeStructParamClassCplusStub(List<String> methParams, List<String> methPrmTypes, String callbackType) {
+       private void writeStructParamClassCplusStub(List<String> methParams, List<String> methPrmTypes, Set<String> callbackType) {
 
                print("int numParam = ");
                writeLengthStructParamClassCplusStub(methParams, methPrmTypes);
@@ -2936,13 +2878,14 @@ public class IoTCompiler {
        /**
         * HELPER: writeStructReturnCplusStub() writes member parameters of struct for return statement
         */
-       private void writeStructReturnCplusStub(String simpleType, String retType) {
+       private void writeStructReturnCplusStub(String simpleType, String retType, String method, InterfaceDecl intDecl) {
 
                // Minimum retLen is 1 if this is a single struct object
                println("int retLen = 0;");
                println("void* retLenObj = { &retLen };");
                // Handle the returned struct!!!
-               println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retLenObj);");
+               println("rmiComm->remoteCall(objectId, methodId, paramCls, paramObj, numParam);");
+               writeWaitForReturnValueCplus(method, intDecl, "rmiComm->getReturnValue(retType, retLenObj);");
                int numMem = getNumOfMembers(simpleType);
                println("int numRet = " + numMem + "*retLen;");
                println("string retCls[numRet];");
@@ -2981,7 +2924,8 @@ public class IoTCompiler {
                                println("retObj[retPos++] = &retParam" + i + ";");
                        }
                }
-               println("rmiCall->getStructObjects(retCls, numRet, retObj);");
+               //println("rmiComm->getStructObjects(retCls, numRet, retObj);");
+               writeWaitForReturnValueCplus(method, intDecl, "rmiComm->getStructObjects(retCls, numRet, retObj);");
                if (isArrayOrList(retType, retType)) {  // An array or list
                        println("vector<" + simpleType + "> structRet(retLen);");
                } else
@@ -2990,11 +2934,25 @@ public class IoTCompiler {
        }
 
 
+       /**
+        * HELPER: writeWaitForReturnValueCplus() writes the synchronization part for return values
+        */
+       private void writeWaitForReturnValueCplus(String method, InterfaceDecl intDecl, String getReturnValue) {
+
+               println("// Waiting for return value");         
+               int methodNumId = intDecl.getMethodNumId(method);
+               println("while (!retValueReceived" + methodNumId + ");");
+               println(getReturnValue);
+               println("retValueReceived" + methodNumId + " = false;");
+               println("didGetReturnBytes.exchange(true);\n");
+       }
+
+
        /**
         * HELPER: writeStdMethodBodyCplusStub() writes the standard method body in the stub class
         */
        private void writeStdMethodBodyCplusStub(InterfaceDecl intDecl, List<String> methParams,
-                       List<String> methPrmTypes, String method, String callbackType, boolean isCallbackMethod) {
+                       List<String> methPrmTypes, String method, Set<String> callbackType, boolean isCallbackMethod) {
 
                checkAndWriteStructSetupCplusStub(methParams, methPrmTypes, intDecl, method);
                println("int methodId = " + intDecl.getMethodNumId(method) + ";");
@@ -3010,7 +2968,7 @@ public class IoTCompiler {
                        for (int i = 0; i < methParams.size(); i++) {
                                String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                                if (checkCallbackType(paramType, callbackType)) {
-                                       print("\"int\"");
+                                       print("\"int*\"");
                                } else {
                                        String paramTypeC = checkAndGetCplusArgClsType(methPrmTypes.get(i), methParams.get(i));
                                        print("\"" + paramTypeC + "\"");
@@ -3038,16 +2996,15 @@ public class IoTCompiler {
                }
                // Check if this is "void"
                if (retType.equals("void")) {
-                       println("void* retObj = NULL;");
-                       println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
+                       println("rmiComm->remoteCall(objectId, methodId, paramCls, paramObj, numParam);");
                } else { // We do have a return value
                        // Generate array of parameter types
                        if (isStructClass(getGenericType(getSimpleArrayType(retType)))) {
-                               writeStructReturnCplusStub(getGenericType(getSimpleArrayType(retType)), retType);
+                               writeStructReturnCplusStub(getGenericType(getSimpleArrayType(retType)), retType, method, intDecl);
                        } else {
                        // Check if the return value NONPRIMITIVES
                                if (isEnumClass(getSimpleArrayType(getGenericType(retType)))) {
-                                       checkAndWriteEnumRetTypeCplusStub(retType);
+                                       checkAndWriteEnumRetTypeCplusStub(retType, method, intDecl);
                                } else {
                                        //if (getParamCategory(retType) == ParamCategory.NONPRIMITIVES)
                                        if (isArrayOrList(retType,retType))
@@ -3056,7 +3013,8 @@ public class IoTCompiler {
                                                println(checkAndGetCplusType(retType) + " retVal = " + generateCplusInitializer(retType) + ";");
                                        }
                                        println("void* retObj = &retVal;");
-                                       println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
+                                       println("rmiComm->remoteCall(objectId, methodId, paramCls, paramObj, numParam);");
+                                       writeWaitForReturnValueCplus(method, intDecl, "rmiComm->getReturnValue(retType, retObj);");
                                        println("return retVal;");
                                }
                        }
@@ -3065,7 +3023,7 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writePropertiesCplusStub() writes the properties of the stub class
+        * HELPER: writePropertiesCplusPermission() writes the properties of the stub class
         */
        private void writePropertiesCplusPermission(String intface) {
 
@@ -3073,7 +3031,6 @@ public class IoTCompiler {
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
                        int newObjectId = getNewIntfaceObjectId(newIntface);
-                       println("const static int object" + newObjectId + "Id = " + newObjectId + ";\t//" + newIntface);
                        println("static set<int> set" + newObjectId + "Allowed;");
                }
        }       
@@ -3081,26 +3038,21 @@ public class IoTCompiler {
        /**
         * HELPER: writePropertiesCplusStub() writes the properties of the stub class
         */
-       private void writePropertiesCplusStub(String intface, String newIntface, boolean callbackExist, Set<String> callbackClasses) {
+       private void writePropertiesCplusStub(String intface, String newIntface, boolean callbackExist, 
+                       Set<String> callbackClasses, Set<String> methods, InterfaceDecl intDecl) {
 
-               println("IoTRMICall *rmiCall;");
-               println("string callbackAddress;");
-               println("vector<int> ports;\n");
+               println("IoTRMIComm *rmiComm;");
                // Get the object Id
                Integer objId = mapIntfaceObjId.get(intface);
-               println("const static int objectId = " + objId + ";");
-               mapNewIntfaceObjId.put(newIntface, objId);
-               mapIntfaceObjId.put(intface, objId++);
-               if (callbackExist) {
-               // We assume that each class only has one callback interface for now
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       println("// Callback properties");
-                       println("IoTRMIObject *rmiObj;");
-                       println("vector<" + callbackType + "*> vecCallbackObj;");
-                       println("static int objIdCnt;");
-                       // Generate permission stuff for callback stubs
-                       writePropertiesCplusPermission(callbackType);
+               println("int objectId = " + objId + ";");
+               println("// Synchronization variables");
+               for (String method : methods) {
+                       // Generate AtomicBooleans for methods that have return values
+                       String returnType = intDecl.getMethodType(method);
+                       int methodNumId = intDecl.getMethodNumId(method);
+                       if (!returnType.equals("void")) {
+                               println("bool retValueReceived" + methodNumId + " = false;");
+                       }
                }
                println("\n");
        }
@@ -3109,141 +3061,67 @@ public class IoTCompiler {
        /**
         * HELPER: writeConstructorCplusStub() writes the constructor of the stub class
         */
-       private void writeConstructorCplusStub(String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
+       private void writeConstructorCplusStub(String newStubClass, boolean callbackExist, 
+                       Set<String> callbackClasses, Set<String> methods, InterfaceDecl intDecl) {
 
-               println(newStubClass + 
-                       "(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, _skeletonAddress, _rev, _bResult);");
-               if (callbackExist) {
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       println("thread th1 (&" + newStubClass + "::___initCallBack, this);");
-                       println("th1.detach();");
-                       println("___regCB();");
+               println(newStubClass + "::" + newStubClass +
+                       "(int _portSend, int _portRecv, const char* _skeletonAddress, int _rev, bool* _bResult) {");
+               println("rmiComm = new IoTRMICommClient(_portSend, _portRecv, _skeletonAddress, _rev, _bResult);");
+               // Register the AtomicBoolean variables
+               for (String method : methods) {
+                       // Generate AtomicBooleans for methods that have return values
+                       String returnType = intDecl.getMethodType(method);
+                       int methodNumId = intDecl.getMethodNumId(method);
+                       if (!returnType.equals("void")) {
+                               println("rmiComm->registerStub(objectId, " + methodNumId + ", &retValueReceived" + methodNumId + ");");
+                       }
                }
+               println("IoTRMIUtil::mapStub->insert(make_pair(objectId, this));");
                println("}\n");
        }
 
 
        /**
-        * HELPER: writeDeconstructorCplusStub() writes the deconstructor of the stub class
-        */
-       private void writeDeconstructorCplusStub(String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
-
-               println("~" + newStubClass + "() {");
-               println("if (rmiCall != NULL) {");
-               println("delete rmiCall;");
-               println("rmiCall = NULL;");
-               println("}");
-               if (callbackExist) {
-               // We assume that each class only has one callback interface for now
-                       println("if (rmiObj != NULL) {");
-                       println("delete rmiObj;");
-                       println("rmiObj = NULL;");
-                       println("}");
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       println("for(" + callbackType + "* cb : vecCallbackObj) {");
-                       println("delete cb;");
-                       println("cb = NULL;");
-                       println("}");
-               }
-               println("}");
-               println("");
-       }
-
-
-       /**
-        * HELPER: writeCplusMethodCallbackPermission() writes permission checks in stub for callbacks
+        * HELPER: writeCallbackConstructorCplusStub() writes the callback constructor of the stub class
         */
-       private void writeCplusMethodCallbackPermission(String intface) {
+       private void writeCallbackConstructorCplusStub(String newStubClass, boolean callbackExist, 
+                       Set<String> callbackClasses, Set<String> methods, InterfaceDecl intDecl) {
 
-               println("int methodId = IoTRMIObject::getMethodId(method);");
-               // Get all the different stubs
-               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("if (set" + newObjectId + "Allowed.find(methodId) == set" + newObjectId + "Allowed.end()) {");
-                       println("cerr << \"Callback object for " + intface + " is not allowed to access method: \" << methodId;");
-                       println("return;");
-                       println("}");
+               println(newStubClass + "::" + newStubClass + "(IoTRMIComm* _rmiComm, int _objectId) {");
+               println("rmiComm = _rmiComm;");
+               println("objectId = _objectId;");
+               // Register the AtomicBoolean variables
+               for (String method : methods) {
+                       // Generate AtomicBooleans for methods that have return values
+                       String returnType = intDecl.getMethodType(method);
+                       int methodNumId = intDecl.getMethodNumId(method);
+                       if (!returnType.equals("void")) {
+                               println("rmiComm->registerStub(objectId, " + methodNumId + ", &retValueReceived" + methodNumId + ");");
+                       }
                }
+               println("}\n");
        }
 
 
        /**
-        * HELPER: writeInitCallbackCplusStub() writes the initialization of callback
+        * HELPER: writeDeconstructorCplusStub() writes the deconstructor of the stub class
         */
-       private void writeInitCallbackCplusStub(String intface, InterfaceDecl intDecl) {
+       private void writeDeconstructorCplusStub(String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
 
-               println("void ___initCallBack() {");
-               println("bool bResult = false;");
-               println("rmiObj = new IoTRMIObject(ports[0], &bResult);");
-               println("while (true) {");
-               println("char* method = rmiObj->getMethodBytes();");
-               writeCplusMethodCallbackPermission(intface);
-               println("int objId = IoTRMIObject::getObjectId(method);");
-               println("if (objId < vecCallbackObj.size()) {   // Check if still within range");
-               println(intface + "_CallbackSkeleton* skel = dynamic_cast<" + intface + 
-                       "_CallbackSkeleton*> (vecCallbackObj.at(objId));");
-               println("skel->invokeMethod(rmiObj);");
-               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("return;");
+               println(newStubClass + "::~" + newStubClass + "() {");
+               println("if (rmiComm != NULL) {");
+               println("delete rmiComm;");
+               println("rmiComm = NULL;");
                println("}");
                println("}");
-               println("}\n");
-       }
-
-
-       /**
-        * 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) {
-
-               // Generate info sending part
-               println("void ___regCB() {");
-               println("int numParam = 3;");
-               String method = "___initCallBack()";
-               int methodNumId = intDecl.getHelperMethodNumId(method);
-               println("int methodId = " + methodNumId + ";");
-               println("string retType = \"void\";");
-               println("string paramCls[] = { \"int\", \"String\", \"int\" };");
-               println("int rev = 0;");
-               println("void* paramObj[] = { &ports[0], &callbackAddress, &rev };");
-               println("void* retObj = NULL;");
-               println("rmiCall->remoteCall(objectId, methodId, retType, paramCls, paramObj, numParam, retObj);");
-               println("}\n");
+               println("");
        }
 
 
        /**
-        * generateCPlusStubClasses() generate stubs based on the methods list in C++
+        * generateCPlusStubClassesHpp() generate stubs based on the methods list in C++ (.hpp file)
         */
-       public void generateCPlusStubClasses() throws IOException {
+       public void generateCPlusStubClassesHpp() throws IOException {
 
                // Create a new directory
                String path = createDirectories(dir, subdir);
@@ -3266,30 +3144,25 @@ public class IoTCompiler {
                                InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
                                Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
                                boolean callbackExist = !callbackClasses.isEmpty();
-                               if (callbackExist)      // Need thread library if this has callback
-                                       println("#include <thread>");
+                               println("#include <thread>");
+                               println("#include <mutex>");
+                               List<String> stdIncludeClasses = getStandardCplusIncludeClasses();
+                               printIncludeStatements(stdIncludeClasses); println("");
                                println("#include \"" + newIntface + ".hpp\""); println("");            
                                println("using namespace std;"); println("");
                                println("class " + newStubClass + " : public " + newIntface); println("{");
                                println("private:\n");
-                               writePropertiesCplusStub(intface, newIntface, callbackExist, callbackClasses);
+                               writePropertiesCplusStub(intface, newIntface, callbackExist, callbackClasses, methods, intDecl);
                                println("public:\n");
                                // Add default constructor and destructor
-                               println(newStubClass + "() { }"); println("");
-                               writeConstructorCplusStub(newStubClass, callbackExist, callbackClasses);
-                               writeDeconstructorCplusStub(newStubClass, callbackExist, callbackClasses);
+                               println(newStubClass + "();");
+                               // Declarations
+                               println(newStubClass + "(int _portSend, int _portRecv, const char* _skeletonAddress, int _rev, bool* _bResult);");
+                               println(newStubClass + "(IoTRMIComm* _rmiComm, int _objectId);");
+                               println("~" + newStubClass + "();");
                                // Write methods
-                               writeMethodCplusStub(methods, intDecl, callbackClasses);
+                               writeMethodDeclCplusStub(methods, intDecl);
                                print("}"); println(";");
-                               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...");
@@ -3299,53 +3172,31 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writePropertiesCplusCallbackStub() writes the properties of the stub class
+        * writeStubExternalCFunctions() generate external functions for .so file
         */
-       private void writePropertiesCplusCallbackStub(String intface, String newIntface, boolean callbackExist, Set<String> callbackClasses) {
+       public void writeStubExternalCFunctions(String newStubClass) throws IOException {
 
-               println("IoTRMICall *rmiCall;");
-               // Get the object Id
-               println("int objectId;");
-               if (callbackExist) {
-               // We assume that each class only has one callback interface for now
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       println("// Callback properties");
-                       println("IoTRMIObject *rmiObj;");
-                       println("vector<" + callbackType + "*> vecCallbackObj;");
-                       println("static int objIdCnt;");
-                       // TODO: Need to initialize address and ports if we want to have callback-in-callback
-                       println("string address;");
-                       println("vector<int> ports;\n");
-                       writePropertiesCplusPermission(callbackType);
-               }
-               println("\n");
-       }
-
-
-       /**
-        * HELPER: writeConstructorCplusCallbackStub() writes the constructor of the stub class
-        */
-       private void writeConstructorCplusCallbackStub(String newStubClass, boolean callbackExist, Set<String> callbackClasses) {
-
-               println(newStubClass + "(IoTRMICall* _rmiCall, int _objectId) {");
-               println("objectId = _objectId;");
-               println("rmiCall = _rmiCall;");
-               if (callbackExist) {
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       println("thread th1 (&" + newStubClass + "::___initCallBack, this);");
-                       println("th1.detach();");
-                       println("___regCB();");
-               }
+               println("extern \"C\" void* create" + newStubClass + "(void** params) {");
+               println("// Args: int _portSend, int _portRecv, const char* _skeletonAddress, int _rev, bool* _bResult");
+               println("return new " + newStubClass + "(*((int*) params[0]), *((int*) params[1]), ((string*) params[2])->c_str(), " + 
+                       "*((int*) params[3]), (bool*) params[4]);");
+               println("}\n");
+               println("extern \"C\" void destroy" + newStubClass + "(void* t) {");
+               println(newStubClass + "* obj = (" + newStubClass + "*) t;");
+               println("delete obj;");
+               println("}\n");
+               println("extern \"C\" void init" + newStubClass + "(void* t) {");
+               //println(newStubClass + "* obj = (" + newStubClass + "*) t;");
+               //println("obj->init();");
+               //println("while(true);");
                println("}\n");
        }
 
 
        /**
-        * generateCPlusCallbackStubClasses() generate callback stubs based on the methods list in C++
+        * generateCPlusStubClassesCpp() generate stubs based on the methods list in C++ (.cpp file)
         */
-       public void generateCPlusCallbackStubClasses() throws IOException {
+       public void generateCPlusStubClassesCpp() throws IOException {
 
                // Create a new directory
                String path = createDirectories(dir, subdir);
@@ -3355,46 +3206,42 @@ public class IoTCompiler {
                        for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                                // Open a new file to write into
                                String newIntface = intMeth.getKey();
-                               String newStubClass = newIntface + "_CallbackStub";
-                               FileWriter fw = new FileWriter(path + "/" + newStubClass + ".hpp");
+                               String newStubClass = newIntface + "_Stub";
+                               FileWriter fw = new FileWriter(path + "/" + newStubClass + ".cpp");
                                pw = new PrintWriter(new BufferedWriter(fw));
+                               // Write file headers
+                               println("#include <iostream>");
                                // Find out if there are callback objects
                                Set<String> methods = intMeth.getValue();
                                DeclarationHandler decHandler = mapIntDeclHand.get(intface);
                                InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
                                Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
                                boolean callbackExist = !callbackClasses.isEmpty();
-                               // Write file headers
-                               println("#ifndef _" + newStubClass.toUpperCase() + "_HPP__");
-                               println("#define _" + newStubClass.toUpperCase() + "_HPP__");
-                               println("#include <iostream>");
-                               if (callbackExist)
-                                       println("#include <thread>");
-                               println("#include \"" + newIntface + ".hpp\""); println("");            
+                               println("#include \"" + newStubClass + ".hpp\""); println("");
+                               for(String str: callbackClasses) {
+                                       if (intface.equals(mainClass))
+                                               println("#include \"" + str + "_Skeleton.cpp\"\n");
+                                       else
+                                               println("#include \"" + str + "_Skeleton.hpp\"\n");
+                               }
                                println("using namespace std;"); println("");
-                               println("class " + newStubClass + " : public " + newIntface); println("{");
-                               println("private:\n");
-                               writePropertiesCplusCallbackStub(intface, newIntface, callbackExist, callbackClasses);
-                               println("public:\n");
                                // Add default constructor and destructor
-                               println(newStubClass + "() { }"); println("");
-                               writeConstructorCplusCallbackStub(newStubClass, callbackExist, callbackClasses);
+                               //println(newStubClass + "() { }"); println("");
+                               writeConstructorCplusStub(newStubClass, callbackExist, callbackClasses, methods, intDecl);
+                               writeCallbackConstructorCplusStub(newStubClass, callbackExist, callbackClasses, methods, intDecl);
                                writeDeconstructorCplusStub(newStubClass, callbackExist, callbackClasses);
                                // Write methods
-                               writeMethodCplusStub(methods, intDecl, callbackClasses);
-                               println("};");
-                               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);
+                               writeMethodCplusStub(methods, intDecl, callbackClasses, newStubClass);
+                               // Write external functions for .so file
+                               writeStubExternalCFunctions(newStubClass);
+                               // TODO: Remove this later
+                               if (intface.equals(mainClass)) {
+                                       println("int main() {");
+                                       println("return 0;");
+                                       println("}");
                                }
-                               writeObjectIdCountInitializationCplus(newStubClass, callbackExist);
-                               println("#endif");
                                pw.close();
-                               System.out.println("IoTCompiler: Generated callback stub class " + newIntface + ".hpp...");
+                               System.out.println("IoTCompiler: Generated stub class " + newStubClass + ".cpp...");
                        }
                }
        }
@@ -3406,19 +3253,16 @@ public class IoTCompiler {
        private void writePropertiesCplusSkeleton(String intface, boolean callbackExist, Set<String> callbackClasses) {
 
                println(intface + " *mainObj;");
-               // Callback
-               if (callbackExist) {
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       String exchangeType = checkAndGetParamClass(callbackType);
-                       println("// Callback properties");
-                       println("static int objIdCnt;");
-                       println("vector<" + exchangeType + "*> vecCallbackObj;");
-                       println("IoTRMICall *rmiCall;");
-               }
-               println("IoTRMIObject *rmiObj;\n");
+               println("IoTRMIComm *rmiComm;");
+               println("char* methodBytes;");
+               println("int methodLen;");
+               Integer objId = mapIntfaceObjId.get(intface);
+               println("int objectId = " + objId + ";");
                // Keep track of object Ids of all stubs registered to this interface
                writePropertiesCplusPermission(intface);
+               println("// Synchronization variables");
+               println("bool methodReceived = false;");
+               println("bool didAlreadyInitWaitInvoke = false;");
                println("\n");
        }
 
@@ -3496,13 +3340,32 @@ public class IoTCompiler {
         */
        private void writeConstructorCplusSkeleton(String newSkelClass, String intface, boolean callbackExist, InterfaceDecl intDecl, Collection<String> methods) {
 
-               println(newSkelClass + "(" + intface + " *_mainObj, int _port) {");
+               println(newSkelClass + "::" + newSkelClass + "(" + intface + " *_mainObj, int _portSend, int _portRecv) {");
                println("bool _bResult = false;");
                println("mainObj = _mainObj;");
-               println("rmiObj = new IoTRMIObject(_port, &_bResult);");
-               writeCplusInitCallbackPermission(intface, intDecl, callbackExist);
+               println("rmiComm = new IoTRMICommServer(_portSend, _portRecv, &_bResult);");
+               println("IoTRMIUtil::mapSkel->insert(make_pair(_mainObj, this));");
+               println("IoTRMIUtil::mapSkelId->insert(make_pair(_mainObj, objectId));");
+               println("rmiComm->registerSkeleton(objectId, &methodReceived);");
+               writeStructPermissionCplusSkeleton(methods, intDecl, intface);
+               println("thread th1 (&" + newSkelClass + "::___waitRequestInvokeMethod, this, this);");
+               println("th1.join();");
+               println("}\n");
+       }
+
+
+       /**
+        * HELPER: writeCallbackConstructorCplusSkeleton() writes the callback constructor of the skeleton class
+        */
+       private void writeCallbackConstructorCplusSkeleton(String newSkelClass, String intface, boolean callbackExist, InterfaceDecl intDecl, Collection<String> methods) {
+
+               println(newSkelClass + "::" + newSkelClass + "(" + intface + " *_mainObj, IoTRMIComm *_rmiComm, int _objectId) {");
+               println("bool _bResult = false;");
+               println("mainObj = _mainObj;");
+               println("rmiComm = _rmiComm;");
+               println("objectId = _objectId;");
+               println("rmiComm->registerSkeleton(objectId, &methodReceived);");
                writeStructPermissionCplusSkeleton(methods, intDecl, intface);
-               println("___waitRequestInvokeMethod();");
                println("}\n");
        }
 
@@ -3512,25 +3375,11 @@ public class IoTCompiler {
         */
        private void writeDeconstructorCplusSkeleton(String newSkelClass, boolean callbackExist, Set<String> callbackClasses) {
 
-               println("~" + newSkelClass + "() {");
-               println("if (rmiObj != NULL) {");
-               println("delete rmiObj;");
-               println("rmiObj = NULL;");
+               println(newSkelClass + "::~" + newSkelClass + "() {");
+               println("if (rmiComm != NULL) {");
+               println("delete rmiComm;");
+               println("rmiComm = NULL;");
                println("}");
-               if (callbackExist) {
-               // We assume that each class only has one callback interface for now
-                       println("if (rmiCall != NULL) {");
-                       println("delete rmiCall;");
-                       println("rmiCall = NULL;");
-                       println("}");
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       String exchangeType = checkAndGetParamClass(callbackType);
-                       println("for(" + exchangeType + "* cb : vecCallbackObj) {");
-                       println("delete cb;");
-                       println("cb = NULL;");
-                       println("}");
-               }
                println("}");
                println("");
        }
@@ -3553,56 +3402,61 @@ public class IoTCompiler {
                                print(", ");
                        }
                }
-               println(");");
-       }
-
-
-       /**
-        * HELPER: writeInitCallbackCplusSkeleton() writes the init callback method for skeleton class
-        */
-       private void writeInitCallbackCplusSkeleton(boolean callbackSkeleton) {
-
-               // This is a callback skeleton generation
-               if (callbackSkeleton)
-                       println("void ___regCB(IoTRMIObject* rmiObj) {");
-               else
-                       println("void ___regCB() {");
-               println("int numParam = 3;");
-               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");
+               println(");");
+       }
+
+
+       /**
+        * HELPER: writeMethodDeclCplusSkeleton() writes the method declaration of the skeleton class
+        */
+       private void writeMethodDeclCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, 
+                       Set<String> callbackClasses) {
+
+               for (String method : methods) {
+
+                       List<String> methParams = intDecl.getMethodParams(method);
+                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+                       String methodId = intDecl.getMethodId(method);
+                       String methodType = checkAndGetCplusType(intDecl.getMethodType(method));
+                       print(methodType + " " + methodId + "(");
+                       boolean isCallbackMethod = false;
+                       String callbackType = null;
+                       for (int i = 0; i < methParams.size(); i++) {
+
+                               String origParamType = methPrmTypes.get(i);
+                               if (callbackClasses.contains(origParamType)) { // Check if this has callback object
+                                       isCallbackMethod = true;
+                                       callbackType = origParamType;   
+                               }
+                               String paramType = checkAndGetParamClass(methPrmTypes.get(i));
+                               String methPrmType = checkAndGetCplusType(paramType);
+                               String methParamComplete = checkAndGetCplusArray(methPrmType, methParams.get(i));
+                               print(methParamComplete);
+                               // Check if this is the last element (don't print a comma)
+                               if (i != methParams.size() - 1) {
+                                       print(", ");
+                               }
+                       }
+                       println(");");
+               }
        }
 
 
        /**
         * HELPER: writeMethodCplusSkeleton() writes the method of the skeleton class
         */
-       private void writeMethodCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, 
-                       Set<String> callbackClasses, boolean callbackSkeleton) {
+       private void writeMethodCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, String newSkelClass) {
 
-               boolean isDefined = false;
                for (String method : methods) {
 
                        List<String> methParams = intDecl.getMethodParams(method);
                        List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
                        String methodId = intDecl.getMethodId(method);
                        String methodType = checkAndGetCplusType(intDecl.getMethodType(method));
-                       print(methodType + " " + methodId + "(");
-                       boolean isCallbackMethod = false;
-                       String callbackType = null;
+                       print(methodType + " " + newSkelClass + "::" + methodId + "(");
                        for (int i = 0; i < methParams.size(); i++) {
 
                                String origParamType = methPrmTypes.get(i);
-                               if (callbackClasses.contains(origParamType)) { // Check if this has callback object
-                                       isCallbackMethod = true;
-                                       callbackType = origParamType;   
-                               }
                                String paramType = checkAndGetParamClass(methPrmTypes.get(i));
                                String methPrmType = checkAndGetCplusType(paramType);
                                String methParamComplete = checkAndGetCplusArray(methPrmType, methParams.get(i));
@@ -3616,10 +3470,6 @@ public class IoTCompiler {
                        // Now, write the body of skeleton!
                        writeStdMethodBodyCplusSkeleton(methParams, methodId, intDecl.getMethodType(method));
                        println("}\n");
-                       if (isCallbackMethod && !isDefined) {
-                               writeInitCallbackCplusSkeleton(callbackSkeleton);
-                               isDefined = true;
-                       }
                }
        }
 
@@ -3627,22 +3477,42 @@ public class IoTCompiler {
        /**
         * HELPER: writeCallbackCplusNumStubs() writes the numStubs variable
         */
-       private void writeCallbackCplusNumStubs(List<String> methParams, List<String> methPrmTypes, String callbackType) {
+       private void writeCallbackCplusNumStubs(List<String> methParams, List<String> methPrmTypes, Set<String> callbackType) {
 
                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("int numStubs" + i + " = 0;");
+                               //println("int numStubs" + i + " = 0;");
+                               println("vector<int> numStubIdArray" + i + ";");
                }
        }
 
 
+       /**
+        * HELPER: writeCallbackInstantiationCplusStubGeneration() writes the instantiation of callback stubs
+        */
+       private void writeCallbackInstantiationCplusStubGeneration(String exchParamType, int counter) {
+
+               println(exchParamType + "* newStub" + counter + " = NULL;");
+               println("auto it" + counter + " = IoTRMIUtil::mapStub->find(objIdRecv" + counter + ");");
+               println("if (it" + counter + " == IoTRMIUtil::mapStub->end()) {");
+               println("newStub" + counter + " = new " + exchParamType + "_Stub(rmiComm, objIdRecv" + counter + ");");
+               println("IoTRMIUtil::mapStub->insert(make_pair(objIdRecv" + counter + ", newStub" + counter + "));");
+               println("rmiComm->setObjectIdCounter(objIdRecv" + counter + ");");
+               println("rmiComm->decrementObjectIdCounter();");
+               println("}");
+               println("else {");
+               println("newStub" + counter + " = (" + exchParamType + "_Stub*) it" + counter + "->second;");
+               println("}");
+       }
+
+
        /**
         * HELPER: writeCallbackCplusStubGeneration() writes the callback stub generation part
         */
-       private void writeCallbackCplusStubGeneration(List<String> methParams, List<String> methPrmTypes, String callbackType) {
+       private void writeCallbackCplusStubGeneration(List<String> methParams, List<String> methPrmTypes, Set<String> callbackType) {
 
                // Iterate over callback objects
                for (int i = 0; i < methParams.size(); i++) {
@@ -3653,16 +3523,15 @@ public class IoTCompiler {
                                String exchParamType = checkAndGetParamClass(getGenericType(paramType));
                                if (isArrayOrList(paramType, param)) {
                                        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" + i + ");");
-                                       println("vecCallbackObj.push_back(cb" + i + ");");
-                                       println("objIdCnt++;");
+                                       println("for (int i = 0; i < numStubIdArray" + i + ".size(); i++) {");
+                                       println("int objIdRecv" + i + " = numStubIdArray" + i + "[i];");
+                                       writeCallbackInstantiationCplusStubGeneration(exchParamType, i);
+                                       println("stub" + i + ".push_back(newStub" + i + ");");
                                        println("}");
                                } else {
-                                       println(exchParamType + "* stub" + i + " = new " + exchParamType + "_CallbackStub(rmiCall, objIdCnt);");
-                                       println("vecCallbackObj.push_back(stub" + i + ");");
-                                       println("objIdCnt++;");
+                                       println("int objIdRecv" + i + " = numStubIdArray" + i + "[0];");
+                                       writeCallbackInstantiationCplusStubGeneration(exchParamType, i);
+                                       println(exchParamType + "* stub" + i + " = newStub" + i + ";");
                                }
                        }
                }
@@ -3752,10 +3621,10 @@ public class IoTCompiler {
         * 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,
+                       List<String> methPrmTypes, String method, boolean isCallbackMethod, Set<String> callbackType,
                        String methodId, Set<String> callbackClasses) {
 
-               println("rmiObj->getMethodParams(paramCls, numParam, paramObj);");
+               println("rmiComm->getMethodParams(paramCls, numParam, paramObj, localMethodBytes);");
                if (isCallbackMethod)
                        writeCallbackCplusStubGeneration(methParams, methPrmTypes, callbackType);
                checkAndWriteEnumTypeCplusSkeleton(methParams, methPrmTypes);
@@ -3783,9 +3652,9 @@ public class IoTCompiler {
                                        println("void* retObj = &retVal;");
                        String retTypeC = checkAndGetCplusType(retType);
                        if (isStructClass(getSimpleArrayType(getGenericType(retType)))) // Struct type
-                               println("rmiObj->sendReturnObj(retObj, retCls, numRetObj);");
+                               println("rmiComm->sendReturnObj(retObj, retCls, numRetObj, localMethodBytes);");
                        else
-                               println("rmiObj->sendReturnObj(retObj, \"" + checkAndGetCplusRetClsType(getEnumType(retType)) + "\");");
+                               println("rmiComm->sendReturnObj(retObj, \"" + checkAndGetCplusRetClsType(getEnumType(retType)) + "\", localMethodBytes);");
                }
        }
 
@@ -3798,14 +3667,16 @@ public class IoTCompiler {
 
                // Generate array of parameter types
                boolean isCallbackMethod = false;
-               String callbackType = null;
+               //String callbackType = null;
+               Set<String> callbackType = new HashSet<String>();
                print("string paramCls[] = { ");
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                        if (callbackClasses.contains(paramType)) {
                                isCallbackMethod = true;
-                               callbackType = paramType;
-                               print("\"int\"");
+                               //callbackType = paramType;
+                               callbackType.add(paramType);
+                               print("\"int*\"");
                        } else {        // Generate normal classes if it's not a callback object
                                String paramTypeC = checkAndGetCplusArgClsType(methPrmTypes.get(i), methParams.get(i));
                                print("\"" + paramTypeC + "\"");
@@ -3838,7 +3709,7 @@ public class IoTCompiler {
                for (int i = 0; i < methParams.size(); i++) {
                        String paramType = returnGenericCallbackType(methPrmTypes.get(i));
                        if (callbackClasses.contains(paramType))
-                               print("&numStubs" + i);
+                               print("&numStubIdArray" + i);
                        else if (isEnumClass(getGenericType(paramType)))        // Check if this is enum type
                                print("&paramEnumInt" + i);
                        else
@@ -3951,7 +3822,7 @@ public class IoTCompiler {
                else    // Just single struct object
                        println("int retLen = 1;");
                println("void* retLenObj = &retLen;");
-               println("rmiObj->sendReturnObj(retLenObj, \"int\");");
+               println("rmiComm->sendReturnObj(retLenObj, \"int\", localMethodBytes);");
                int numMem = getNumOfMembers(simpleType);
                println("int numRetObj = " + numMem + "*retLen;");
                println("string retCls[numRetObj];");
@@ -3992,7 +3863,7 @@ public class IoTCompiler {
 
                // Generate array of parameter objects
                boolean isCallbackMethod = false;
-               String callbackType = null;
+               Set<String> callbackType = new HashSet<String>();
                print("int numParam = ");
                writeLengthStructParamClassSkeleton(methParams, methPrmTypes, method, intDecl);
                println(";");
@@ -4010,10 +3881,12 @@ public class IoTCompiler {
                                String prmType = returnGenericCallbackType(methPrmTypes.get(i));
                                if (callbackClasses.contains(prmType)) {
                                        isCallbackMethod = true;
-                                       callbackType = prmType;
-                                       println("int numStubs" + i + " = 0;");
-                                       println("paramCls[pos] = \"int\";");
-                                       println("paramObj[pos++] = &numStubs" + i + ";");
+                                       //callbackType = prmType;
+                                       callbackType.add(prmType);
+                                       //println("int numStubs" + i + " = 0;");
+                                       println("vector<int> numStubIdArray" + i + ";");
+                                       println("paramCls[pos] = \"int*\";");
+                                       println("paramObj[pos++] = &numStubIdArray" + i + ";");
                                } else {        // Generate normal classes if it's not a callback object
                                        String paramTypeC = checkAndGetCplusType(methPrmTypes.get(i));
                                        if (isEnumClass(getGenericType(paramTypeC))) {  // Check if this is enum type
@@ -4038,9 +3911,9 @@ public class IoTCompiler {
 
 
        /**
-        * HELPER: writeMethodHelperCplusSkeleton() writes the method helper of the skeleton class
+        * HELPER: writeMethodHelperDeclCplusSkeleton() writes the method helper declarations of the skeleton class
         */
-       private void writeMethodHelperCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, Set<String> callbackClasses) {
+       private void writeMethodHelperDeclCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, String newSkelClass) {
 
                // Use this set to handle two same methodIds
                Set<String> uniqueMethodIds = new HashSet<String>();
@@ -4072,12 +3945,107 @@ public class IoTCompiler {
                                                print("int struct" + methodNumId + "Size" + i);
                                        }
                                }
-                               println(") {");
+                               println(", " + newSkelClass + "* skel);");
+                       } else {
+                               String methodId = intDecl.getMethodId(method);
+                               print("void ___");
+                               String helperMethod = methodId;
+                               if (uniqueMethodIds.contains(methodId))
+                                       helperMethod = helperMethod + intDecl.getMethodNumId(method);
+                               else
+                                       uniqueMethodIds.add(methodId);
+                               // Check if this is "void"
+                               String retType = intDecl.getMethodType(method);
+                               println(helperMethod + "(" + newSkelClass + "* skel);");
+                       }
+               }
+               // Write method helper for structs
+               writeMethodHelperStructDeclSetupCplusSkeleton(methods, intDecl, newSkelClass);
+       }
+
+
+       /**
+        * HELPER: writeMethodHelperStructDeclSetupCplusSkeleton() writes the struct method helper declaration in skeleton class
+        */
+       private void writeMethodHelperStructDeclSetupCplusSkeleton(Collection<String> methods, 
+                       InterfaceDecl intDecl, String newSkelClass) {
+
+               // 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);
+                                       print("int ___");
+                                       String helperMethod = methodNumId + "struct" + i;
+                                       println(helperMethod + "(" + newSkelClass + "* skel);");
+                               }
+                       }
+               }
+       }
+
+
+       /**
+        * HELPER: writeMethodBytesCopy() writes the methodBytes copy part in C++ skeleton
+        */
+       private void writeMethodBytesCopy() {
+
+               println("char* localMethodBytes = new char[methodLen];");
+               println("memcpy(localMethodBytes, skel->methodBytes, methodLen);");
+               println("didGetMethodBytes.exchange(true);");
+       }
+
+
+       /**
+        * HELPER: writeMethodHelperCplusSkeleton() writes the method helper of the skeleton class
+        */
+       private void writeMethodHelperCplusSkeleton(Collection<String> methods, InterfaceDecl intDecl, 
+                       Set<String> callbackClasses, String newSkelClass) {
+
+               // Use this set to handle two same methodIds
+               Set<String> uniqueMethodIds = new HashSet<String>();
+               for (String method : methods) {
+
+                       List<String> methParams = intDecl.getMethodParams(method);
+                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
+                       if (isStructPresent(methParams, methPrmTypes)) {        // Treat struct differently
+                               String methodId = intDecl.getMethodId(method);
+                               print("void " + newSkelClass + "::___");
+                               String helperMethod = methodId;
+                               if (uniqueMethodIds.contains(methodId))
+                                       helperMethod = helperMethod + intDecl.getMethodNumId(method);
+                               else
+                                       uniqueMethodIds.add(methodId);
+                               String retType = intDecl.getMethodType(method);
+                               print(helperMethod + "(");
+                               boolean begin = true;
+                               for (int i = 0; i < methParams.size(); i++) { // Print size variables
+                                       String paramType = methPrmTypes.get(i);
+                                       String param = methParams.get(i);
+                                       String simpleType = getGenericType(paramType);
+                                       if (isStructClass(simpleType)) {
+                                               if (!begin)     // Generate comma for not the beginning variable
+                                                       print(", ");
+                                               else
+                                                       begin = false;
+                                               int methodNumId = intDecl.getMethodNumId(method);
+                                               print("int struct" + methodNumId + "Size" + i);
+                                       }
+                               }
+                               println(", " + newSkelClass + "* skel) {");
+                               writeMethodBytesCopy();
                                writeMethodHelperStructCplusSkeleton(intDecl, methParams, methPrmTypes, method, methodId, callbackClasses);
+                               println("delete[] localMethodBytes;");
                                println("}\n");
                        } else {
                                String methodId = intDecl.getMethodId(method);
-                               print("void ___");
+                               print("void " + newSkelClass + "::___");
                                String helperMethod = methodId;
                                if (uniqueMethodIds.contains(methodId))
                                        helperMethod = helperMethod + intDecl.getMethodNumId(method);
@@ -4085,14 +4053,16 @@ public class IoTCompiler {
                                        uniqueMethodIds.add(methodId);
                                // Check if this is "void"
                                String retType = intDecl.getMethodType(method);
-                               println(helperMethod + "() {");
+                               println(helperMethod + "(" + newSkelClass + "* skel) {");
+                               writeMethodBytesCopy();
                                // Now, write the helper body of skeleton!
                                writeStdMethodHelperBodyCplusSkeleton(intDecl, methParams, methPrmTypes, method, methodId, callbackClasses);
+                               println("delete[] localMethodBytes;");
                                println("}\n");
                        }
                }
                // Write method helper for structs
-               writeMethodHelperStructSetupCplusSkeleton(methods, intDecl);
+               writeMethodHelperStructSetupCplusSkeleton(methods, intDecl, newSkelClass);
        }
 
 
@@ -4100,7 +4070,7 @@ public class IoTCompiler {
         * HELPER: writeMethodHelperStructSetupCplusSkeleton() writes the method helper of struct in skeleton class
         */
        private void writeMethodHelperStructSetupCplusSkeleton(Collection<String> methods, 
-                       InterfaceDecl intDecl) {
+                       InterfaceDecl intDecl, String newSkelClass) {
 
                // Use this set to handle two same methodIds
                for (String method : methods) {
@@ -4114,16 +4084,18 @@ public class IoTCompiler {
                                String simpleType = getGenericType(paramType);
                                if (isStructClass(simpleType)) {
                                        int methodNumId = intDecl.getMethodNumId(method);
-                                       print("int ___");
+                                       print("int " + newSkelClass + "::___");
                                        String helperMethod = methodNumId + "struct" + i;
-                                       println(helperMethod + "() {");
+                                       println(helperMethod + "(" + newSkelClass + "* skel) {");
                                        // Now, write the helper body of skeleton!
+                                       writeMethodBytesCopy();
                                        println("string paramCls[] = { \"int\" };");
                                        println("int numParam = 1;");
                                        println("int param0 = 0;");
                                        println("void* paramObj[] = { &param0 };");
-                                       println("rmiObj->getMethodParams(paramCls, numParam, paramObj);");
+                                       println("rmiComm->getMethodParams(paramCls, numParam, paramObj, localMethodBytes);");
                                        println("return param0;");
+                                       println("delete[] localMethodBytes;");
                                        println("}\n");
                                }
                        }
@@ -4157,7 +4129,7 @@ public class IoTCompiler {
                                        println("int numParam = 1;");
                                        println("int param0 = 0;");
                                        println("void* paramObj[] = { &param0 };");
-                                       println("rmiObj->getMethodParams(paramCls, numParam, paramObj);");
+                                       println("rmiComm->getMethodParams(paramCls, numParam, paramObj, localMethodBytes);");
                                        println("return param0;");
                                        println("}\n");
                                }
@@ -4176,15 +4148,14 @@ public class IoTCompiler {
                for (Map.Entry<String,Set<String>> intMeth : mapNewIntMethods.entrySet()) {
                        String newIntface = intMeth.getKey();
                        int newObjectId = getNewIntfaceObjectId(newIntface);
-                       println("if (_objectId == object" + newObjectId + "Id) {");
+                       println("if (_objectId == objectId) {");
                        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("return;");
                        println("}");
                        println("}");
                        println("else {");
-                       println("cerr << \"Object Id: \" << _objectId << \" not recognized!\" << endl;");
-                       println("return;");
+                       println("continue;");
                        println("}");
                }
        }
@@ -4193,17 +4164,24 @@ public class IoTCompiler {
        /**
         * HELPER: writeCplusWaitRequestInvokeMethod() writes the main loop of the skeleton class
         */
-       private void writeCplusWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, boolean callbackExist, String intface) {
+       private void writeCplusWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, 
+                       boolean callbackExist, String intface, String newSkelClass) {
 
                // Use this set to handle two same methodIds
                Set<String> uniqueMethodIds = new HashSet<String>();
-               println("void ___waitRequestInvokeMethod() {");
+               println("void " + newSkelClass + "::___waitRequestInvokeMethod(" + newSkelClass + "* skel) {");
                // Write variables here if we have callbacks or enums or structs
                writeCountVarStructSkeleton(methods, intDecl);
+               println("skel->didAlreadyInitWaitInvoke = true;");
                println("while (true) {");
-               println("rmiObj->getMethodBytes();");
-               println("int _objectId = rmiObj->getObjectId();");
-               println("int methodId = rmiObj->getMethodId();");
+               println("if (!methodReceived) {");
+               println("continue;");
+               println("}");
+               println("skel->methodBytes = skel->rmiComm->getMethodBytes();");
+               println("skel->methodLen = skel->rmiComm->getMethodLength();");
+               println("methodReceived = false;");
+               println("int _objectId = skel->rmiComm->getObjectId(skel->methodBytes);");
+               println("int methodId = skel->rmiComm->getMethodId(skel->methodBytes);");
                // Generate permission check
                writeCplusMethodPermission(intface);
                println("switch (methodId) {");
@@ -4211,26 +4189,25 @@ public class IoTCompiler {
                for (String method : methods) {
                        String methodId = intDecl.getMethodId(method);
                        int methodNumId = intDecl.getMethodNumId(method);
-                       print("case " + methodNumId + ": ___");
+                       println("case " + methodNumId + ": {");
+                       print("thread th" + methodNumId + " (&" + newSkelClass + "::___");
                        String helperMethod = methodId;
                        if (uniqueMethodIds.contains(methodId))
                                helperMethod = helperMethod + methodNumId;
                        else
                                uniqueMethodIds.add(methodId);
-                       print(helperMethod + "(");
-                       writeInputCountVarStructSkeleton(method, intDecl);
-                       println("); break;");
-               }
-               String method = "___initCallBack()";
-               // Print case -9999 (callback handler) if callback exists
-               if (callbackExist) {
-                       int methodId = intDecl.getHelperMethodNumId(method);
-                       println("case " + methodId + ": ___regCB(); break;");
+                       print(helperMethod + ", std::ref(skel), ");
+                       boolean structExists = writeInputCountVarStructCplusSkeleton(method, intDecl);
+                       if (structExists)
+                               print(", ");
+                       println("skel);");
+                       println("th" + methodNumId + ".detach(); break;");
+                       println("}");
                }
-               writeMethodCallStructSkeleton(methods, intDecl);
+               writeMethodCallStructCplusSkeleton(methods, intDecl);
                println("default: ");
                println("cerr << \"Method Id \" << methodId << \" not recognized!\" << endl;");
-               println("throw exception();");
+               println("return;");
                println("}");
                println("}");
                println("}\n");
@@ -4238,9 +4215,9 @@ public class IoTCompiler {
 
 
        /**
-        * generateCplusSkeletonClass() generate skeletons based on the methods list in C++
+        * generateCplusSkeletonClassHpp() generate skeletons based on the methods list in C++ (.hpp file)
         */
-       public void generateCplusSkeletonClass() throws IOException {
+       public void generateCplusSkeletonClassHpp() throws IOException {
 
                // Create a new directory
                String path = createDirectories(dir, subdir);
@@ -4258,10 +4235,8 @@ public class IoTCompiler {
                        DeclarationHandler decHandler = mapIntDeclHand.get(intface);
                        InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
                        List<String> methods = intDecl.getMethods();
-                       Set<String> includeClasses = getIncludeClasses(methods, intDecl, intface, true);
                        List<String> stdIncludeClasses = getStandardCplusIncludeClasses();
-                       List<String> allIncludeClasses = getAllLibClasses(stdIncludeClasses, includeClasses);
-                       printIncludeStatements(allIncludeClasses); println("");
+                       printIncludeStatements(stdIncludeClasses); println("");
                        println("using namespace std;\n");
                        // Find out if there are callback objects
                        Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
@@ -4272,242 +4247,112 @@ public class IoTCompiler {
                        // Write properties
                        writePropertiesCplusSkeleton(intface, callbackExist, callbackClasses);
                        println("public:\n");
-                       // Write constructor
-                       writeConstructorCplusSkeleton(newSkelClass, intface, callbackExist, intDecl, methods);
+                       // Write constructors
+                       println(newSkelClass + "();");
+                       println(newSkelClass + "(" + intface + "*_mainObj, int _portSend, int _portRecv);");
+                       println(newSkelClass + "(" + intface + "*_mainObj, IoTRMIComm *rmiComm, int _objectId);");
                        // Write deconstructor
-                       writeDeconstructorCplusSkeleton(newSkelClass, callbackExist, callbackClasses);
-                       // Write methods
-                       writeMethodCplusSkeleton(methods, intDecl, callbackClasses, false);
-                       // Write method helper
-                       writeMethodHelperCplusSkeleton(methods, intDecl, callbackClasses);
-                       // Write waitRequestInvokeMethod() - main loop
-                       writeCplusWaitRequestInvokeMethod(methods, intDecl, callbackExist, intface);
+                       println("~" + newSkelClass + "();");
+                       // Write method declarations
+                       println("bool didInitWaitInvoke();");
+                       writeMethodDeclCplusSkeleton(methods, intDecl, callbackClasses);
+                       // Write method helper declarations
+                       writeMethodHelperDeclCplusSkeleton(methods, intDecl, newSkelClass);
+                       // Write waitRequestInvokeMethod() declaration - main loop
+                       println("void ___waitRequestInvokeMethod(" + newSkelClass + "* skel);");
                        println("};");
                        writePermissionInitializationCplus(intface, newSkelClass, intDecl);
-                       writeObjectIdCountInitializationCplus(newSkelClass, callbackExist);
                        println("#endif");
                        pw.close();
                        System.out.println("IoTCompiler: Generated skeleton class " + newSkelClass + ".hpp...");
                }
        }
 
-
-       /**
-        * HELPER: writePropertiesCplusCallbackSkeleton() writes the properties of the callback skeleton class
-        */
-       private void writePropertiesCplusCallbackSkeleton(String intface, boolean callbackExist, Set<String> callbackClasses) {
-
-               println(intface + " *mainObj;");
-               // Keep track of object Ids of all stubs registered to this interface
-               println("int objectId;");
-               // Callback
-               if (callbackExist) {
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       String exchangeType = checkAndGetParamClass(callbackType);
-                       println("// Callback properties");
-                       println("IoTRMICall* rmiCall;");
-                       println("vector<" + exchangeType + "*> vecCallbackObj;");
-                       println("static int objIdCnt;");
-               }
-               println("\n");
-       }
-
-
        /**
-        * HELPER: writeConstructorCplusCallbackSkeleton() writes the constructor of the skeleton class
+        * HELPER: writeReturnDidAlreadyInitWaitInvoke() writes the function to return didAlreadyInitWaitInvoke
         */
-       private void writeConstructorCplusCallbackSkeleton(String newSkelClass, String intface, boolean callbackExist, InterfaceDecl intDecl, Collection<String> methods) {
+       private void writeReturnDidAlreadyInitWaitInvoke(String newSkelClass) {
 
-               println(newSkelClass + "(" + intface + " *_mainObj, int _objectId) {");
-               println("mainObj = _mainObj;");
-               println("objectId = _objectId;");
+               println("bool " + newSkelClass + "::didInitWaitInvoke() {");
+               println("return didAlreadyInitWaitInvoke;");
                println("}\n");
        }
 
 
        /**
-        * HELPER: writeDeconstructorCplusStub() writes the deconstructor of the stub class
-        */
-       private void writeDeconstructorCplusCallbackSkeleton(String newStubClass, boolean callbackExist, 
-                       Set<String> callbackClasses) {
-
-               println("~" + newStubClass + "() {");
-               if (callbackExist) {
-               // We assume that each class only has one callback interface for now
-                       println("if (rmiCall != NULL) {");
-                       println("delete rmiCall;");
-                       println("rmiCall = NULL;");
-                       println("}");
-                       Iterator it = callbackClasses.iterator();
-                       String callbackType = (String) it.next();
-                       String exchangeType = checkAndGetParamClass(callbackType);
-                       println("for(" + exchangeType + "* cb : vecCallbackObj) {");
-                       println("delete cb;");
-                       println("cb = NULL;");
-                       println("}");
-               }
-               println("}");
-               println("");
-       }
-
-
-       /**
-        * HELPER: writeMethodHelperCplusCallbackSkeleton() writes the method helper of callback skeleton class
-        */
-       private void writeMethodHelperCplusCallbackSkeleton(Collection<String> methods, InterfaceDecl intDecl, 
-                       Set<String> callbackClasses) {
-
-               // Use this set to handle two same methodIds
-               Set<String> uniqueMethodIds = new HashSet<String>();
-               for (String method : methods) {
-
-                       List<String> methParams = intDecl.getMethodParams(method);
-                       List<String> methPrmTypes = intDecl.getMethodParamTypes(method);
-                       if (isStructPresent(methParams, methPrmTypes)) {        // Treat struct differently
-                               String methodId = intDecl.getMethodId(method);
-                               print("void ___");
-                               String helperMethod = methodId;
-                               if (uniqueMethodIds.contains(methodId))
-                                       helperMethod = helperMethod + intDecl.getMethodNumId(method);
-                               else
-                                       uniqueMethodIds.add(methodId);
-                               String retType = intDecl.getMethodType(method);
-                               print(helperMethod + "(");
-                               boolean begin = true;
-                               for (int i = 0; i < methParams.size(); i++) { // Print size variables
-                                       String paramType = methPrmTypes.get(i);
-                                       String param = methParams.get(i);
-                                       String simpleType = getGenericType(paramType);
-                                       if (isStructClass(simpleType)) {
-                                               if (!begin)     // Generate comma for not the beginning variable
-                                                       print(", ");
-                                               else
-                                                       begin = false;
-                                               int methodNumId = intDecl.getMethodNumId(method);
-                                               print("int struct" + methodNumId + "Size" + i);
-                                       }
-                               }
-                               println(", IoTRMIObject* rmiObj) {");
-                               writeMethodHelperStructCplusSkeleton(intDecl, methParams, methPrmTypes, method, methodId, callbackClasses);
-                               println("}\n");
-                       } else {
-                               String methodId = intDecl.getMethodId(method);
-                               print("void ___");
-                               String helperMethod = methodId;
-                               if (uniqueMethodIds.contains(methodId))
-                                       helperMethod = helperMethod + intDecl.getMethodNumId(method);
-                               else
-                                       uniqueMethodIds.add(methodId);
-                               // Check if this is "void"
-                               String retType = intDecl.getMethodType(method);
-                               println(helperMethod + "(IoTRMIObject* rmiObj) {");
-                               // Now, write the helper body of skeleton!
-                               writeStdMethodHelperBodyCplusSkeleton(intDecl, methParams, methPrmTypes, method, methodId, callbackClasses);
-                               println("}\n");
-                       }
-               }
-               // Write method helper for structs
-               writeMethodHelperStructSetupCplusCallbackSkeleton(methods, intDecl);
-       }
-
-
-       /**
-        * HELPER: writeCplusCallbackWaitRequestInvokeMethod() writes the request invoke method of the skeleton callback class
+        * writeSkelExternalCFunctions() generate external functions for .so file
         */
-       private void writeCplusCallbackWaitRequestInvokeMethod(Collection<String> methods, InterfaceDecl intDecl, 
-                       boolean callbackExist) {
+       public void writeSkelExternalCFunctions(String newSkelClass, String intface) throws IOException {
 
-               // Use this set to handle two same methodIds
-               Set<String> uniqueMethodIds = new HashSet<String>();
-               println("void invokeMethod(IoTRMIObject* rmiObj) {");
-               // Write variables here if we have callbacks or enums or structs
-               writeCountVarStructSkeleton(methods, intDecl);
-               // Write variables here if we have callbacks or enums or structs
-               println("int methodId = rmiObj->getMethodId();");
-               // TODO: code the permission check here!
-               println("switch (methodId) {");
-               // Print methods and method Ids
-               for (String method : methods) {
-                       String methodId = intDecl.getMethodId(method);
-                       int methodNumId = intDecl.getMethodNumId(method);
-                       print("case " + methodNumId + ": ___");
-                       String helperMethod = methodId;
-                       if (uniqueMethodIds.contains(methodId))
-                               helperMethod = helperMethod + methodNumId;
-                       else
-                               uniqueMethodIds.add(methodId);
-                       print(helperMethod + "(");
-                       if (writeInputCountVarStructSkeleton(method, intDecl))
-                               println(", rmiObj); break;");
-                       else
-                               println("rmiObj); break;");
-               }
-               String method = "___initCallBack()";
-               // Print case -9999 (callback handler) if callback exists
-               if (callbackExist) {
-                       int methodId = intDecl.getHelperMethodNumId(method);
-                       println("case " + methodId + ": ___regCB(rmiObj); break;");
-               }
-               writeMethodCallStructCallbackSkeleton(methods, intDecl);
-               println("default: ");
-               println("cerr << \"Method Id \" << methodId << \" not recognized!\" << endl;");
-               println("throw exception();");
-               println("}");
+               println("extern \"C\" void* create" + newSkelClass + "(void** params) {");
+               println("// Args: *_mainObj, int _portSend, int _portRecv");
+               println("return new " + newSkelClass + "((" + intface + "*) params[0], *((int*) params[1]), *((int*) params[2]));");
+               println("}\n");
+               println("extern \"C\" void destroy" + newSkelClass + "(void* t) {");
+               println(newSkelClass + "* obj = (" + newSkelClass + "*) t;");
+               println("delete obj;");
+               println("}\n");
+               println("extern \"C\" void init" + newSkelClass + "(void* t) {");
+               //println(newSkelClass + "* obj = (" + newSkelClass + "*) t;");
+               //println("obj->init();");
+               //println("while(true);");
                println("}\n");
        }
 
 
        /**
-        * generateCplusCallbackSkeletonClass() generate callback skeletons based on the methods list in C++
+        * generateCplusSkeletonClassCpp() generate skeletons based on the methods list in C++ (.cpp file)
         */
-       public void generateCplusCallbackSkeletonClass() throws IOException {
+       public void generateCplusSkeletonClassCpp() throws IOException {
 
                // Create a new directory
                String path = createDirectories(dir, subdir);
                for (String intface : mapIntfacePTH.keySet()) {
                        // Open a new file to write into
-                       String newSkelClass = intface + "_CallbackSkeleton";
-                       FileWriter fw = new FileWriter(path + "/" + newSkelClass + ".hpp");
+                       String newSkelClass = intface + "_Skeleton";
+                       FileWriter fw = new FileWriter(path + "/" + newSkelClass + ".cpp");
                        pw = new PrintWriter(new BufferedWriter(fw));
                        // Write file headers
-                       println("#ifndef _" + newSkelClass.toUpperCase() + "_HPP__");
-                       println("#define _" + newSkelClass.toUpperCase() + "_HPP__");
                        println("#include <iostream>");
-                       println("#include \"" + intface + ".hpp\"\n");
+                       println("#include \"" + newSkelClass + ".hpp\"\n");
                        // Pass in set of methods and get import classes
                        DeclarationHandler decHandler = mapIntDeclHand.get(intface);
                        InterfaceDecl intDecl = (InterfaceDecl) decHandler.getInterfaceDecl(intface);
                        List<String> methods = intDecl.getMethods();
-                       Set<String> includeClasses = getIncludeClasses(methods, intDecl, intface, true);
-                       List<String> stdIncludeClasses = getStandardCplusIncludeClasses();
-                       List<String> allIncludeClasses = getAllLibClasses(stdIncludeClasses, includeClasses);
-                       printIncludeStatements(allIncludeClasses); println("");                 
                        // Find out if there are callback objects
                        Set<String> callbackClasses = getCallbackClasses(methods, intDecl);
                        boolean callbackExist = !callbackClasses.isEmpty();
+                       for(String str: callbackClasses) {
+                               if (intface.equals(mainClass))
+                                       println("#include \"" + getStubInterface(str) + "_Stub.cpp\"\n");
+                               else
+                                       println("#include \"" + getStubInterface(str) + "_Stub.hpp\"\n");
+                       }
                        println("using namespace std;\n");
-                       // Write class header
-                       println("class " + newSkelClass + " : public " + intface); println("{");
-                       println("private:\n");
-                       // Write properties
-                       writePropertiesCplusCallbackSkeleton(intface, callbackExist, callbackClasses);
-                       println("public:\n");
                        // Write constructor
-                       writeConstructorCplusCallbackSkeleton(newSkelClass, intface, callbackExist, intDecl, methods);
+                       writeConstructorCplusSkeleton(newSkelClass, intface, callbackExist, intDecl, methods);
+                       // Write callback constructor
+                       writeCallbackConstructorCplusSkeleton(newSkelClass, intface, callbackExist, intDecl, methods);
                        // Write deconstructor
-                       writeDeconstructorCplusCallbackSkeleton(newSkelClass, callbackExist, callbackClasses);
+                       writeDeconstructorCplusSkeleton(newSkelClass, callbackExist, callbackClasses);
+                       // Write didInitWaitInvoke() to return bool
+                       writeReturnDidAlreadyInitWaitInvoke(newSkelClass);
                        // Write methods
-                       writeMethodCplusSkeleton(methods, intDecl, callbackClasses, true);
+                       writeMethodCplusSkeleton(methods, intDecl, newSkelClass);
                        // Write method helper
-                       writeMethodHelperCplusCallbackSkeleton(methods, intDecl, callbackClasses);
+                       writeMethodHelperCplusSkeleton(methods, intDecl, callbackClasses, newSkelClass);
                        // Write waitRequestInvokeMethod() - main loop
-                       writeCplusCallbackWaitRequestInvokeMethod(methods, intDecl, callbackExist);
-                       println("};");
-                       writeObjectIdCountInitializationCplus(newSkelClass, callbackExist);
-                       println("#endif");
+                       writeCplusWaitRequestInvokeMethod(methods, intDecl, callbackExist, intface, newSkelClass);
+                       // Write external functions for .so file
+                       writeSkelExternalCFunctions(newSkelClass, intface);
+                       // TODO: Remove this later
+                       if (intface.equals(mainClass)) {
+                               println("int main() {");
+                               println("return 0;");
+                               println("}");
+                       }
                        pw.close();
-                       System.out.println("IoTCompiler: Generated callback skeleton class " + newSkelClass + ".hpp...");
+                       System.out.println("IoTCompiler: Generated skeleton class " + newSkelClass + ".cpp...");
                }
        }
 
@@ -4705,13 +4550,14 @@ public class IoTCompiler {
        // 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 {
+//             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");
+//                     return -1;
+//             } else {
                        int retObjId = mapNewIntfaceObjId.get(newIntface);
                        return retObjId;
-               }
+//             }
        }
 
 
@@ -4782,8 +4628,13 @@ public class IoTCompiler {
                importClasses.add("java.util.List");
                importClasses.add("java.util.ArrayList");
                importClasses.add("java.util.Arrays");
-               importClasses.add("iotrmi.Java.IoTRMICall");
-               importClasses.add("iotrmi.Java.IoTRMIObject");
+               importClasses.add("java.util.Map");
+               importClasses.add("java.util.HashMap");
+               importClasses.add("java.util.concurrent.atomic.AtomicBoolean");
+               importClasses.add("iotrmi.Java.IoTRMIComm");
+               importClasses.add("iotrmi.Java.IoTRMICommClient");
+               importClasses.add("iotrmi.Java.IoTRMICommServer");
+               importClasses.add("iotrmi.Java.IoTRMIUtil");
 
                return importClasses;
        }
@@ -4796,8 +4647,11 @@ public class IoTCompiler {
                // Add the standard list first
                importClasses.add("<vector>");
                importClasses.add("<set>");
-               importClasses.add("\"IoTRMICall.hpp\"");
-               importClasses.add("\"IoTRMIObject.hpp\"");
+               //importClasses.add("\"IoTRMICall.hpp\"");
+               //importClasses.add("\"IoTRMIObject.hpp\"");
+               importClasses.add("\"IoTRMIComm.hpp\"");
+               importClasses.add("\"IoTRMICommClient.hpp\"");
+               importClasses.add("\"IoTRMICommServer.hpp\"");
 
                return importClasses;
        }
@@ -4986,24 +4840,30 @@ public class IoTCompiler {
                        List<String> methParams = intDecl.getMethodParams(method);
                        for (int i = 0; i < methPrmTypes.size(); i++) {
 
+                               String genericType = getGenericType(methPrmTypes.get(i));
                                String simpleType = getSimpleType(methPrmTypes.get(i));
                                String param = methParams.get(i);
                                if (getParamCategory(simpleType) == ParamCategory.NONPRIMITIVES) {
                                        includeClasses.add("<" + getNonPrimitiveCplusClass(simpleType) + ">");
-                               } else if (getParamCategory(simpleType) == ParamCategory.USERDEFINED) {
+                               //} else if (getParamCategory(simpleType) == ParamCategory.USERDEFINED) {
+                               }
+                               if (getParamCategory(getSimpleArrayType(genericType)) == ParamCategory.USERDEFINED) {
                                        // For original interface, we need it exchanged... not for stub interfaces
                                        if (needExchange) {
-                                               includeClasses.add("\"" + exchangeParamType(simpleType) + ".hpp\"");
-                                               includeClasses.add("\"" + exchangeParamType(simpleType) + "_CallbackStub.hpp\"");
+                                               //includeClasses.add("\"" + exchangeParamType(simpleType) + ".hpp\"");
+                                               includeClasses.add("\"" + exchangeParamType(getSimpleArrayType(genericType)) + ".hpp\"");
                                        } else {
-                                               includeClasses.add("\"" + simpleType + ".hpp\"");
-                                               includeClasses.add("\"" + simpleType + "_CallbackSkeleton.hpp\"");
+                                               //includeClasses.add("\"" + simpleType + ".hpp\"");
+                                               includeClasses.add("\"" + getSimpleArrayType(genericType) + ".hpp\"");
                                        }
-                               } else if (getParamCategory(getSimpleArrayType(simpleType)) == ParamCategory.ENUM) {
-                                       includeClasses.add("\"" + simpleType + ".hpp\"");
-                               } else if (getParamCategory(getSimpleArrayType(simpleType)) == ParamCategory.STRUCT) {
-                                       includeClasses.add("\"" + simpleType + ".hpp\"");
-                               } else if (param.contains("[]")) {
+                               }
+                               if (getParamCategory(getSimpleArrayType(genericType)) == ParamCategory.ENUM) {
+                                       includeClasses.add("\"" + genericType + ".hpp\"");
+                               }
+                               if (getParamCategory(getSimpleArrayType(genericType)) == ParamCategory.STRUCT) {
+                                       includeClasses.add("\"" + genericType + ".hpp\"");
+                               }
+                               if (param.contains("[]")) {
                                // Check if this is array for C++; translate into vector
                                        includeClasses.add("<vector>");
                                }
@@ -5375,17 +5235,15 @@ public class IoTCompiler {
                                comp.generateJavaLocalInterfaces();
                                comp.generateJavaInterfaces();
                                comp.generateJavaStubClasses();
-                               comp.generateJavaCallbackStubClasses();
                                comp.generateJavaSkeletonClass();
-                               comp.generateJavaCallbackSkeletonClass();
                                comp.generateEnumCplus();
                                comp.generateStructCplus();
                                comp.generateCplusLocalInterfaces();
                                comp.generateCPlusInterfaces();
-                               comp.generateCPlusStubClasses();
-                               comp.generateCPlusCallbackStubClasses();
-                               comp.generateCplusSkeletonClass();
-                               comp.generateCplusCallbackSkeletonClass();
+                               comp.generateCPlusStubClassesHpp();
+                               comp.generateCPlusStubClassesCpp();
+                               comp.generateCplusSkeletonClassHpp();
+                               comp.generateCplusSkeletonClassCpp();
                        } else {
                        // Check other options
                                while(i < args.length) {
@@ -5405,18 +5263,16 @@ public class IoTCompiler {
                                                        comp.generateJavaLocalInterfaces();
                                                        comp.generateJavaInterfaces();
                                                        comp.generateJavaStubClasses();
-                                                       comp.generateJavaCallbackStubClasses();
                                                        comp.generateJavaSkeletonClass();
-                                                       comp.generateJavaCallbackSkeletonClass();
                                                } else {
                                                        comp.generateEnumCplus();
                                                        comp.generateStructCplus();
                                                        comp.generateCplusLocalInterfaces();
                                                        comp.generateCPlusInterfaces();
-                                                       comp.generateCPlusStubClasses();
-                                                       comp.generateCPlusCallbackStubClasses();
-                                                       comp.generateCplusSkeletonClass();
-                                                       comp.generateCplusCallbackSkeletonClass();
+                                                       comp.generateCPlusStubClassesHpp();
+                                                       comp.generateCPlusStubClassesCpp();
+                                                       comp.generateCplusSkeletonClassHpp();
+                                                       comp.generateCplusSkeletonClassCpp();
                                                }
                                        }
                                        i = i + 2;