Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp	(revision 16052)
@@ -1652,11 +1652,10 @@
  * Wrapper for handling internal commands
  */
-int handleInternalCommands(int argc, char *argv[],
-                           ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+int handleInternalCommands(HandlerArg *a)
 {
     g_fInternalMode = true;
 
     /* at least a command is required */
-    if (argc < 1)
+    if (a->argc < 1)
         return errorSyntax(USAGE_ALL, "Command missing");
 
@@ -1664,21 +1663,21 @@
      * The 'string switch' on command name.
      */
-    const char *pszCmd = argv[0];
+    const char *pszCmd = a->argv[0];
     if (!strcmp(pszCmd, "loadsyms"))
-        return CmdLoadSyms(argc - 1, &argv[1], aVirtualBox, aSession);
+        return CmdLoadSyms(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
     //if (!strcmp(pszCmd, "unloadsyms"))
-    //    return CmdUnloadSyms(argc - 1 , &argv[1]);
+    //    return CmdUnloadSyms(argc - 1 , &a->argv[1]);
     if (!strcmp(pszCmd, "sethduuid") || !strcmp(pszCmd, "setvdiuuid"))
-        return handleSetHDUUID(argc - 1, &argv[1], aVirtualBox, aSession);
+        return handleSetHDUUID(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
     if (!strcmp(pszCmd, "listpartitions"))
-        return CmdListPartitions(argc - 1, &argv[1], aVirtualBox, aSession);
+        return CmdListPartitions(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
     if (!strcmp(pszCmd, "createrawvmdk"))
-        return CmdCreateRawVMDK(argc - 1, &argv[1], aVirtualBox, aSession);
+        return CmdCreateRawVMDK(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
     if (!strcmp(pszCmd, "renamevmdk"))
-        return CmdRenameVMDK(argc - 1, &argv[1], aVirtualBox, aSession);
+        return CmdRenameVMDK(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
     if (!strcmp(pszCmd, "converttoraw"))
-        return CmdConvertToRaw(argc - 1, &argv[1], aVirtualBox, aSession);
+        return CmdConvertToRaw(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
     if (!strcmp(pszCmd, "converthd"))
-        return CmdConvertHardDisk(argc - 1, &argv[1], aVirtualBox, aSession);
+        return CmdConvertHardDisk(a->argc - 1, &a->argv[1], a->virtualBox, a->session);
 
     if (!strcmp(pszCmd, "modinstall"))
@@ -1688,5 +1687,5 @@
 
     /* default: */
-    return errorSyntax(USAGE_ALL, "Invalid command '%s'", Utf8Str(argv[0]).raw());
-}
-
+    return errorSyntax(USAGE_ALL, "Invalid command '%s'", Utf8Str(a->argv[0]).raw());
+}
+
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp	(revision 16052)
@@ -73,10 +73,5 @@
 
 /** command handler type */
-typedef int (*PFNHANDLER)(int argc, char *argv[], ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
-
-#ifdef USE_XPCOM_QUEUE
-/** A pointer to the event queue, set by main() before calling any handlers. */
-nsCOMPtr<nsIEventQueue> g_pEventQ;
-#endif
+typedef int (*PFNHANDLER)(HandlerArg *a);
 
 /**
@@ -757,37 +752,35 @@
 }
 
-static int handleRegisterVM(int argc, char *argv[],
-                            ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleRegisterVM(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc != 1)
+    if (a->argc != 1)
         return errorSyntax(USAGE_REGISTERVM, "Incorrect number of parameters");
 
     ComPtr<IMachine> machine;
-    CHECK_ERROR(virtualBox, OpenMachine(Bstr(argv[0]), machine.asOutParam()));
+    CHECK_ERROR(a->virtualBox, OpenMachine(Bstr(a->argv[0]), machine.asOutParam()));
     if (SUCCEEDED(rc))
     {
         ASSERT(machine);
-        CHECK_ERROR(virtualBox, RegisterMachine(machine));
+        CHECK_ERROR(a->virtualBox, RegisterMachine(machine));
     }
     return SUCCEEDED(rc) ? 0 : 1;
 }
 
-static int handleUnregisterVM(int argc, char *argv[],
-                              ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleUnregisterVM(HandlerArg *a)
 {
     HRESULT rc;
 
-    if ((argc != 1) && (argc != 2))
+    if ((a->argc != 1) && (a->argc != 2))
         return errorSyntax(USAGE_UNREGISTERVM, "Incorrect number of parameters");
 
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (machine)
@@ -796,9 +789,9 @@
         machine->COMGETTER(Id)(uuid.asOutParam());
         machine = NULL;
-        CHECK_ERROR(virtualBox, UnregisterMachine(uuid, machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, UnregisterMachine(uuid, machine.asOutParam()));
         if (SUCCEEDED(rc) && machine)
         {
             /* are we supposed to delete the config file? */
-            if ((argc == 2) && (strcmp(argv[1], "-delete") == 0))
+            if ((a->argc == 2) && (strcmp(a->argv[1], "-delete") == 0))
             {
                 CHECK_ERROR(machine, DeleteSettings());
@@ -809,6 +802,5 @@
 }
 
-static int handleCreateVM(int argc, char *argv[],
-                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleCreateVM(HandlerArg *a)
 {
     HRESULT rc;
@@ -821,48 +813,48 @@
 
     RTUuidClear(&id);
-    for (int i = 0; i < argc; i++)
-    {
-        if (strcmp(argv[i], "-basefolder") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            baseFolder = argv[i];
-        }
-        else if (strcmp(argv[i], "-settingsfile") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            settingsFile = argv[i];
-        }
-        else if (strcmp(argv[i], "-name") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            name = argv[i];
-        }
-        else if (strcmp(argv[i], "-ostype") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            osTypeId = argv[i];
-        }
-        else if (strcmp(argv[i], "-uuid") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            if (RT_FAILURE(RTUuidFromStr(&id, argv[i])))
-                return errorArgument("Invalid UUID format %s\n", argv[i]);
-        }
-        else if (strcmp(argv[i], "-register") == 0)
+    for (int i = 0; i < a->argc; i++)
+    {
+        if (strcmp(a->argv[i], "-basefolder") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            baseFolder = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-settingsfile") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            settingsFile = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-name") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            name = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-ostype") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            osTypeId = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-uuid") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (RT_FAILURE(RTUuidFromStr(&id, a->argv[i])))
+                return errorArgument("Invalid UUID format %s\n", a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-register") == 0)
         {
             fRegister = true;
         }
         else
-            return errorSyntax(USAGE_CREATEVM, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+            return errorSyntax(USAGE_CREATEVM, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
     }
     if (!name)
@@ -877,8 +869,8 @@
 
         if (!settingsFile)
-            CHECK_ERROR_BREAK(virtualBox,
+            CHECK_ERROR_BREAK(a->virtualBox,
                 CreateMachine(name, osTypeId, baseFolder, Guid(id), machine.asOutParam()));
         else
-            CHECK_ERROR_BREAK(virtualBox,
+            CHECK_ERROR_BREAK(a->virtualBox,
                 CreateLegacyMachine(name, osTypeId, settingsFile, Guid(id), machine.asOutParam()));
 
@@ -886,5 +878,5 @@
         if (fRegister)
         {
-            CHECK_ERROR_BREAK(virtualBox, RegisterMachine(machine));
+            CHECK_ERROR_BREAK(a->virtualBox, RegisterMachine(machine));
         }
         Guid uuid;
@@ -928,6 +920,5 @@
 #endif
 
-static int handleModifyVM(int argc, char *argv[],
-                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleModifyVM(HandlerArg *a)
 {
     HRESULT rc;
@@ -980,5 +971,5 @@
     /* VM ID + at least one parameter. Parameter arguments are checked
      * individually. */
-    if (argc < 2)
+    if (a->argc < 2)
         return errorSyntax(USAGE_MODIFYVM, "Not enough parameters");
 
@@ -987,5 +978,5 @@
     {
         ComPtr <ISystemProperties> info;
-        CHECK_ERROR_RET (virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
+        CHECK_ERROR_RET (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
         CHECK_ERROR_RET (info, COMGETTER(NetworkAdapterCount) (&NetworkAdapterCount), 1);
     }
@@ -993,5 +984,5 @@
     {
         ComPtr <ISystemProperties> info;
-        CHECK_ERROR_RET (virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
+        CHECK_ERROR_RET (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
         CHECK_ERROR_RET (info, COMGETTER(SerialPortCount) (&SerialPortCount), 1);
     }
@@ -1012,338 +1003,338 @@
     std::vector <char *> uarts_path (SerialPortCount, 0);
 
-    for (int i = 1; i < argc; i++)
-    {
-        if (strcmp(argv[i], "-name") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            name = argv[i];
-        }
-        else if (strcmp(argv[i], "-ostype") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            ostype = argv[i];
-        }
-        else if (strcmp(argv[i], "-memory") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            memorySize = RTStrToUInt32(argv[i]);
-        }
-        else if (strcmp(argv[i], "-vram") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            vramSize = RTStrToUInt32(argv[i]);
-        }
-        else if (strcmp(argv[i], "-acpi") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            acpi = argv[i];
-        }
-        else if (strcmp(argv[i], "-ioapic") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            ioapic = argv[i];
-        }
-        else if (strcmp(argv[i], "-hwvirtex") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            hwvirtex = argv[i];
-        }
-        else if (strcmp(argv[i], "-nestedpaging") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            nestedpaging = argv[i];
-        }
-        else if (strcmp(argv[i], "-vtxvpid") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            vtxvpid = argv[i];
-        }
-        else if (strcmp(argv[i], "-pae") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            pae = argv[i];
-        }
-        else if (strcmp(argv[i], "-monitorcount") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            monitorcount = RTStrToUInt32(argv[i]);
-        }
-        else if (strcmp(argv[i], "-accelerate3d") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            accelerate3d = argv[i];
-        }
-        else if (strcmp(argv[i], "-bioslogofadein") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            bioslogofadein = argv[i];
-        }
-        else if (strcmp(argv[i], "-bioslogofadeout") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            bioslogofadeout = argv[i];
-        }
-        else if (strcmp(argv[i], "-bioslogodisplaytime") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            bioslogodisplaytime = RTStrToUInt32(argv[i]);
-        }
-        else if (strcmp(argv[i], "-bioslogoimagepath") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            bioslogoimagepath = argv[i];
-        }
-        else if (strcmp(argv[i], "-biosbootmenu") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            biosbootmenumode = argv[i];
-        }
-        else if (strcmp(argv[i], "-biossystemtimeoffset") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            biossystemtimeoffset = argv[i];
-        }
-        else if (strcmp(argv[i], "-biospxedebug") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            biospxedebug = argv[i];
-        }
-        else if (strncmp(argv[i], "-boot", 5) == 0)
+    for (int i = 1; i < a->argc; i++)
+    {
+        if (strcmp(a->argv[i], "-name") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            name = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-ostype") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            ostype = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-memory") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            memorySize = RTStrToUInt32(a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-vram") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            vramSize = RTStrToUInt32(a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-acpi") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            acpi = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-ioapic") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            ioapic = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-hwvirtex") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            hwvirtex = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-nestedpaging") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            nestedpaging = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-vtxvpid") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            vtxvpid = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-pae") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            pae = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-monitorcount") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            monitorcount = RTStrToUInt32(a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-accelerate3d") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            accelerate3d = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-bioslogofadein") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            bioslogofadein = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-bioslogofadeout") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            bioslogofadeout = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-bioslogodisplaytime") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            bioslogodisplaytime = RTStrToUInt32(a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-bioslogoimagepath") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            bioslogoimagepath = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-biosbootmenu") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            biosbootmenumode = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-biossystemtimeoffset") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            biossystemtimeoffset = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-biospxedebug") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            biospxedebug = a->argv[i];
+        }
+        else if (strncmp(a->argv[i], "-boot", 5) == 0)
         {
             uint32_t n = 0;
-            if (!argv[i][5])
-                return errorSyntax(USAGE_MODIFYVM, "Missing boot slot number in '%s'", argv[i]);
-            if (VINF_SUCCESS != RTStrToUInt32Full(&argv[i][5], 10, &n))
-                return errorSyntax(USAGE_MODIFYVM, "Invalid boot slot number in '%s'", argv[i]);
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            if (strcmp(argv[i], "none") == 0)
+            if (!a->argv[i][5])
+                return errorSyntax(USAGE_MODIFYVM, "Missing boot slot number in '%s'", a->argv[i]);
+            if (VINF_SUCCESS != RTStrToUInt32Full(&a->argv[i][5], 10, &n))
+                return errorSyntax(USAGE_MODIFYVM, "Invalid boot slot number in '%s'", a->argv[i]);
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (strcmp(a->argv[i], "none") == 0)
             {
                 bootDevice[n - 1] = DeviceType_Null;
             }
-            else if (strcmp(argv[i], "floppy") == 0)
+            else if (strcmp(a->argv[i], "floppy") == 0)
             {
                 bootDevice[n - 1] = DeviceType_Floppy;
             }
-            else if (strcmp(argv[i], "dvd") == 0)
+            else if (strcmp(a->argv[i], "dvd") == 0)
             {
                 bootDevice[n - 1] = DeviceType_DVD;
             }
-            else if (strcmp(argv[i], "disk") == 0)
+            else if (strcmp(a->argv[i], "disk") == 0)
             {
                 bootDevice[n - 1] = DeviceType_HardDisk;
             }
-            else if (strcmp(argv[i], "net") == 0)
+            else if (strcmp(a->argv[i], "net") == 0)
             {
                 bootDevice[n - 1] = DeviceType_Network;
             }
             else
-                return errorArgument("Invalid boot device '%s'", argv[i]);
+                return errorArgument("Invalid boot device '%s'", a->argv[i]);
 
             bootDeviceChanged[n - 1] = true;
         }
-        else if (strcmp(argv[i], "-hda") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            hdds[0] = argv[i];
-        }
-        else if (strcmp(argv[i], "-hdb") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            hdds[1] = argv[i];
-        }
-        else if (strcmp(argv[i], "-hdd") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            hdds[2] = argv[i];
-        }
-        else if (strcmp(argv[i], "-dvd") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            dvd = argv[i];
-        }
-        else if (strcmp(argv[i], "-dvdpassthrough") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            dvdpassthrough = argv[i];
-        }
-        else if (strcmp(argv[i], "-idecontroller") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            idecontroller = argv[i];
-        }
-        else if (strcmp(argv[i], "-floppy") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            floppy = argv[i];
-        }
-        else if (strcmp(argv[i], "-audio") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            audio = argv[i];
-        }
-        else if (strcmp(argv[i], "-audiocontroller") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            audiocontroller = argv[i];
-        }
-        else if (strcmp(argv[i], "-clipboard") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            clipboard = argv[i];
-        }
-        else if (strncmp(argv[i], "-cableconnected", 15) == 0)
-        {
-            unsigned n = parseNum(&argv[i][15], NetworkAdapterCount, "NIC");
+        else if (strcmp(a->argv[i], "-hda") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            hdds[0] = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-hdb") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            hdds[1] = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-hdd") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            hdds[2] = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-dvd") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            dvd = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-dvdpassthrough") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            dvdpassthrough = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-idecontroller") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            idecontroller = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-floppy") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            floppy = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-audio") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            audio = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-audiocontroller") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            audiocontroller = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-clipboard") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            clipboard = a->argv[i];
+        }
+        else if (strncmp(a->argv[i], "-cableconnected", 15) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][15], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
 
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-
-            cableconnected[n - 1] = argv[i + 1];
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+
+            cableconnected[n - 1] = a->argv[i + 1];
             i++;
         }
         /* watch for the right order of these -nic* comparisons! */
-        else if (strncmp(argv[i], "-nictracefile", 13) == 0)
-        {
-            unsigned n = parseNum(&argv[i][13], NetworkAdapterCount, "NIC");
+        else if (strncmp(a->argv[i], "-nictracefile", 13) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][13], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-            {
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            }
-            nictracefile[n - 1] = argv[i + 1];
-            i++;
-        }
-        else if (strncmp(argv[i], "-nictrace", 9) == 0)
-        {
-            unsigned n = parseNum(&argv[i][9], NetworkAdapterCount, "NIC");
+            if (a->argc <= i + 1)
+            {
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            }
+            nictracefile[n - 1] = a->argv[i + 1];
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-nictrace", 9) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][9], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            nictrace[n - 1] = argv[i + 1];
-            i++;
-        }
-        else if (strncmp(argv[i], "-nictype", 8) == 0)
-        {
-            unsigned n = parseNum(&argv[i][8], NetworkAdapterCount, "NIC");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            nictrace[n - 1] = a->argv[i + 1];
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-nictype", 8) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][8], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            nictype[n - 1] = argv[i + 1];
-            i++;
-        }
-        else if (strncmp(argv[i], "-nicspeed", 9) == 0)
-        {
-            unsigned n = parseNum(&argv[i][9], NetworkAdapterCount, "NIC");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            nictype[n - 1] = a->argv[i + 1];
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-nicspeed", 9) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][9], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            nicspeed[n - 1] = argv[i + 1];
-            i++;
-        }
-        else if (strncmp(argv[i], "-nic", 4) == 0)
-        {
-            unsigned n = parseNum(&argv[i][4], NetworkAdapterCount, "NIC");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            nicspeed[n - 1] = a->argv[i + 1];
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-nic", 4) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][4], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            nics[n - 1] = argv[i + 1];
-            i++;
-        }
-        else if (strncmp(argv[i], "-hostifdev", 10) == 0)
-        {
-            unsigned n = parseNum(&argv[i][10], NetworkAdapterCount, "NIC");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            nics[n - 1] = a->argv[i + 1];
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-hostifdev", 10) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][10], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            hostifdev[n - 1] = argv[i + 1];
-            i++;
-        }
-        else if (strncmp(argv[i], "-intnet", 7) == 0)
-        {
-            unsigned n = parseNum(&argv[i][7], NetworkAdapterCount, "NIC");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            hostifdev[n - 1] = a->argv[i + 1];
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-intnet", 7) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][7], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            intnet[n - 1] = argv[i + 1];
-            i++;
-        }
-        else if (strncmp(argv[i], "-natnet", 7) == 0)
-        {
-            unsigned n = parseNum(&argv[i][7], NetworkAdapterCount, "NIC");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            intnet[n - 1] = a->argv[i + 1];
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-natnet", 7) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][7], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-
-            if (!strcmp(argv[i + 1], "default"))
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+
+            if (!strcmp(a->argv[i + 1], "default"))
                 natnet[n - 1] = "";
             else
@@ -1351,119 +1342,119 @@
                 RTIPV4ADDR Network;
                 RTIPV4ADDR Netmask;
-                int rc = RTCidrStrToIPv4(argv[i + 1], &Network, &Netmask);
+                int rc = RTCidrStrToIPv4(a->argv[i + 1], &Network, &Netmask);
                 if (RT_FAILURE(rc))
-                    return errorArgument("Invalid IPv4 network '%s' specified -- CIDR notation expected.\n", argv[i + 1]);
+                    return errorArgument("Invalid IPv4 network '%s' specified -- CIDR notation expected.\n", a->argv[i + 1]);
                 if (Netmask & 0x1f)
                     return errorArgument("Prefix length of the NAT network must be less than 28.\n");
-                natnet[n - 1] = argv[i + 1];
-            }
-            i++;
-        }
-        else if (strncmp(argv[i], "-macaddress", 11) == 0)
-        {
-            unsigned n = parseNum(&argv[i][11], NetworkAdapterCount, "NIC");
+                natnet[n - 1] = a->argv[i + 1];
+            }
+            i++;
+        }
+        else if (strncmp(a->argv[i], "-macaddress", 11) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][11], NetworkAdapterCount, "NIC");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            macs[n - 1] = argv[i + 1];
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            macs[n - 1] = a->argv[i + 1];
             i++;
         }
 #ifdef VBOX_WITH_VRDP
-        else if (strcmp(argv[i], "-vrdp") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            vrdp = argv[i];
-        }
-        else if (strcmp(argv[i], "-vrdpport") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            if (strcmp(argv[i], "default") == 0)
+        else if (strcmp(a->argv[i], "-vrdp") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            vrdp = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-vrdpport") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (strcmp(a->argv[i], "default") == 0)
                 vrdpport = 0;
             else
-                vrdpport = RTStrToUInt16(argv[i]);
-        }
-        else if (strcmp(argv[i], "-vrdpaddress") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            vrdpaddress = argv[i];
-        }
-        else if (strcmp(argv[i], "-vrdpauthtype") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            vrdpauthtype = argv[i];
-        }
-        else if (strcmp(argv[i], "-vrdpmulticon") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            vrdpmulticon = argv[i];
-        }
-        else if (strcmp(argv[i], "-vrdpreusecon") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            vrdpreusecon = argv[i];
+                vrdpport = RTStrToUInt16(a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-vrdpaddress") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            vrdpaddress = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-vrdpauthtype") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            vrdpauthtype = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-vrdpmulticon") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            vrdpmulticon = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-vrdpreusecon") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            vrdpreusecon = a->argv[i];
         }
 #endif /* VBOX_WITH_VRDP */
-        else if (strcmp(argv[i], "-usb") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            if (strcmp(argv[i], "on") == 0 || strcmp(argv[i], "enable") == 0)
+        else if (strcmp(a->argv[i], "-usb") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (strcmp(a->argv[i], "on") == 0 || strcmp(a->argv[i], "enable") == 0)
                 fUsbEnabled = 1;
-            else if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
+            else if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
                 fUsbEnabled = 0;
             else
-                return errorArgument("Invalid -usb argument '%s'", argv[i]);
-        }
-        else if (strcmp(argv[i], "-usbehci") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            if (strcmp(argv[i], "on") == 0 || strcmp(argv[i], "enable") == 0)
+                return errorArgument("Invalid -usb argument '%s'", a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-usbehci") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (strcmp(a->argv[i], "on") == 0 || strcmp(a->argv[i], "enable") == 0)
                 fUsbEhciEnabled = 1;
-            else if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
+            else if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
                 fUsbEhciEnabled = 0;
             else
-                return errorArgument("Invalid -usbehci argument '%s'", argv[i]);
-        }
-        else if (strcmp(argv[i], "-snapshotfolder") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            snapshotFolder = argv[i];
-        }
-        else if (strncmp(argv[i], "-uartmode", 9) == 0)
-        {
-            unsigned n = parseNum(&argv[i][9], SerialPortCount, "UART");
+                return errorArgument("Invalid -usbehci argument '%s'", a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-snapshotfolder") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            snapshotFolder = a->argv[i];
+        }
+        else if (strncmp(a->argv[i], "-uartmode", 9) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][9], SerialPortCount, "UART");
             if (!n)
                 return 1;
             i++;
-            if (strcmp(argv[i], "disconnected") == 0)
-            {
-                uarts_mode[n - 1] = argv[i];
+            if (strcmp(a->argv[i], "disconnected") == 0)
+            {
+                uarts_mode[n - 1] = a->argv[i];
             }
             else
             {
-                if (strcmp(argv[i], "server") == 0 || strcmp(argv[i], "client") == 0)
-                {
-                    uarts_mode[n - 1] = argv[i];
+                if (strcmp(a->argv[i], "server") == 0 || strcmp(a->argv[i], "client") == 0)
+                {
+                    uarts_mode[n - 1] = a->argv[i];
                     i++;
 #ifdef RT_OS_WINDOWS
-                    if (strncmp(argv[i], "\\\\.\\pipe\\", 9))
+                    if (strncmp(a->argv[i], "\\\\.\\pipe\\", 9))
                         return errorArgument("Uart pipe must start with \\\\.\\pipe\\");
 #endif
@@ -1473,18 +1464,18 @@
                     uarts_mode[n - 1] = (char*)"device";
                 }
-                if (argc <= i)
+                if (a->argc <= i)
                     return errorArgument("Missing argument to -uartmode");
-                uarts_path[n - 1] = argv[i];
-            }
-        }
-        else if (strncmp(argv[i], "-uart", 5) == 0)
-        {
-            unsigned n = parseNum(&argv[i][5], SerialPortCount, "UART");
+                uarts_path[n - 1] = a->argv[i];
+            }
+        }
+        else if (strncmp(a->argv[i], "-uart", 5) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][5], SerialPortCount, "UART");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
             {
                 uarts_base[n - 1] = (ULONG)-1;
@@ -1492,95 +1483,95 @@
             else
             {
-                if (argc <= i + 1)
-                    return errorArgument("Missing argument to '%s'", argv[i-1]);
+                if (a->argc <= i + 1)
+                    return errorArgument("Missing argument to '%s'", a->argv[i-1]);
                 uint32_t uVal;
                 int vrc;
-                vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
+                vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
                 if (vrc != VINF_SUCCESS || uVal == 0)
-                    return errorArgument("Error parsing UART I/O base '%s'", argv[i]);
+                    return errorArgument("Error parsing UART I/O base '%s'", a->argv[i]);
                 uarts_base[n - 1] = uVal;
                 i++;
-                vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
+                vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
                 if (vrc != VINF_SUCCESS)
-                    return errorArgument("Error parsing UART IRQ '%s'", argv[i]);
+                    return errorArgument("Error parsing UART IRQ '%s'", a->argv[i]);
                 uarts_irq[n - 1]  = uVal;
             }
         }
 #ifdef VBOX_WITH_MEM_BALLOONING
-        else if (strncmp(argv[i], "-guestmemoryballoon", 19) == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
+        else if (strncmp(a->argv[i], "-guestmemoryballoon", 19) == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
             i++;
             uint32_t uVal;
             int vrc;
-            vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
+            vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
             if (vrc != VINF_SUCCESS)
-                return errorArgument("Error parsing guest memory balloon size '%s'", argv[i]);
+                return errorArgument("Error parsing guest memory balloon size '%s'", a->argv[i]);
             guestMemBalloonSize = uVal;
         }
 #endif
-        else if (strncmp(argv[i], "-gueststatisticsinterval", 24) == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
+        else if (strncmp(a->argv[i], "-gueststatisticsinterval", 24) == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
             i++;
             uint32_t uVal;
             int vrc;
-            vrc = RTStrToUInt32Ex(argv[i], NULL, 0, &uVal);
+            vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &uVal);
             if (vrc != VINF_SUCCESS)
-                return errorArgument("Error parsing guest statistics interval '%s'", argv[i]);
+                return errorArgument("Error parsing guest statistics interval '%s'", a->argv[i]);
             guestStatInterval = uVal;
         }
-        else if (strcmp(argv[i], "-sata") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            if (strcmp(argv[i], "on") == 0 || strcmp(argv[i], "enable") == 0)
+        else if (strcmp(a->argv[i], "-sata") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            if (strcmp(a->argv[i], "on") == 0 || strcmp(a->argv[i], "enable") == 0)
                 fSataEnabled = 1;
-            else if (strcmp(argv[i], "off") == 0 || strcmp(argv[i], "disable") == 0)
+            else if (strcmp(a->argv[i], "off") == 0 || strcmp(a->argv[i], "disable") == 0)
                 fSataEnabled = 0;
             else
-                return errorArgument("Invalid -usb argument '%s'", argv[i]);
-        }
-        else if (strcmp(argv[i], "-sataportcount") == 0)
+                return errorArgument("Invalid -usb argument '%s'", a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-sataportcount") == 0)
         {
             unsigned n;
 
-            if (argc <= i + 1)
-                return errorArgument("Missing arguments to '%s'", argv[i]);
-            i++;
-
-            n = parseNum(argv[i], 30, "SATA");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing arguments to '%s'", a->argv[i]);
+            i++;
+
+            n = parseNum(a->argv[i], 30, "SATA");
             if (!n)
                 return 1;
             sataPortCount = n;
         }
-        else if (strncmp(argv[i], "-sataport", 9) == 0)
-        {
-            unsigned n = parseNum(&argv[i][9], 30, "SATA");
+        else if (strncmp(a->argv[i], "-sataport", 9) == 0)
+        {
+            unsigned n = parseNum(&a->argv[i][9], 30, "SATA");
             if (!n)
                 return 1;
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            hdds[n-1+4] = argv[i];
-        }
-        else if (strncmp(argv[i], "-sataideemulation", 17) == 0)
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            hdds[n-1+4] = a->argv[i];
+        }
+        else if (strncmp(a->argv[i], "-sataideemulation", 17) == 0)
         {
             unsigned bootDevicePos = 0;
             unsigned n;
 
-            bootDevicePos = parseNum(&argv[i][17], 4, "SATA");
+            bootDevicePos = parseNum(&a->argv[i][17], 4, "SATA");
             if (!bootDevicePos)
                 return 1;
             bootDevicePos--;
 
-            if (argc <= i + 1)
-                return errorArgument("Missing arguments to '%s'", argv[i]);
-            i++;
-
-            n = parseNum(argv[i], 30, "SATA");
+            if (a->argc <= i + 1)
+                return errorArgument("Missing arguments to '%s'", a->argv[i]);
+            i++;
+
+            n = parseNum(a->argv[i], 30, "SATA");
             if (!n)
                 return 1;
@@ -1589,17 +1580,17 @@
         }
         else
-            return errorSyntax(USAGE_MODIFYVM, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+            return errorSyntax(USAGE_MODIFYVM, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
     }
 
     /* try to find the given machine */
     ComPtr <IMachine> machine;
-    Guid uuid (argv[0]);
+    Guid uuid (a->argv[0]);
     if (!uuid.isEmpty())
     {
-        CHECK_ERROR (virtualBox, GetMachine (uuid, machine.asOutParam()));
+        CHECK_ERROR (a->virtualBox, GetMachine (uuid, machine.asOutParam()));
     }
     else
     {
-        CHECK_ERROR (virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR (a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
         if (SUCCEEDED (rc))
             machine->COMGETTER(Id)(uuid.asOutParam());
@@ -1609,10 +1600,10 @@
 
     /* open a session for the VM */
-    CHECK_ERROR_RET (virtualBox, OpenSession(session, uuid), 1);
+    CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
 
     do
     {
         /* get the mutable session machine */
-        session->COMGETTER(Machine)(machine.asOutParam());
+        a->session->COMGETTER(Machine)(machine.asOutParam());
 
         ComPtr <IBIOSSettings> biosSettings;
@@ -1624,5 +1615,5 @@
         {
             ComPtr<IGuestOSType> guestOSType;
-            CHECK_ERROR(virtualBox, GetGuestOSType(ostype, guestOSType.asOutParam()));
+            CHECK_ERROR(a->virtualBox, GetGuestOSType(ostype, guestOSType.asOutParam()));
             if (SUCCEEDED(rc) && guestOSType)
             {
@@ -1863,13 +1854,13 @@
                 Guid uuid(hdds[0]);
                 ComPtr<IHardDisk2> hardDisk;
-                rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
+                rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
                 /* not successful? Then it must be a filename */
                 if (!hardDisk)
                 {
-                    CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
+                    CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
                     if (FAILED(rc))
                     {
                         /* open the new hard disk object */
-                        CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
+                        CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[0]), hardDisk.asOutParam()));
                     }
                 }
@@ -1896,13 +1887,13 @@
                 Guid uuid(hdds[1]);
                 ComPtr<IHardDisk2> hardDisk;
-                rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
+                rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
                 /* not successful? Then it must be a filename */
                 if (!hardDisk)
                 {
-                    CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
+                    CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
                     if (FAILED(rc))
                     {
                         /* open the new hard disk object */
-                        CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
+                        CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[1]), hardDisk.asOutParam()));
                     }
                 }
@@ -1929,13 +1920,13 @@
                 Guid uuid(hdds[2]);
                 ComPtr<IHardDisk2> hardDisk;
-                rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
+                rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
                 /* not successful? Then it must be a filename */
                 if (!hardDisk)
                 {
-                    CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
+                    CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
                     if (FAILED(rc))
                     {
                         /* open the new hard disk object */
-                        CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
+                        CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[2]), hardDisk.asOutParam()));
                     }
                 }
@@ -1966,5 +1957,5 @@
             {
                 ComPtr<IHost> host;
-                CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
+                CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
                 ComPtr<IHostDVDDriveCollection> hostDVDs;
                 CHECK_ERROR(host, COMGETTER(DVDDrives)(hostDVDs.asOutParam()));
@@ -1996,14 +1987,14 @@
                 Guid uuid(dvd);
                 ComPtr<IDVDImage2> dvdImage;
-                rc = virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
+                rc = a->virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
                 if (FAILED(rc) || !dvdImage)
                 {
                     /* must be a filename, check if it's in the collection */
-                    rc = virtualBox->FindDVDImage(Bstr(dvd), dvdImage.asOutParam());
+                    rc = a->virtualBox->FindDVDImage(Bstr(dvd), dvdImage.asOutParam());
                     /* not registered, do that on the fly */
                     if (!dvdImage)
                     {
                         Guid emptyUUID;
-                        CHECK_ERROR(virtualBox, OpenDVDImage(Bstr(dvd), emptyUUID, dvdImage.asOutParam()));
+                        CHECK_ERROR(a->virtualBox, OpenDVDImage(Bstr(dvd), emptyUUID, dvdImage.asOutParam()));
                     }
                 }
@@ -2069,5 +2060,5 @@
                 {
                     ComPtr<IHost> host;
-                    CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
+                    CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
                     ComPtr<IHostFloppyDriveCollection> hostFloppies;
                     CHECK_ERROR(host, COMGETTER(FloppyDrives)(hostFloppies.asOutParam()));
@@ -2087,14 +2078,14 @@
                     Guid uuid(floppy);
                     ComPtr<IFloppyImage2> floppyImage;
-                    rc = virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
+                    rc = a->virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
                     if (FAILED(rc) || !floppyImage)
                     {
                         /* must be a filename, check if it's in the collection */
-                        rc = virtualBox->FindFloppyImage(Bstr(floppy), floppyImage.asOutParam());
+                        rc = a->virtualBox->FindFloppyImage(Bstr(floppy), floppyImage.asOutParam());
                         /* not registered, do that on the fly */
                         if (!floppyImage)
                         {
                             Guid emptyUUID;
-                            CHECK_ERROR(virtualBox, OpenFloppyImage(Bstr(floppy), emptyUUID, floppyImage.asOutParam()));
+                            CHECK_ERROR(a->virtualBox, OpenFloppyImage(Bstr(floppy), emptyUUID, floppyImage.asOutParam()));
                         }
                     }
@@ -2623,13 +2614,13 @@
                     Guid uuid(hdds[i]);
                     ComPtr<IHardDisk2> hardDisk;
-                    rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
+                    rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
                     /* not successful? Then it must be a filename */
                     if (!hardDisk)
                     {
-                        CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
+                        CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
                         if (FAILED(rc))
                         {
                             /* open the new hard disk object */
-                            CHECK_ERROR(virtualBox, OpenHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
+                            CHECK_ERROR(a->virtualBox, OpenHardDisk2(Bstr(hdds[i]), hardDisk.asOutParam()));
                         }
                     }
@@ -2676,5 +2667,5 @@
 
     /* it's important to always close sessions */
-    session->Close();
+    a->session->Close();
 
     return SUCCEEDED(rc) ? 0 : 1;
@@ -2686,19 +2677,18 @@
 #endif
 
-static int handleStartVM(int argc, char *argv[],
-                         ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleStartVM(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc < 1)
+    if (a->argc < 1)
         return errorSyntax(USAGE_STARTVM, "Not enough parameters");
 
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (machine)
@@ -2710,20 +2700,20 @@
         Bstr sessionType = "gui";
         /* has a session type been specified? */
-        if ((argc > 2) && (strcmp(argv[1], "-type") == 0))
-        {
-            if (strcmp(argv[2], "gui") == 0)
+        if ((a->argc > 2) && (strcmp(a->argv[1], "-type") == 0))
+        {
+            if (strcmp(a->argv[2], "gui") == 0)
             {
                 sessionType = "gui";
             }
-            else if (strcmp(argv[2], "vrdp") == 0)
+            else if (strcmp(a->argv[2], "vrdp") == 0)
             {
                 sessionType = "vrdp";
             }
-            else if (strcmp(argv[2], "capture") == 0)
+            else if (strcmp(a->argv[2], "capture") == 0)
             {
                 sessionType = "capture";
             }
             else
-                return errorArgument("Invalid session type argument '%s'", argv[2]);
+                return errorArgument("Invalid session type argument '%s'", a->argv[2]);
         }
 
@@ -2738,6 +2728,6 @@
 #endif
         ComPtr<IProgress> progress;
-        CHECK_ERROR_RET(virtualBox, OpenRemoteSession(session, uuid, sessionType,
-                                                      env, progress.asOutParam()), rc);
+        CHECK_ERROR_RET(a->virtualBox, OpenRemoteSession(a->session, uuid, sessionType,
+                                                         env, progress.asOutParam()), rc);
         RTPrintf("Waiting for the remote session to open...\n");
         CHECK_ERROR_RET(progress, WaitForCompletion (-1), 1);
@@ -2763,27 +2753,26 @@
 
     /* it's important to always close sessions */
-    session->Close();
+    a->session->Close();
 
     return SUCCEEDED(rc) ? 0 : 1;
 }
 
-static int handleControlVM(int argc, char *argv[],
-                           ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleControlVM(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc < 2)
+    if (a->argc < 2)
         return errorSyntax(USAGE_CONTROLVM, "Not enough parameters");
 
     /* try to find the given machine */
     ComPtr <IMachine> machine;
-    Guid uuid (argv[0]);
+    Guid uuid (a->argv[0]);
     if (!uuid.isEmpty())
     {
-        CHECK_ERROR (virtualBox, GetMachine (uuid, machine.asOutParam()));
+        CHECK_ERROR (a->virtualBox, GetMachine (uuid, machine.asOutParam()));
     }
     else
     {
-        CHECK_ERROR (virtualBox, FindMachine (Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR (a->virtualBox, FindMachine (Bstr(a->argv[0]), machine.asOutParam()));
         if (SUCCEEDED (rc))
             machine->COMGETTER(Id) (uuid.asOutParam());
@@ -2793,5 +2782,5 @@
 
     /* open a session for the VM */
-    CHECK_ERROR_RET (virtualBox, OpenExistingSession (session, uuid), 1);
+    CHECK_ERROR_RET (a->virtualBox, OpenExistingSession (a->session, uuid), 1);
 
     do
@@ -2799,27 +2788,27 @@
         /* get the associated console */
         ComPtr<IConsole> console;
-        CHECK_ERROR_BREAK (session, COMGETTER(Console)(console.asOutParam()));
+        CHECK_ERROR_BREAK (a->session, COMGETTER(Console)(console.asOutParam()));
         /* ... and session machine */
         ComPtr<IMachine> sessionMachine;
-        CHECK_ERROR_BREAK (session, COMGETTER(Machine)(sessionMachine.asOutParam()));
+        CHECK_ERROR_BREAK (a->session, COMGETTER(Machine)(sessionMachine.asOutParam()));
 
         /* which command? */
-        if (strcmp(argv[1], "pause") == 0)
+        if (strcmp(a->argv[1], "pause") == 0)
         {
             CHECK_ERROR_BREAK (console, Pause());
         }
-        else if (strcmp(argv[1], "resume") == 0)
+        else if (strcmp(a->argv[1], "resume") == 0)
         {
             CHECK_ERROR_BREAK (console, Resume());
         }
-        else if (strcmp(argv[1], "reset") == 0)
+        else if (strcmp(a->argv[1], "reset") == 0)
         {
             CHECK_ERROR_BREAK (console, Reset());
         }
-        else if (strcmp(argv[1], "poweroff") == 0)
+        else if (strcmp(a->argv[1], "poweroff") == 0)
         {
             CHECK_ERROR_BREAK (console, PowerDown());
         }
-        else if (strcmp(argv[1], "savestate") == 0)
+        else if (strcmp(a->argv[1], "savestate") == 0)
         {
             ComPtr<IProgress> progress;
@@ -2842,13 +2831,13 @@
             }
         }
-        else if (strcmp(argv[1], "acpipowerbutton") == 0)
+        else if (strcmp(a->argv[1], "acpipowerbutton") == 0)
         {
             CHECK_ERROR_BREAK (console, PowerButton());
         }
-        else if (strcmp(argv[1], "acpisleepbutton") == 0)
+        else if (strcmp(a->argv[1], "acpisleepbutton") == 0)
         {
             CHECK_ERROR_BREAK (console, SleepButton());
         }
-        else if (strcmp(argv[1], "injectnmi") == 0)
+        else if (strcmp(a->argv[1], "injectnmi") == 0)
         {
             /* get the machine debugger. */
@@ -2857,12 +2846,12 @@
             CHECK_ERROR_BREAK(debugger, InjectNMI());
         }
-        else if (strcmp(argv[1], "keyboardputscancode") == 0)
+        else if (strcmp(a->argv[1], "keyboardputscancode") == 0)
         {
             ComPtr<IKeyboard> keyboard;
             CHECK_ERROR_BREAK(console, COMGETTER(Keyboard)(keyboard.asOutParam()));
 
-            if (argc <= 1 + 1)
-            {
-                errorArgument("Missing argument to '%s'. Expected IBM PC AT set 2 keyboard scancode(s) as hex byte(s).", argv[1]);
+            if (a->argc <= 1 + 1)
+            {
+                errorArgument("Missing argument to '%s'. Expected IBM PC AT set 2 keyboard scancode(s) as hex byte(s).", a->argv[1]);
                 rc = E_FAIL;
                 break;
@@ -2875,15 +2864,15 @@
             /* Process the command line. */
             int i;
-            for (i = 1 + 1; i < argc && cScancodes < (int)RT_ELEMENTS(alScancodes); i++, cScancodes++)
-            {
-                if (   RT_C_IS_XDIGIT (argv[i][0])
-                    && RT_C_IS_XDIGIT (argv[i][1])
-                    && argv[i][2] == 0)
+            for (i = 1 + 1; i < a->argc && cScancodes < (int)RT_ELEMENTS(alScancodes); i++, cScancodes++)
+            {
+                if (   RT_C_IS_XDIGIT (a->argv[i][0])
+                    && RT_C_IS_XDIGIT (a->argv[i][1])
+                    && a->argv[i][2] == 0)
                 {
                     uint8_t u8Scancode;
-                    int rc = RTStrToUInt8Ex(argv[i], NULL, 16, &u8Scancode);
+                    int rc = RTStrToUInt8Ex(a->argv[i], NULL, 16, &u8Scancode);
                     if (RT_FAILURE (rc))
                     {
-                        RTPrintf("Error: converting '%s' returned %Rrc!\n", argv[i], rc);
+                        RTPrintf("Error: converting '%s' returned %Rrc!\n", a->argv[i], rc);
                         rc = E_FAIL;
                         break;
@@ -2894,5 +2883,5 @@
                 else
                 {
-                    RTPrintf("Error: '%s' is not a hex byte!\n", argv[i]);
+                    RTPrintf("Error: '%s' is not a hex byte!\n", a->argv[i]);
                     rc = E_FAIL;
                     break;
@@ -2904,5 +2893,5 @@
 
             if (   cScancodes == RT_ELEMENTS(alScancodes)
-                && i < argc)
+                && i < a->argc)
             {
                 RTPrintf("Error: too many scancodes, maximum %d allowed!\n", RT_ELEMENTS(alScancodes));
@@ -2920,13 +2909,13 @@
             }
         }
-        else if (strncmp(argv[1], "setlinkstate", 12) == 0)
+        else if (strncmp(a->argv[1], "setlinkstate", 12) == 0)
         {
             /* Get the number of network adapters */
             ULONG NetworkAdapterCount = 0;
             ComPtr <ISystemProperties> info;
-            CHECK_ERROR_BREAK (virtualBox, COMGETTER(SystemProperties) (info.asOutParam()));
+            CHECK_ERROR_BREAK (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()));
             CHECK_ERROR_BREAK (info, COMGETTER(NetworkAdapterCount) (&NetworkAdapterCount));
 
-            unsigned n = parseNum(&argv[1][12], NetworkAdapterCount, "NIC");
+            unsigned n = parseNum(&a->argv[1][12], NetworkAdapterCount, "NIC");
             if (!n)
             {
@@ -2934,7 +2923,7 @@
                 break;
             }
-            if (argc <= 1 + 1)
-            {
-                errorArgument("Missing argument to '%s'", argv[1]);
+            if (a->argc <= 1 + 1)
+            {
+                errorArgument("Missing argument to '%s'", a->argv[1]);
                 rc = E_FAIL;
                 break;
@@ -2945,9 +2934,9 @@
             if (adapter)
             {
-                if (strcmp(argv[2], "on") == 0)
+                if (strcmp(a->argv[2], "on") == 0)
                 {
                     CHECK_ERROR_BREAK (adapter, COMSETTER(CableConnected)(TRUE));
                 }
-                else if (strcmp(argv[2], "off") == 0)
+                else if (strcmp(a->argv[2], "off") == 0)
                 {
                     CHECK_ERROR_BREAK (adapter, COMSETTER(CableConnected)(FALSE));
@@ -2955,5 +2944,5 @@
                 else
                 {
-                    errorArgument("Invalid link state '%s'", Utf8Str(argv[2]).raw());
+                    errorArgument("Invalid link state '%s'", Utf8Str(a->argv[2]).raw());
                     rc = E_FAIL;
                     break;
@@ -2962,9 +2951,9 @@
         }
 #ifdef VBOX_WITH_VRDP
-        else if (strcmp(argv[1], "vrdp") == 0)
-        {
-            if (argc <= 1 + 1)
-            {
-                errorArgument("Missing argument to '%s'", argv[1]);
+        else if (strcmp(a->argv[1], "vrdp") == 0)
+        {
+            if (a->argc <= 1 + 1)
+            {
+                errorArgument("Missing argument to '%s'", a->argv[1]);
                 rc = E_FAIL;
                 break;
@@ -2976,9 +2965,9 @@
             if (vrdpServer)
             {
-                if (strcmp(argv[2], "on") == 0)
+                if (strcmp(a->argv[2], "on") == 0)
                 {
                     CHECK_ERROR_BREAK (vrdpServer, COMSETTER(Enabled)(TRUE));
                 }
-                else if (strcmp(argv[2], "off") == 0)
+                else if (strcmp(a->argv[2], "off") == 0)
                 {
                     CHECK_ERROR_BREAK (vrdpServer, COMSETTER(Enabled)(FALSE));
@@ -2986,5 +2975,5 @@
                 else
                 {
-                    errorArgument("Invalid vrdp server state '%s'", Utf8Str(argv[2]).raw());
+                    errorArgument("Invalid vrdp server state '%s'", Utf8Str(a->argv[2]).raw());
                     rc = E_FAIL;
                     break;
@@ -2993,8 +2982,8 @@
         }
 #endif /* VBOX_WITH_VRDP */
-        else if (strcmp (argv[1], "usbattach") == 0 ||
-                 strcmp (argv[1], "usbdetach") == 0)
-        {
-            if (argc < 3)
+        else if (strcmp (a->argv[1], "usbattach") == 0 ||
+                 strcmp (a->argv[1], "usbdetach") == 0)
+        {
+            if (a->argc < 3)
             {
                 errorSyntax(USAGE_CONTROLVM, "Not enough parameters");
@@ -3003,7 +2992,7 @@
             }
 
-            bool attach = strcmp (argv[1], "usbattach") == 0;
-
-            Guid usbId = argv [2];
+            bool attach = strcmp (a->argv[1], "usbattach") == 0;
+
+            Guid usbId = a->argv [2];
             if (usbId.isEmpty())
             {
@@ -3012,9 +3001,9 @@
                 {
                     ComPtr <IHost> host;
-                    CHECK_ERROR_BREAK (virtualBox, COMGETTER(Host) (host.asOutParam()));
+                    CHECK_ERROR_BREAK (a->virtualBox, COMGETTER(Host) (host.asOutParam()));
                     ComPtr <IHostUSBDeviceCollection> coll;
                     CHECK_ERROR_BREAK (host, COMGETTER(USBDevices) (coll.asOutParam()));
                     ComPtr <IHostUSBDevice> dev;
-                    CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (argv [2]), dev.asOutParam()));
+                    CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (a->argv [2]), dev.asOutParam()));
                     CHECK_ERROR_BREAK (dev, COMGETTER(Id) (usbId.asOutParam()));
                 }
@@ -3024,5 +3013,5 @@
                     CHECK_ERROR_BREAK (console, COMGETTER(USBDevices)(coll.asOutParam()));
                     ComPtr <IUSBDevice> dev;
-                    CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (argv [2]), dev.asOutParam()));
+                    CHECK_ERROR_BREAK (coll, FindByAddress (Bstr (a->argv [2]), dev.asOutParam()));
                     CHECK_ERROR_BREAK (dev, COMGETTER(Id) (usbId.asOutParam()));
                 }
@@ -3037,7 +3026,7 @@
             }
         }
-        else if (strcmp(argv[1], "setvideomodehint") == 0)
-        {
-            if (argc != 5 && argc != 6)
+        else if (strcmp(a->argv[1], "setvideomodehint") == 0)
+        {
+            if (a->argc != 5 && a->argc != 6)
             {
                 errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
@@ -3045,10 +3034,10 @@
                 break;
             }
-            uint32_t xres = RTStrToUInt32(argv[2]);
-            uint32_t yres = RTStrToUInt32(argv[3]);
-            uint32_t bpp  = RTStrToUInt32(argv[4]);
+            uint32_t xres = RTStrToUInt32(a->argv[2]);
+            uint32_t yres = RTStrToUInt32(a->argv[3]);
+            uint32_t bpp  = RTStrToUInt32(a->argv[4]);
             uint32_t displayIdx = 0;
-            if (argc == 6)
-                displayIdx = RTStrToUInt32(argv[5]);
+            if (a->argc == 6)
+                displayIdx = RTStrToUInt32(a->argv[5]);
 
             ComPtr<IDisplay> display;
@@ -3056,19 +3045,19 @@
             CHECK_ERROR_BREAK(display, SetVideoModeHint(xres, yres, bpp, displayIdx));
         }
-        else if (strcmp(argv[1], "setcredentials") == 0)
+        else if (strcmp(a->argv[1], "setcredentials") == 0)
         {
             bool fAllowLocalLogon = true;
-            if (argc == 7)
-            {
-                if (strcmp(argv[5], "-allowlocallogon") != 0)
-                {
-                    errorArgument("Invalid parameter '%s'", argv[5]);
+            if (a->argc == 7)
+            {
+                if (strcmp(a->argv[5], "-allowlocallogon") != 0)
+                {
+                    errorArgument("Invalid parameter '%s'", a->argv[5]);
                     rc = E_FAIL;
                     break;
                 }
-                if (strcmp(argv[6], "no") == 0)
+                if (strcmp(a->argv[6], "no") == 0)
                     fAllowLocalLogon = false;
             }
-            else if (argc != 5)
+            else if (a->argc != 5)
             {
                 errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
@@ -3079,9 +3068,9 @@
             ComPtr<IGuest> guest;
             CHECK_ERROR_BREAK(console, COMGETTER(Guest)(guest.asOutParam()));
-            CHECK_ERROR_BREAK(guest, SetCredentials(Bstr(argv[2]), Bstr(argv[3]), Bstr(argv[4]), fAllowLocalLogon));
-        }
-        else if (strcmp(argv[1], "dvdattach") == 0)
-        {
-            if (argc != 3)
+            CHECK_ERROR_BREAK(guest, SetCredentials(Bstr(a->argv[2]), Bstr(a->argv[3]), Bstr(a->argv[4]), fAllowLocalLogon));
+        }
+        else if (strcmp(a->argv[1], "dvdattach") == 0)
+        {
+            if (a->argc != 3)
             {
                 errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
@@ -3094,17 +3083,17 @@
 
             /* unmount? */
-            if (strcmp(argv[2], "none") == 0)
+            if (strcmp(a->argv[2], "none") == 0)
             {
                 CHECK_ERROR(dvdDrive, Unmount());
             }
             /* host drive? */
-            else if (strncmp(argv[2], "host:", 5) == 0)
+            else if (strncmp(a->argv[2], "host:", 5) == 0)
             {
                 ComPtr<IHost> host;
-                CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
+                CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
                 ComPtr<IHostDVDDriveCollection> hostDVDs;
                 CHECK_ERROR(host, COMGETTER(DVDDrives)(hostDVDs.asOutParam()));
                 ComPtr<IHostDVDDrive> hostDVDDrive;
-                rc = hostDVDs->FindByName(Bstr(argv[2] + 5), hostDVDDrive.asOutParam());
+                rc = hostDVDs->FindByName(Bstr(a->argv[2] + 5), hostDVDDrive.asOutParam());
                 if (!hostDVDDrive)
                 {
@@ -3118,16 +3107,16 @@
             {
                 /* first assume it's a UUID */
-                Guid uuid(argv[2]);
+                Guid uuid(a->argv[2]);
                 ComPtr<IDVDImage2> dvdImage;
-                rc = virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
+                rc = a->virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
                 if (FAILED(rc) || !dvdImage)
                 {
                     /* must be a filename, check if it's in the collection */
-                    rc = virtualBox->FindDVDImage(Bstr(argv[2]), dvdImage.asOutParam());
+                    rc = a->virtualBox->FindDVDImage(Bstr(a->argv[2]), dvdImage.asOutParam());
                     /* not registered, do that on the fly */
                     if (!dvdImage)
                     {
                         Guid emptyUUID;
-                        CHECK_ERROR(virtualBox, OpenDVDImage(Bstr(argv[2]), emptyUUID, dvdImage.asOutParam()));
+                        CHECK_ERROR(a->virtualBox, OpenDVDImage(Bstr(a->argv[2]), emptyUUID, dvdImage.asOutParam()));
                     }
                 }
@@ -3141,7 +3130,7 @@
             }
         }
-        else if (strcmp(argv[1], "floppyattach") == 0)
-        {
-            if (argc != 3)
+        else if (strcmp(a->argv[1], "floppyattach") == 0)
+        {
+            if (a->argc != 3)
             {
                 errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
@@ -3155,17 +3144,17 @@
 
             /* unmount? */
-            if (strcmp(argv[2], "none") == 0)
+            if (strcmp(a->argv[2], "none") == 0)
             {
                 CHECK_ERROR(floppyDrive, Unmount());
             }
             /* host drive? */
-            else if (strncmp(argv[2], "host:", 5) == 0)
+            else if (strncmp(a->argv[2], "host:", 5) == 0)
             {
                 ComPtr<IHost> host;
-                CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
+                CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
                 ComPtr<IHostFloppyDriveCollection> hostFloppies;
                 CHECK_ERROR(host, COMGETTER(FloppyDrives)(hostFloppies.asOutParam()));
                 ComPtr<IHostFloppyDrive> hostFloppyDrive;
-                rc = hostFloppies->FindByName(Bstr(argv[2] + 5), hostFloppyDrive.asOutParam());
+                rc = hostFloppies->FindByName(Bstr(a->argv[2] + 5), hostFloppyDrive.asOutParam());
                 if (!hostFloppyDrive)
                 {
@@ -3179,16 +3168,16 @@
             {
                 /* first assume it's a UUID */
-                Guid uuid(argv[2]);
+                Guid uuid(a->argv[2]);
                 ComPtr<IFloppyImage2> floppyImage;
-                rc = virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
+                rc = a->virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
                 if (FAILED(rc) || !floppyImage)
                 {
                     /* must be a filename, check if it's in the collection */
-                    rc = virtualBox->FindFloppyImage(Bstr(argv[2]), floppyImage.asOutParam());
+                    rc = a->virtualBox->FindFloppyImage(Bstr(a->argv[2]), floppyImage.asOutParam());
                     /* not registered, do that on the fly */
                     if (!floppyImage)
                     {
                         Guid emptyUUID;
-                        CHECK_ERROR(virtualBox, OpenFloppyImage(Bstr(argv[2]), emptyUUID, floppyImage.asOutParam()));
+                        CHECK_ERROR(a->virtualBox, OpenFloppyImage(Bstr(a->argv[2]), emptyUUID, floppyImage.asOutParam()));
                     }
                 }
@@ -3203,7 +3192,7 @@
         }
 #ifdef VBOX_WITH_MEM_BALLOONING
-        else if (strncmp(argv[1], "-guestmemoryballoon", 19) == 0)
-        {
-            if (argc != 3)
+        else if (strncmp(a->argv[1], "-guestmemoryballoon", 19) == 0)
+        {
+            if (a->argc != 3)
             {
                 errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
@@ -3213,8 +3202,8 @@
             uint32_t uVal;
             int vrc;
-            vrc = RTStrToUInt32Ex(argv[2], NULL, 0, &uVal);
+            vrc = RTStrToUInt32Ex(a->argv[2], NULL, 0, &uVal);
             if (vrc != VINF_SUCCESS)
             {
-                errorArgument("Error parsing guest memory balloon size '%s'", argv[2]);
+                errorArgument("Error parsing guest memory balloon size '%s'", a->argv[2]);
                 rc = E_FAIL;
                 break;
@@ -3229,7 +3218,7 @@
         }
 #endif
-        else if (strncmp(argv[1], "-gueststatisticsinterval", 24) == 0)
-        {
-            if (argc != 3)
+        else if (strncmp(a->argv[1], "-gueststatisticsinterval", 24) == 0)
+        {
+            if (a->argc != 3)
             {
                 errorSyntax(USAGE_CONTROLVM, "Incorrect number of parameters");
@@ -3239,8 +3228,8 @@
             uint32_t uVal;
             int vrc;
-            vrc = RTStrToUInt32Ex(argv[2], NULL, 0, &uVal);
+            vrc = RTStrToUInt32Ex(a->argv[2], NULL, 0, &uVal);
             if (vrc != VINF_SUCCESS)
             {
-                errorArgument("Error parsing guest statistics interval '%s'", argv[2]);
+                errorArgument("Error parsing guest statistics interval '%s'", a->argv[2]);
                 rc = E_FAIL;
                 break;
@@ -3256,5 +3245,5 @@
         else
         {
-            errorSyntax(USAGE_CONTROLVM, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
+            errorSyntax(USAGE_CONTROLVM, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
             rc = E_FAIL;
         }
@@ -3262,24 +3251,23 @@
     while (0);
 
-    session->Close();
+    a->session->Close();
 
     return SUCCEEDED (rc) ? 0 : 1;
 }
 
-static int handleDiscardState(int argc, char *argv[],
-                              ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleDiscardState(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc != 1)
+    if (a->argc != 1)
         return errorSyntax(USAGE_DISCARDSTATE, "Incorrect number of parameters");
 
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (machine)
@@ -3290,13 +3278,13 @@
             Guid guid;
             machine->COMGETTER(Id)(guid.asOutParam());
-            CHECK_ERROR_BREAK(virtualBox, OpenSession(session, guid));
+            CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
             do
             {
                 ComPtr<IConsole> console;
-                CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
+                CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
                 CHECK_ERROR_BREAK(console, DiscardSavedState());
             }
             while (0);
-            CHECK_ERROR_BREAK(session, Close());
+            CHECK_ERROR_BREAK(a->session, Close());
         }
         while (0);
@@ -3306,19 +3294,18 @@
 }
 
-static int handleAdoptdState(int argc, char *argv[],
-                             ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleAdoptdState(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc != 2)
+    if (a->argc != 2)
         return errorSyntax(USAGE_ADOPTSTATE, "Incorrect number of parameters");
 
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (machine)
@@ -3329,13 +3316,13 @@
             Guid guid;
             machine->COMGETTER(Id)(guid.asOutParam());
-            CHECK_ERROR_BREAK(virtualBox, OpenSession(session, guid));
+            CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
             do
             {
                 ComPtr<IConsole> console;
-                CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
-                CHECK_ERROR_BREAK(console, AdoptSavedState (Bstr (argv[1])));
+                CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
+                CHECK_ERROR_BREAK(console, AdoptSavedState (Bstr (a->argv[1])));
             }
             while (0);
-            CHECK_ERROR_BREAK(session, Close());
+            CHECK_ERROR_BREAK(a->session, Close());
         }
         while (0);
@@ -3345,11 +3332,10 @@
 }
 
-static int handleSnapshot(int argc, char *argv[],
-                          ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleSnapshot(HandlerArg *a)
 {
     HRESULT rc;
 
     /* we need at least a VM and a command */
-    if (argc < 2)
+    if (a->argc < 2)
         return errorSyntax(USAGE_SNAPSHOT, "Not enough parameters");
 
@@ -3357,9 +3343,9 @@
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (!machine)
@@ -3371,15 +3357,15 @@
     {
         /* we have to open a session for this task. First try an existing session */
-        rc = virtualBox->OpenExistingSession(session, guid);
+        rc = a->virtualBox->OpenExistingSession(a->session, guid);
         if (FAILED(rc))
-            CHECK_ERROR_BREAK(virtualBox, OpenSession(session, guid));
+            CHECK_ERROR_BREAK(a->virtualBox, OpenSession(a->session, guid));
         ComPtr<IConsole> console;
-        CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
+        CHECK_ERROR_BREAK(a->session, COMGETTER(Console)(console.asOutParam()));
 
         /* switch based on the command */
-        if (strcmp(argv[1], "take") == 0)
+        if (strcmp(a->argv[1], "take") == 0)
         {
             /* there must be a name */
-            if (argc < 3)
+            if (a->argc < 3)
             {
                 errorSyntax(USAGE_SNAPSHOT, "Missing snapshot name");
@@ -3387,6 +3373,6 @@
                 break;
             }
-            Bstr name(argv[2]);
-            if ((argc > 3) && ((argc != 5) || (strcmp(argv[3], "-desc") != 0)))
+            Bstr name(a->argv[2]);
+            if ((a->argc > 3) && ((a->argc != 5) || (strcmp(a->argv[3], "-desc") != 0)))
             {
                 errorSyntax(USAGE_SNAPSHOT, "Incorrect description format");
@@ -3395,6 +3381,6 @@
             }
             Bstr desc;
-            if (argc == 5)
-                desc = argv[4];
+            if (a->argc == 5)
+                desc = a->argv[4];
             ComPtr<IProgress> progress;
             CHECK_ERROR_BREAK(console, TakeSnapshot(name, desc, progress.asOutParam()));
@@ -3411,8 +3397,8 @@
             }
         }
-        else if (strcmp(argv[1], "discard") == 0)
+        else if (strcmp(a->argv[1], "discard") == 0)
         {
             /* exactly one parameter: snapshot name */
-            if (argc != 3)
+            if (a->argc != 3)
             {
                 errorSyntax(USAGE_SNAPSHOT, "Expecting snapshot name only");
@@ -3424,5 +3410,5 @@
 
             /* assume it's a UUID */
-            Guid guid(argv[2]);
+            Guid guid(a->argv[2]);
             if (!guid.isEmpty())
             {
@@ -3432,5 +3418,5 @@
             {
                 /* then it must be a name */
-                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(argv[2]), snapshot.asOutParam()));
+                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
             }
 
@@ -3451,16 +3437,16 @@
             }
         }
-        else if (strcmp(argv[1], "discardcurrent") == 0)
-        {
-            if (   (argc != 3)
-                || (   (strcmp(argv[2], "-state") != 0)
-                    && (strcmp(argv[2], "-all") != 0)))
-            {
-                errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(argv[2]).raw());
+        else if (strcmp(a->argv[1], "discardcurrent") == 0)
+        {
+            if (   (a->argc != 3)
+                || (   (strcmp(a->argv[2], "-state") != 0)
+                    && (strcmp(a->argv[2], "-all") != 0)))
+            {
+                errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[2]).raw());
                 rc = E_FAIL;
                 break;
             }
             bool fAll = false;
-            if (strcmp(argv[2], "-all") == 0)
+            if (strcmp(a->argv[2], "-all") == 0)
                 fAll = true;
 
@@ -3488,7 +3474,7 @@
 
         }
-        else if (strcmp(argv[1], "edit") == 0)
-        {
-            if (argc < 3)
+        else if (strcmp(a->argv[1], "edit") == 0)
+        {
+            if (a->argc < 3)
             {
                 errorSyntax(USAGE_SNAPSHOT, "Missing snapshot name");
@@ -3499,5 +3485,5 @@
             ComPtr<ISnapshot> snapshot;
 
-            if (strcmp(argv[2], "-current") == 0)
+            if (strcmp(a->argv[2], "-current") == 0)
             {
                 CHECK_ERROR_BREAK(machine, COMGETTER(CurrentSnapshot)(snapshot.asOutParam()));
@@ -3506,5 +3492,5 @@
             {
                 /* assume it's a UUID */
-                Guid guid(argv[2]);
+                Guid guid(a->argv[2]);
                 if (!guid.isEmpty())
                 {
@@ -3514,36 +3500,36 @@
                 {
                     /* then it must be a name */
-                    CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(argv[2]), snapshot.asOutParam()));
+                    CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
                 }
             }
 
             /* parse options */
-            for (int i = 3; i < argc; i++)
-            {
-                if (strcmp(argv[i], "-newname") == 0)
-                {
-                    if (argc <= i + 1)
+            for (int i = 3; i < a->argc; i++)
+            {
+                if (strcmp(a->argv[i], "-newname") == 0)
+                {
+                    if (a->argc <= i + 1)
                     {
-                        errorArgument("Missing argument to '%s'", argv[i]);
+                        errorArgument("Missing argument to '%s'", a->argv[i]);
                         rc = E_FAIL;
                         break;
                     }
                     i++;
-                    snapshot->COMSETTER(Name)(Bstr(argv[i]));
-                }
-                else if (strcmp(argv[i], "-newdesc") == 0)
-                {
-                    if (argc <= i + 1)
+                    snapshot->COMSETTER(Name)(Bstr(a->argv[i]));
+                }
+                else if (strcmp(a->argv[i], "-newdesc") == 0)
+                {
+                    if (a->argc <= i + 1)
                     {
-                        errorArgument("Missing argument to '%s'", argv[i]);
+                        errorArgument("Missing argument to '%s'", a->argv[i]);
                         rc = E_FAIL;
                         break;
                     }
                     i++;
-                    snapshot->COMSETTER(Description)(Bstr(argv[i]));
+                    snapshot->COMSETTER(Description)(Bstr(a->argv[i]));
                 }
                 else
                 {
-                    errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+                    errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
                     rc = E_FAIL;
                     break;
@@ -3552,8 +3538,8 @@
 
         }
-        else if (strcmp(argv[1], "showvminfo") == 0)
+        else if (strcmp(a->argv[1], "showvminfo") == 0)
         {
             /* exactly one parameter: snapshot name */
-            if (argc != 3)
+            if (a->argc != 3)
             {
                 errorSyntax(USAGE_SNAPSHOT, "Expecting snapshot name only");
@@ -3565,5 +3551,5 @@
 
             /* assume it's a UUID */
-            Guid guid(argv[2]);
+            Guid guid(a->argv[2]);
             if (!guid.isEmpty())
             {
@@ -3573,5 +3559,5 @@
             {
                 /* then it must be a name */
-                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(argv[2]), snapshot.asOutParam()));
+                CHECK_ERROR_BREAK(machine, FindSnapshot(Bstr(a->argv[2]), snapshot.asOutParam()));
             }
 
@@ -3579,31 +3565,30 @@
             ComPtr<IMachine> machine;
             snapshot->COMGETTER(Machine)(machine.asOutParam());
-            showVMInfo(virtualBox, machine, console);
+            showVMInfo(a->virtualBox, machine, console);
         }
         else
         {
-            errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
+            errorSyntax(USAGE_SNAPSHOT, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
             rc = E_FAIL;
         }
     } while (0);
 
-    session->Close();
+    a->session->Close();
 
     return SUCCEEDED(rc) ? 0 : 1;
 }
 
-static int handleGetExtraData(int argc, char *argv[],
-                              ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleGetExtraData(HandlerArg *a)
 {
     HRESULT rc = S_OK;
 
-    if (argc != 2)
+    if (a->argc != 2)
         return errorSyntax(USAGE_GETEXTRADATA, "Incorrect number of parameters");
 
     /* global data? */
-    if (strcmp(argv[0], "global") == 0)
+    if (strcmp(a->argv[0], "global") == 0)
     {
         /* enumeration? */
-        if (strcmp(argv[1], "enumerate") == 0)
+        if (strcmp(a->argv[1], "enumerate") == 0)
         {
             Bstr extraDataKey;
@@ -3613,6 +3598,6 @@
                 Bstr nextExtraDataKey;
                 Bstr nextExtraDataValue;
-                HRESULT rcEnum = virtualBox->GetNextExtraDataKey(extraDataKey, nextExtraDataKey.asOutParam(),
-                                                                 nextExtraDataValue.asOutParam());
+                HRESULT rcEnum = a->virtualBox->GetNextExtraDataKey(extraDataKey, nextExtraDataKey.asOutParam(),
+                                                                    nextExtraDataValue.asOutParam());
                 extraDataKey = nextExtraDataKey;
 
@@ -3624,5 +3609,5 @@
         {
             Bstr value;
-            CHECK_ERROR(virtualBox, GetExtraData(Bstr(argv[1]), value.asOutParam()));
+            CHECK_ERROR(a->virtualBox, GetExtraData(Bstr(a->argv[1]), value.asOutParam()));
             if (value)
                 RTPrintf("Value: %lS\n", value.raw());
@@ -3635,14 +3620,14 @@
         ComPtr<IMachine> machine;
         /* assume it's a UUID */
-        rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+        rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
         if (FAILED(rc) || !machine)
         {
             /* must be a name */
-            CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+            CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
         }
         if (machine)
         {
             /* enumeration? */
-            if (strcmp(argv[1], "enumerate") == 0)
+            if (strcmp(a->argv[1], "enumerate") == 0)
             {
                 Bstr extraDataKey;
@@ -3665,5 +3650,5 @@
             {
                 Bstr value;
-                CHECK_ERROR(machine, GetExtraData(Bstr(argv[1]), value.asOutParam()));
+                CHECK_ERROR(machine, GetExtraData(Bstr(a->argv[1]), value.asOutParam()));
                 if (value)
                     RTPrintf("Value: %lS\n", value.raw());
@@ -3676,19 +3661,18 @@
 }
 
-static int handleSetExtraData(int argc, char *argv[],
-                              ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleSetExtraData(HandlerArg *a)
 {
     HRESULT rc = S_OK;
 
-    if (argc < 2)
+    if (a->argc < 2)
         return errorSyntax(USAGE_SETEXTRADATA, "Not enough parameters");
 
     /* global data? */
-    if (strcmp(argv[0], "global") == 0)
-    {
-        if (argc < 3)
-            CHECK_ERROR(virtualBox, SetExtraData(Bstr(argv[1]), NULL));
-        else if (argc == 3)
-            CHECK_ERROR(virtualBox, SetExtraData(Bstr(argv[1]), Bstr(argv[2])));
+    if (strcmp(a->argv[0], "global") == 0)
+    {
+        if (a->argc < 3)
+            CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]), NULL));
+        else if (a->argc == 3)
+            CHECK_ERROR(a->virtualBox, SetExtraData(Bstr(a->argv[1]), Bstr(a->argv[2])));
         else
             return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
@@ -3698,16 +3682,16 @@
         ComPtr<IMachine> machine;
         /* assume it's a UUID */
-        rc = virtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+        rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
         if (FAILED(rc) || !machine)
         {
             /* must be a name */
-            CHECK_ERROR(virtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+            CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
         }
         if (machine)
         {
-            if (argc < 3)
-                CHECK_ERROR(machine, SetExtraData(Bstr(argv[1]), NULL));
-            else if (argc == 3)
-                CHECK_ERROR(machine, SetExtraData(Bstr(argv[1]), Bstr(argv[2])));
+            if (a->argc < 3)
+                CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]), NULL));
+            else if (a->argc == 3)
+                CHECK_ERROR(machine, SetExtraData(Bstr(a->argv[1]), Bstr(a->argv[2])));
             else
                 return errorSyntax(USAGE_SETEXTRADATA, "Too many parameters");
@@ -3717,74 +3701,72 @@
 }
 
-static int handleSetProperty(int argc, char *argv[],
-                             ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+static int handleSetProperty(HandlerArg *a)
 {
     HRESULT rc;
 
     /* there must be two arguments: property name and value */
-    if (argc != 2)
+    if (a->argc != 2)
         return errorSyntax(USAGE_SETPROPERTY, "Incorrect number of parameters");
 
     ComPtr<ISystemProperties> systemProperties;
-    virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
-
-    if (strcmp(argv[0], "hdfolder") == 0)
+    a->virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
+
+    if (strcmp(a->argv[0], "hdfolder") == 0)
     {
         /* reset to default? */
-        if (strcmp(argv[1], "default") == 0)
+        if (strcmp(a->argv[1], "default") == 0)
             CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(NULL));
         else
-            CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(Bstr(argv[1])));
-    }
-    else if (strcmp(argv[0], "machinefolder") == 0)
+            CHECK_ERROR(systemProperties, COMSETTER(DefaultHardDiskFolder)(Bstr(a->argv[1])));
+    }
+    else if (strcmp(a->argv[0], "machinefolder") == 0)
     {
         /* reset to default? */
-        if (strcmp(argv[1], "default") == 0)
+        if (strcmp(a->argv[1], "default") == 0)
             CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(NULL));
         else
-            CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(Bstr(argv[1])));
-    }
-    else if (strcmp(argv[0], "vrdpauthlibrary") == 0)
+            CHECK_ERROR(systemProperties, COMSETTER(DefaultMachineFolder)(Bstr(a->argv[1])));
+    }
+    else if (strcmp(a->argv[0], "vrdpauthlibrary") == 0)
     {
         /* reset to default? */
-        if (strcmp(argv[1], "default") == 0)
+        if (strcmp(a->argv[1], "default") == 0)
             CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(NULL));
         else
-            CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(Bstr(argv[1])));
-    }
-    else if (strcmp(argv[0], "websrvauthlibrary") == 0)
+            CHECK_ERROR(systemProperties, COMSETTER(RemoteDisplayAuthLibrary)(Bstr(a->argv[1])));
+    }
+    else if (strcmp(a->argv[0], "websrvauthlibrary") == 0)
     {
         /* reset to default? */
-        if (strcmp(argv[1], "default") == 0)
+        if (strcmp(a->argv[1], "default") == 0)
             CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(NULL));
         else
-            CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(Bstr(argv[1])));
-    }
-    else if (strcmp(argv[0], "hwvirtexenabled") == 0)
-    {
-        if (strcmp(argv[1], "yes") == 0)
+            CHECK_ERROR(systemProperties, COMSETTER(WebServiceAuthLibrary)(Bstr(a->argv[1])));
+    }
+    else if (strcmp(a->argv[0], "hwvirtexenabled") == 0)
+    {
+        if (strcmp(a->argv[1], "yes") == 0)
             CHECK_ERROR(systemProperties, COMSETTER(HWVirtExEnabled)(TRUE));
-        else if (strcmp(argv[1], "no") == 0)
+        else if (strcmp(a->argv[1], "no") == 0)
             CHECK_ERROR(systemProperties, COMSETTER(HWVirtExEnabled)(FALSE));
         else
-            return errorArgument("Invalid value '%s' for hardware virtualization extension flag", argv[1]);
-    }
-    else if (strcmp(argv[0], "loghistorycount") == 0)
+            return errorArgument("Invalid value '%s' for hardware virtualization extension flag", a->argv[1]);
+    }
+    else if (strcmp(a->argv[0], "loghistorycount") == 0)
     {
         uint32_t uVal;
         int vrc;
-        vrc = RTStrToUInt32Ex(argv[1], NULL, 0, &uVal);
+        vrc = RTStrToUInt32Ex(a->argv[1], NULL, 0, &uVal);
         if (vrc != VINF_SUCCESS)
-            return errorArgument("Error parsing Log history count '%s'", argv[1]);
+            return errorArgument("Error parsing Log history count '%s'", a->argv[1]);
         CHECK_ERROR(systemProperties, COMSETTER(LogHistoryCount)(uVal));
     }
     else
-        return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", argv[0]);
+        return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", a->argv[0]);
 
     return SUCCEEDED(rc) ? 0 : 1;
 }
 
-static int handleUSBFilter (int argc, char *argv[],
-                            ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+static int handleUSBFilter (HandlerArg *a)
 {
     HRESULT rc = S_OK;
@@ -3792,19 +3774,19 @@
 
     /* at least: 0: command, 1: index, 2: -target, 3: <target value> */
-    if (argc < 4)
+    if (a->argc < 4)
         return errorSyntax(USAGE_USBFILTER, "Not enough parameters");
 
     /* which command? */
     cmd.mAction = USBFilterCmd::Invalid;
-    if      (strcmp (argv [0], "add") == 0)     cmd.mAction = USBFilterCmd::Add;
-    else if (strcmp (argv [0], "modify") == 0)  cmd.mAction = USBFilterCmd::Modify;
-    else if (strcmp (argv [0], "remove") == 0)  cmd.mAction = USBFilterCmd::Remove;
+    if      (strcmp (a->argv [0], "add") == 0)     cmd.mAction = USBFilterCmd::Add;
+    else if (strcmp (a->argv [0], "modify") == 0)  cmd.mAction = USBFilterCmd::Modify;
+    else if (strcmp (a->argv [0], "remove") == 0)  cmd.mAction = USBFilterCmd::Remove;
 
     if (cmd.mAction == USBFilterCmd::Invalid)
-        return errorSyntax(USAGE_USBFILTER, "Invalid parameter '%s'", argv[0]);
+        return errorSyntax(USAGE_USBFILTER, "Invalid parameter '%s'", a->argv[0]);
 
     /* which index? */
-    if (VINF_SUCCESS !=  RTStrToUInt32Full (argv[1], 10, &cmd.mIndex))
-        return errorSyntax(USAGE_USBFILTER, "Invalid index '%s'", argv[1]);
+    if (VINF_SUCCESS !=  RTStrToUInt32Full (a->argv[1], 10, &cmd.mIndex))
+        return errorSyntax(USAGE_USBFILTER, "Invalid index '%s'", a->argv[1]);
 
     switch (cmd.mAction)
@@ -3814,5 +3796,5 @@
         {
             /* at least: 0: command, 1: index, 2: -target, 3: <target value>, 4: -name, 5: <name value> */
-            if (argc < 6)
+            if (a->argc < 6)
             {
                 if (cmd.mAction == USBFilterCmd::Add)
@@ -3828,118 +3810,118 @@
                 cmd.mFilter.mActive = true;
 
-            for (int i = 2; i < argc; i++)
-            {
-                if  (strcmp(argv [i], "-target") == 0)
-                {
-                    if (argc <= i + 1 || !*argv[i+1])
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+            for (int i = 2; i < a->argc; i++)
+            {
+                if  (strcmp(a->argv [i], "-target") == 0)
+                {
+                    if (a->argc <= i + 1 || !*a->argv[i+1])
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    if (strcmp (argv [i], "global") == 0)
+                    if (strcmp (a->argv [i], "global") == 0)
                         cmd.mGlobal = true;
                     else
                     {
                         /* assume it's a UUID of a machine */
-                        rc = aVirtualBox->GetMachine(Guid(argv[i]), cmd.mMachine.asOutParam());
+                        rc = a->virtualBox->GetMachine(Guid(a->argv[i]), cmd.mMachine.asOutParam());
                         if (FAILED(rc) || !cmd.mMachine)
                         {
                             /* must be a name */
-                            CHECK_ERROR_RET(aVirtualBox, FindMachine(Bstr(argv[i]), cmd.mMachine.asOutParam()), 1);
+                            CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[i]), cmd.mMachine.asOutParam()), 1);
                         }
                     }
                 }
-                else if (strcmp(argv [i], "-name") == 0)
-                {
-                    if (argc <= i + 1 || !*argv[i+1])
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                else if (strcmp(a->argv [i], "-name") == 0)
+                {
+                    if (a->argc <= i + 1 || !*a->argv[i+1])
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mName = argv [i];
-                }
-                else if (strcmp(argv [i], "-active") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mName = a->argv [i];
+                }
+                else if (strcmp(a->argv [i], "-active") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    if (strcmp (argv [i], "yes") == 0)
+                    if (strcmp (a->argv [i], "yes") == 0)
                         cmd.mFilter.mActive = true;
-                    else if (strcmp (argv [i], "no") == 0)
+                    else if (strcmp (a->argv [i], "no") == 0)
                         cmd.mFilter.mActive = false;
                     else
-                        return errorArgument("Invalid -active argument '%s'", argv[i]);
-                }
-                else if (strcmp(argv [i], "-vendorid") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                        return errorArgument("Invalid -active argument '%s'", a->argv[i]);
+                }
+                else if (strcmp(a->argv [i], "-vendorid") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mVendorId = argv [i];
-                }
-                else if (strcmp(argv [i], "-productid") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mVendorId = a->argv [i];
+                }
+                else if (strcmp(a->argv [i], "-productid") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mProductId = argv [i];
-                }
-                else if (strcmp(argv [i], "-revision") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mProductId = a->argv [i];
+                }
+                else if (strcmp(a->argv [i], "-revision") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mRevision = argv [i];
-                }
-                else if (strcmp(argv [i], "-manufacturer") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mRevision = a->argv [i];
+                }
+                else if (strcmp(a->argv [i], "-manufacturer") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mManufacturer = argv [i];
-                }
-                else if (strcmp(argv [i], "-product") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mManufacturer = a->argv [i];
+                }
+                else if (strcmp(a->argv [i], "-product") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mProduct = argv [i];
-                }
-                else if (strcmp(argv [i], "-remote") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mProduct = a->argv [i];
+                }
+                else if (strcmp(a->argv [i], "-remote") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mRemote = argv[i];
-                }
-                else if (strcmp(argv [i], "-serialnumber") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mRemote = a->argv[i];
+                }
+                else if (strcmp(a->argv [i], "-serialnumber") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    cmd.mFilter.mSerialNumber = argv [i];
-                }
-                else if (strcmp(argv [i], "-maskedinterfaces") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                    cmd.mFilter.mSerialNumber = a->argv [i];
+                }
+                else if (strcmp(a->argv [i], "-maskedinterfaces") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
                     uint32_t u32;
-                    rc = RTStrToUInt32Full(argv[i], 0, &u32);
+                    rc = RTStrToUInt32Full(a->argv[i], 0, &u32);
                     if (RT_FAILURE(rc))
-                        return errorArgument("Failed to convert the -maskedinterfaces value '%s' to a number, rc=%Rrc", argv[i], rc);
+                        return errorArgument("Failed to convert the -maskedinterfaces value '%s' to a number, rc=%Rrc", a->argv[i], rc);
                     cmd.mFilter.mMaskedInterfaces = u32;
                 }
-                else if (strcmp(argv [i], "-action") == 0)
-                {
-                    if (argc <= i + 1)
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+                else if (strcmp(a->argv [i], "-action") == 0)
+                {
+                    if (a->argc <= i + 1)
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    if (strcmp (argv [i], "ignore") == 0)
+                    if (strcmp (a->argv [i], "ignore") == 0)
                         cmd.mFilter.mAction = USBDeviceFilterAction_Ignore;
-                    else if (strcmp (argv [i], "hold") == 0)
+                    else if (strcmp (a->argv [i], "hold") == 0)
                         cmd.mFilter.mAction = USBDeviceFilterAction_Hold;
                     else
-                        return errorArgument("Invalid USB filter action '%s'", argv[i]);
+                        return errorArgument("Invalid USB filter action '%s'", a->argv[i]);
                 }
                 else
                     return errorSyntax(cmd.mAction == USBFilterCmd::Add ? USAGE_USBFILTER_ADD : USAGE_USBFILTER_MODIFY,
-                                       "Unknown option '%s'", argv[i]);
+                                       "Unknown option '%s'", a->argv[i]);
             }
 
@@ -3967,24 +3949,24 @@
         {
             /* at least: 0: command, 1: index, 2: -target, 3: <target value> */
-            if (argc < 4)
+            if (a->argc < 4)
                 return errorSyntax(USAGE_USBFILTER_REMOVE, "Not enough parameters");
 
-            for (int i = 2; i < argc; i++)
-            {
-                if  (strcmp(argv [i], "-target") == 0)
-                {
-                    if (argc <= i + 1 || !*argv[i+1])
-                        return errorArgument("Missing argument to '%s'", argv[i]);
+            for (int i = 2; i < a->argc; i++)
+            {
+                if  (strcmp(a->argv [i], "-target") == 0)
+                {
+                    if (a->argc <= i + 1 || !*a->argv[i+1])
+                        return errorArgument("Missing argument to '%s'", a->argv[i]);
                     i++;
-                    if (strcmp (argv [i], "global") == 0)
+                    if (strcmp (a->argv [i], "global") == 0)
                         cmd.mGlobal = true;
                     else
                     {
                         /* assume it's a UUID of a machine */
-                        rc = aVirtualBox->GetMachine(Guid(argv[i]), cmd.mMachine.asOutParam());
+                        rc = a->virtualBox->GetMachine(Guid(a->argv[i]), cmd.mMachine.asOutParam());
                         if (FAILED(rc) || !cmd.mMachine)
                         {
                             /* must be a name */
-                            CHECK_ERROR_RET(aVirtualBox, FindMachine(Bstr(argv[i]), cmd.mMachine.asOutParam()), 1);
+                            CHECK_ERROR_RET(a->virtualBox, FindMachine(Bstr(a->argv[i]), cmd.mMachine.asOutParam()), 1);
                         }
                     }
@@ -4007,5 +3989,5 @@
     ComPtr <IUSBController> ctl;
     if (cmd.mGlobal)
-        CHECK_ERROR_RET (aVirtualBox, COMGETTER(Host) (host.asOutParam()), 1);
+        CHECK_ERROR_RET (a->virtualBox, COMGETTER(Host) (host.asOutParam()), 1);
     else
     {
@@ -4013,7 +3995,7 @@
         cmd.mMachine->COMGETTER(Id)(uuid.asOutParam());
         /* open a session for the VM */
-        CHECK_ERROR_RET (aVirtualBox, OpenSession(aSession, uuid), 1);
+        CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
         /* get the mutable session machine */
-        aSession->COMGETTER(Machine)(cmd.mMachine.asOutParam());
+        a->session->COMGETTER(Machine)(cmd.mMachine.asOutParam());
         /* and get the USB controller */
         CHECK_ERROR_RET (cmd.mMachine, COMGETTER(USBController) (ctl.asOutParam()), 1);
@@ -4155,5 +4137,5 @@
         /* commit and close the session */
         CHECK_ERROR(cmd.mMachine, SaveSettings());
-        aSession->Close();
+        a->session->Close();
     }
 
@@ -4161,20 +4143,19 @@
 }
 
-static int handleSharedFolder (int argc, char *argv[],
-                               ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+static int handleSharedFolder (HandlerArg *a)
 {
     HRESULT rc;
 
     /* we need at least a command and target */
-    if (argc < 2)
+    if (a->argc < 2)
         return errorSyntax(USAGE_SHAREDFOLDER, "Not enough parameters");
 
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = aVirtualBox->GetMachine(Guid(argv[1]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[1]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[1]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[1]), machine.asOutParam()));
     }
     if (!machine)
@@ -4183,8 +4164,8 @@
     machine->COMGETTER(Id)(uuid.asOutParam());
 
-    if (strcmp(argv[0], "add") == 0)
+    if (strcmp(a->argv[0], "add") == 0)
     {
         /* we need at least four more parameters */
-        if (argc < 5)
+        if (a->argc < 5)
             return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Not enough parameters");
 
@@ -4194,30 +4175,30 @@
         bool fWritable = true;
 
-        for (int i = 2; i < argc; i++)
-        {
-            if (strcmp(argv[i], "-name") == 0)
-            {
-                if (argc <= i + 1 || !*argv[i+1])
-                    return errorArgument("Missing argument to '%s'", argv[i]);
+        for (int i = 2; i < a->argc; i++)
+        {
+            if (strcmp(a->argv[i], "-name") == 0)
+            {
+                if (a->argc <= i + 1 || !*a->argv[i+1])
+                    return errorArgument("Missing argument to '%s'", a->argv[i]);
                 i++;
-                name = argv[i];
-            }
-            else if (strcmp(argv[i], "-hostpath") == 0)
-            {
-                if (argc <= i + 1 || !*argv[i+1])
-                    return errorArgument("Missing argument to '%s'", argv[i]);
+                name = a->argv[i];
+            }
+            else if (strcmp(a->argv[i], "-hostpath") == 0)
+            {
+                if (a->argc <= i + 1 || !*a->argv[i+1])
+                    return errorArgument("Missing argument to '%s'", a->argv[i]);
                 i++;
-                hostpath = argv[i];
-            }
-            else if (strcmp(argv[i], "-readonly") == 0)
+                hostpath = a->argv[i];
+            }
+            else if (strcmp(a->argv[i], "-readonly") == 0)
             {
                 fWritable = false;
             }
-            else if (strcmp(argv[i], "-transient") == 0)
+            else if (strcmp(a->argv[i], "-transient") == 0)
             {
                 fTransient = true;
             }
             else
-                return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+                return errorSyntax(USAGE_SHAREDFOLDER_ADD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
         }
 
@@ -4236,22 +4217,22 @@
 
             /* open an existing session for the VM */
-            CHECK_ERROR_RET(aVirtualBox, OpenExistingSession (aSession, uuid), 1);
+            CHECK_ERROR_RET(a->virtualBox, OpenExistingSession (a->session, uuid), 1);
             /* get the session machine */
-            CHECK_ERROR_RET(aSession, COMGETTER(Machine)(machine.asOutParam()), 1);
+            CHECK_ERROR_RET(a->session, COMGETTER(Machine)(machine.asOutParam()), 1);
             /* get the session console */
-            CHECK_ERROR_RET(aSession, COMGETTER(Console)(console.asOutParam()), 1);
+            CHECK_ERROR_RET(a->session, COMGETTER(Console)(console.asOutParam()), 1);
 
             CHECK_ERROR(console, CreateSharedFolder(Bstr(name), Bstr(hostpath), fWritable));
 
             if (console)
-                aSession->Close();
+                a->session->Close();
         }
         else
         {
             /* open a session for the VM */
-            CHECK_ERROR_RET (aVirtualBox, OpenSession(aSession, uuid), 1);
+            CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
 
             /* get the mutable session machine */
-            aSession->COMGETTER(Machine)(machine.asOutParam());
+            a->session->COMGETTER(Machine)(machine.asOutParam());
 
             CHECK_ERROR(machine, CreateSharedFolder(Bstr(name), Bstr(hostpath), fWritable));
@@ -4260,11 +4241,11 @@
                 CHECK_ERROR(machine, SaveSettings());
 
-            aSession->Close();
-        }
-    }
-    else if (strcmp(argv[0], "remove") == 0)
+            a->session->Close();
+        }
+    }
+    else if (strcmp(a->argv[0], "remove") == 0)
     {
         /* we need at least two more parameters */
-        if (argc < 3)
+        if (a->argc < 3)
             return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Not enough parameters");
 
@@ -4272,19 +4253,19 @@
         bool fTransient = false;
 
-        for (int i = 2; i < argc; i++)
-        {
-            if (strcmp(argv[i], "-name") == 0)
-            {
-                if (argc <= i + 1 || !*argv[i+1])
-                    return errorArgument("Missing argument to '%s'", argv[i]);
+        for (int i = 2; i < a->argc; i++)
+        {
+            if (strcmp(a->argv[i], "-name") == 0)
+            {
+                if (a->argc <= i + 1 || !*a->argv[i+1])
+                    return errorArgument("Missing argument to '%s'", a->argv[i]);
                 i++;
-                name = argv[i];
-            }
-            else if (strcmp(argv[i], "-transient") == 0)
+                name = a->argv[i];
+            }
+            else if (strcmp(a->argv[i], "-transient") == 0)
             {
                 fTransient = true;
             }
             else
-                return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+                return errorSyntax(USAGE_SHAREDFOLDER_REMOVE, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
         }
 
@@ -4298,22 +4279,22 @@
 
             /* open an existing session for the VM */
-            CHECK_ERROR_RET(aVirtualBox, OpenExistingSession (aSession, uuid), 1);
+            CHECK_ERROR_RET(a->virtualBox, OpenExistingSession (a->session, uuid), 1);
             /* get the session machine */
-            CHECK_ERROR_RET(aSession, COMGETTER(Machine)(machine.asOutParam()), 1);
+            CHECK_ERROR_RET(a->session, COMGETTER(Machine)(machine.asOutParam()), 1);
             /* get the session console */
-            CHECK_ERROR_RET(aSession, COMGETTER(Console)(console.asOutParam()), 1);
+            CHECK_ERROR_RET(a->session, COMGETTER(Console)(console.asOutParam()), 1);
 
             CHECK_ERROR(console, RemoveSharedFolder(Bstr(name)));
 
             if (console)
-                aSession->Close();
+                a->session->Close();
         }
         else
         {
             /* open a session for the VM */
-            CHECK_ERROR_RET (aVirtualBox, OpenSession(aSession, uuid), 1);
+            CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, uuid), 1);
 
             /* get the mutable session machine */
-            aSession->COMGETTER(Machine)(machine.asOutParam());
+            a->session->COMGETTER(Machine)(machine.asOutParam());
 
             CHECK_ERROR(machine, RemoveSharedFolder(Bstr(name)));
@@ -4321,30 +4302,29 @@
             /* commit and close the session */
             CHECK_ERROR(machine, SaveSettings());
-            aSession->Close();
+            a->session->Close();
         }
     }
     else
-        return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", Utf8Str(argv[0]).raw());
+        return errorSyntax(USAGE_SETPROPERTY, "Invalid parameter '%s'", Utf8Str(a->argv[0]).raw());
 
     return 0;
 }
 
-static int handleVMStatistics(int argc, char *argv[],
-                              ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+static int handleVMStatistics(HandlerArg *a)
 {
     HRESULT rc;
 
     /* at least one option: the UUID or name of the VM */
-    if (argc < 1)
+    if (a->argc < 1)
         return errorSyntax(USAGE_VM_STATISTICS, "Incorrect number of parameters");
 
     /* try to find the given machine */
     ComPtr <IMachine> machine;
-    Guid uuid (argv[0]);
+    Guid uuid (a->argv[0]);
     if (!uuid.isEmpty())
-        CHECK_ERROR(aVirtualBox, GetMachine(uuid, machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, GetMachine(uuid, machine.asOutParam()));
     else
     {
-        CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
         if (SUCCEEDED (rc))
             machine->COMGETTER(Id)(uuid.asOutParam());
@@ -4357,21 +4337,21 @@
     bool fWithDescriptions = false;
     const char *pszPattern = NULL; /* all */
-    for (int i = 1; i < argc; i++)
-    {
-        if (!strcmp(argv[i], "-pattern"))
+    for (int i = 1; i < a->argc; i++)
+    {
+        if (!strcmp(a->argv[i], "-pattern"))
         {
             if (pszPattern)
                 return errorSyntax(USAGE_VM_STATISTICS, "Multiple -patterns options is not permitted");
-            if (i + 1 >= argc)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            pszPattern = argv[++i];
-        }
-        else if (!strcmp(argv[i], "-descriptions"))
+            if (i + 1 >= a->argc)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            pszPattern = a->argv[++i];
+        }
+        else if (!strcmp(a->argv[i], "-descriptions"))
             fWithDescriptions = true;
         /* add: -file <filename> and -formatted */
-        else if (!strcmp(argv[i], "-reset"))
+        else if (!strcmp(a->argv[i], "-reset"))
             fReset = true;
         else
-            return errorSyntax(USAGE_VM_STATISTICS, "Unknown option '%s'", argv[i]);
+            return errorSyntax(USAGE_VM_STATISTICS, "Unknown option '%s'", a->argv[i]);
     }
     if (fReset && fWithDescriptions)
@@ -4380,10 +4360,10 @@
 
     /* open an existing session for the VM. */
-    CHECK_ERROR(aVirtualBox, OpenExistingSession(aSession, uuid));
+    CHECK_ERROR(a->virtualBox, OpenExistingSession(a->session, uuid));
     if (SUCCEEDED(rc))
     {
         /* get the session console. */
         ComPtr <IConsole> console;
-        CHECK_ERROR(aSession, COMGETTER(Console)(console.asOutParam()));
+        CHECK_ERROR(a->session, COMGETTER(Console)(console.asOutParam()));
         if (SUCCEEDED(rc))
         {
@@ -4409,5 +4389,5 @@
                 }
             }
-            aSession->Close();
+            a->session->Close();
         }
     }
@@ -4716,9 +4696,16 @@
 
 #ifdef USE_XPCOM_QUEUE
-    NS_GetMainEventQ(getter_AddRefs(g_pEventQ));
+    nsCOMPtr<nsIEventQueue> eventQ;
+    NS_GetMainEventQ(getter_AddRefs(eventQ));
 #endif
 
     if (!checkForAutoConvertedSettings (virtualBox, session, fConvertSettings))
         break;
+
+#ifdef USE_XPCOM_QUEUE
+    HandlerArg handlerArg = { 0, NULL, eventQ, virtualBox, session };
+#else
+    HandlerArg handlerArg = { 0, NULL, virtualBox, session };
+#endif
 
     /*
@@ -4774,5 +4761,7 @@
         if (strcmp(commandHandlers[commandIndex].command, argv[iCmd]) == 0)
         {
-            rc = commandHandlers[commandIndex].handler(argc - iCmdArg, &argv[iCmdArg], virtualBox, session);
+            handlerArg.argc = argc - iCmdArg;
+            handlerArg.argv = &argv[iCmdArg];
+            rc = commandHandlers[commandIndex].handler(&handlerArg);
             break;
         }
@@ -4791,5 +4780,5 @@
 
 #ifdef USE_XPCOM_QUEUE
-    g_pEventQ->ProcessPendingEvents();
+    eventQ->ProcessPendingEvents();
 #endif
 
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManage.h	(revision 16052)
@@ -90,13 +90,18 @@
 typedef uint64_t USAGECATEGORY;
 
+/** command handler argument */
+struct HandlerArg
+{
+    int argc;
+    char **argv;
+#ifdef USE_XPCOM_QUEUE
+    nsCOMPtr<nsIEventQueue> eventQ;
+#endif
+    ComPtr<IVirtualBox> virtualBox;
+    ComPtr<ISession> session;
+};
+
 /** flag whether we're in internal mode */
 extern bool g_fInternalMode;
-
-#ifndef VBOX_ONLY_DOCS
-# ifdef USE_XPCOM_QUEUE
-/** A pointer to the event queue, set by main() before calling any handlers. */
-extern nsCOMPtr<nsIEventQueue> g_pEventQ;
-# endif
-#endif /* !VBOX_ONLY_DOCS */
 
 /** showVMInfo details */
@@ -113,4 +118,5 @@
  * Prototypes
  */
+
 /* VBoxManage.cpp */
 int errorSyntax(USAGECATEGORY u64Cmd, const char *pszFormat, ...);
@@ -122,6 +128,5 @@
 void showProgress(ComPtr<IProgress> progress);
 
-int handleInternalCommands(int argc, char *argv[],
-                           ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
+int handleInternalCommands(HandlerArg *a);
 #endif /* !VBOX_ONLY_DOCS */
 
@@ -129,11 +134,9 @@
 extern void usageGuestProperty(void);
 #ifndef VBOX_ONLY_DOCS
-extern int handleGuestProperty(int argc, char *argv[],
-                               ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
+extern int handleGuestProperty(HandlerArg *a);
 
 /* VBoxManageVMInfo.cpp */
 void showSnapshots(ComPtr<ISnapshot> rootSnapshot, VMINFO_DETAILS details, const com::Bstr &prefix = "", int level = 0);
-int handleShowVMInfo(int argc, char *argv[],
-                     ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
+int handleShowVMInfo(HandlerArg *a);
 HRESULT showVMInfo(ComPtr <IVirtualBox> virtualBox, ComPtr<IMachine> machine,
                    ComPtr <IConsole> console = ComPtr <IConsole> (),
@@ -141,28 +144,18 @@
 
 /* VBoxManageList.cpp */
-int handleList(int argc, char *argv[],
-               ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
+int handleList(HandlerArg *a);
 
 /* VBoxManageMetrics.cpp */
-int handleMetrics(int argc, char *argv[],
-                  ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
+int handleMetrics(HandlerArg *a);
 
 /* VBoxManageDisk.cpp */
-int handleCreateHardDisk(int argc, char *argv[],
-                         ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
-int handleModifyHardDisk(int argc, char *argv[],
-                         ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
-int handleCloneHardDisk(int argc, char *argv[],
-                        ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
-int handleConvertHardDisk(int argc, char **argv);
+int handleCreateHardDisk(HandlerArg *a);
+int handleModifyHardDisk(HandlerArg *a);
+int handleCloneHardDisk(HandlerArg *a);
 int handleConvertFromRaw(int argc, char *argv[]);
-int handleAddiSCSIDisk(int argc, char *argv[],
-                       ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession);
-int handleShowHardDiskInfo(int argc, char *argv[],
-                           ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
-int handleOpenMedium(int argc, char *argv[],
-                     ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
-int handleCloseMedium(int argc, char *argv[],
-                      ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session);
+int handleAddiSCSIDisk(HandlerArg *a);
+int handleShowHardDiskInfo(HandlerArg *a);
+int handleOpenMedium(HandlerArg *a);
+int handleCloseMedium(HandlerArg *a);
 
 /* VBoxManageUSB.cpp */
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageDisk.cpp	(revision 16052)
@@ -54,6 +54,5 @@
 
 
-int handleCreateHardDisk(int argc, char *argv[],
-                         ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleCreateHardDisk(HandlerArg *a)
 {
     HRESULT rc;
@@ -67,51 +66,51 @@
 
     /* let's have a closer look at the arguments */
-    for (int i = 0; i < argc; i++)
-    {
-        if (strcmp(argv[i], "-filename") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            filename = argv[i];
-        }
-        else if (strcmp(argv[i], "-size") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            sizeMB = RTStrToUInt64(argv[i]);
-        }
-        else if (strcmp(argv[i], "-format") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            format = argv[i];
-        }
-        else if (strcmp(argv[i], "-static") == 0)
+    for (int i = 0; i < a->argc; i++)
+    {
+        if (strcmp(a->argv[i], "-filename") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            filename = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-size") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            sizeMB = RTStrToUInt64(a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-format") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            format = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-static") == 0)
         {
             fStatic = true;
         }
-        else if (strcmp(argv[i], "-comment") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            comment = argv[i];
-        }
-        else if (strcmp(argv[i], "-register") == 0)
+        else if (strcmp(a->argv[i], "-comment") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            comment = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-register") == 0)
         {
             fRegister = true;
         }
-        else if (strcmp(argv[i], "-type") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            type = argv[i];
+        else if (strcmp(a->argv[i], "-type") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            type = a->argv[i];
         }
         else
-            return errorSyntax(USAGE_CREATEHD, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+            return errorSyntax(USAGE_CREATEHD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
     }
     /* check the outcome */
@@ -123,5 +122,5 @@
 
     ComPtr<IHardDisk2> hardDisk;
-    CHECK_ERROR(virtualBox, CreateHardDisk2(format, filename, hardDisk.asOutParam()));
+    CHECK_ERROR(a->virtualBox, CreateHardDisk2(format, filename, hardDisk.asOutParam()));
     if (SUCCEEDED(rc) && hardDisk)
     {
@@ -207,11 +206,10 @@
 
 
-int handleModifyHardDisk(int argc, char *argv[],
-                         ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleModifyHardDisk(HandlerArg *a)
 {
     HRESULT rc;
 
     /* The uuid/filename and a command */
-    if (argc < 2)
+    if (a->argc < 2)
         return errorSyntax(USAGE_MODIFYHD, "Incorrect number of parameters");
 
@@ -220,15 +218,15 @@
 
     /* first guess is that it's a UUID */
-    Guid uuid(argv[0]);
-    rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
+    Guid uuid(a->argv[0]);
+    rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     /* no? then it must be a filename */
     if (!hardDisk)
     {
-        filepath = argv[0];
-        CHECK_ERROR(virtualBox, FindHardDisk2(filepath, hardDisk.asOutParam()));
+        filepath = a->argv[0];
+        CHECK_ERROR(a->virtualBox, FindHardDisk2(filepath, hardDisk.asOutParam()));
     }
 
     /* let's find out which command */
-    if (strcmp(argv[1], "settype") == 0)
+    if (strcmp(a->argv[1], "settype") == 0)
     {
         /* hard disk must be registered */
@@ -237,8 +235,8 @@
             char *type = NULL;
 
-            if (argc <= 2)
+            if (a->argc <= 2)
                 return errorArgument("Missing argument to for settype");
 
-            type = argv[2];
+            type = a->argv[2];
 
             HardDiskType_T hddType;
@@ -269,5 +267,5 @@
             return errorArgument("Hard disk image not registered");
     }
-    else if (strcmp(argv[1], "compact") == 0)
+    else if (strcmp(a->argv[1], "compact") == 0)
     {
 #if 1
@@ -278,5 +276,5 @@
         if (!hardDisk)
         {
-            virtualBox->OpenHardDisk2(Bstr(argv[0]), hardDisk.asOutParam());
+            a->virtualBox->OpenHardDisk2(Bstr(a->argv[0]), hardDisk.asOutParam());
             if (!hardDisk)
                 return errorArgument("Hard disk image not found");
@@ -306,11 +304,10 @@
     }
     else
-        return errorSyntax(USAGE_MODIFYHD, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
+        return errorSyntax(USAGE_MODIFYHD, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
 
     return SUCCEEDED(rc) ? 0 : 1;
 }
 
-int handleCloneHardDisk(int argc, char *argv[],
-                        ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleCloneHardDisk(HandlerArg *a)
 {
     Bstr src, dst;
@@ -321,17 +318,17 @@
 
     /* Parse the arguments. */
-    for (int i = 0; i < argc; i++)
-    {
-        if (strcmp(argv[i], "-format") == 0)
-        {
-            if (argc <= i + 1)
-            {
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            }
-            i++;
-            format = argv[i];
-        }
-        else if (strcmp(argv[i], "-remember") == 0 ||
-                 strcmp(argv[i], "-register") == 0 /* backward compatiblity */)
+    for (int i = 0; i < a->argc; i++)
+    {
+        if (strcmp(a->argv[i], "-format") == 0)
+        {
+            if (a->argc <= i + 1)
+            {
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            }
+            i++;
+            format = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-remember") == 0 ||
+                 strcmp(a->argv[i], "-register") == 0 /* backward compatiblity */)
         {
             remember = true;
@@ -339,13 +336,13 @@
         else if (src.isEmpty())
         {
-            src = argv[i];
+            src = a->argv[i];
         }
         else if (dst.isEmpty())
         {
-            dst = argv[i];
+            dst = a->argv[i];
         }
         else
         {
-            return errorSyntax(USAGE_CLONEHD, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+            return errorSyntax(USAGE_CLONEHD, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
         }
     }
@@ -362,13 +359,13 @@
     /* first guess is that it's a UUID */
     Guid uuid(Utf8Str(src).raw());
-    rc = virtualBox->GetHardDisk2(uuid, srcDisk.asOutParam());
+    rc = a->virtualBox->GetHardDisk2(uuid, srcDisk.asOutParam());
     /* no? then it must be a filename */
     if (FAILED (rc))
     {
-        rc = virtualBox->FindHardDisk2(src, srcDisk.asOutParam());
+        rc = a->virtualBox->FindHardDisk2(src, srcDisk.asOutParam());
         /* no? well, then it's an unkwnown image */
         if (FAILED (rc))
         {
-            CHECK_ERROR(virtualBox, OpenHardDisk2(src, srcDisk.asOutParam()));
+            CHECK_ERROR(a->virtualBox, OpenHardDisk2(src, srcDisk.asOutParam()));
             if (SUCCEEDED (rc))
             {
@@ -389,5 +386,5 @@
         }
 
-        CHECK_ERROR_BREAK(virtualBox, CreateHardDisk2(format, dst, dstDisk.asOutParam()));
+        CHECK_ERROR_BREAK(a->virtualBox, CreateHardDisk2(format, dst, dstDisk.asOutParam()));
 
         ComPtr<IProgress> progress;
@@ -591,6 +588,5 @@
 }
 
-int handleAddiSCSIDisk(int argc, char *argv[],
-                       ComPtr <IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+int handleAddiSCSIDisk(HandlerArg *a)
 {
     HRESULT rc;
@@ -605,67 +601,67 @@
 
     /* at least server and target */
-    if (argc < 4)
+    if (a->argc < 4)
         return errorSyntax(USAGE_ADDISCSIDISK, "Not enough parameters");
 
     /* let's have a closer look at the arguments */
-    for (int i = 0; i < argc; i++)
-    {
-        if (strcmp(argv[i], "-server") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            server = argv[i];
-        }
-        else if (strcmp(argv[i], "-target") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            target = argv[i];
-        }
-        else if (strcmp(argv[i], "-port") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            port = argv[i];
-        }
-        else if (strcmp(argv[i], "-lun") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            lun = argv[i];
-        }
-        else if (strcmp(argv[i], "-encodedlun") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            lun = BstrFmt("enc%s", argv[i]);
-        }
-        else if (strcmp(argv[i], "-username") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            username = argv[i];
-        }
-        else if (strcmp(argv[i], "-password") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            password = argv[i];
-        }
-        else if (strcmp(argv[i], "-comment") == 0)
-        {
-            if (argc <= i + 1)
-                return errorArgument("Missing argument to '%s'", argv[i]);
-            i++;
-            comment = argv[i];
-        }
-        else if (strcmp(argv[i], "-intnet") == 0)
+    for (int i = 0; i < a->argc; i++)
+    {
+        if (strcmp(a->argv[i], "-server") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            server = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-target") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            target = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-port") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            port = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-lun") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            lun = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-encodedlun") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            lun = BstrFmt("enc%s", a->argv[i]);
+        }
+        else if (strcmp(a->argv[i], "-username") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            username = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-password") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            password = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-comment") == 0)
+        {
+            if (a->argc <= i + 1)
+                return errorArgument("Missing argument to '%s'", a->argv[i]);
+            i++;
+            comment = a->argv[i];
+        }
+        else if (strcmp(a->argv[i], "-intnet") == 0)
         {
             i++;
@@ -673,5 +669,5 @@
         }
         else
-            return errorSyntax(USAGE_ADDISCSIDISK, "Invalid parameter '%s'", Utf8Str(argv[i]).raw());
+            return errorSyntax(USAGE_ADDISCSIDISK, "Invalid parameter '%s'", Utf8Str(a->argv[i]).raw());
     }
 
@@ -683,5 +679,5 @@
     {
         ComPtr<IHardDisk2> hardDisk;
-        CHECK_ERROR_BREAK (aVirtualBox,
+        CHECK_ERROR_BREAK (a->virtualBox,
             CreateHardDisk2(Bstr ("iSCSI"),
                             BstrFmt ("%ls/%ls", server.raw(), target.raw()),
@@ -745,10 +741,9 @@
 
 
-int handleShowHardDiskInfo(int argc, char *argv[],
-                           ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleShowHardDiskInfo(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc != 1)
+    if (a->argc != 1)
         return errorSyntax(USAGE_SHOWHDINFO, "Incorrect number of parameters");
 
@@ -759,15 +754,15 @@
 
     /* first guess is that it's a UUID */
-    Guid uuid(argv[0]);
-    rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
+    Guid uuid(a->argv[0]);
+    rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
     /* no? then it must be a filename */
     if (FAILED (rc))
     {
-        filepath = argv[0];
-        rc = virtualBox->FindHardDisk2(filepath, hardDisk.asOutParam());
+        filepath = a->argv[0];
+        rc = a->virtualBox->FindHardDisk2(filepath, hardDisk.asOutParam());
         /* no? well, then it's an unkwnown image */
         if (FAILED (rc))
         {
-            CHECK_ERROR(virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
+            CHECK_ERROR(a->virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
             if (SUCCEEDED (rc))
             {
@@ -840,5 +835,5 @@
             {
                 ComPtr<IMachine> machine;
-                CHECK_ERROR(virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
+                CHECK_ERROR(a->virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
                 ASSERT(machine);
                 Bstr name;
@@ -869,33 +864,32 @@
 }
 
-int handleOpenMedium(int argc, char *argv[],
-                     ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleOpenMedium(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc < 2)
+    if (a->argc < 2)
         return errorSyntax(USAGE_REGISTERIMAGE, "Not enough parameters");
 
-    Bstr filepath(argv[1]);
-
-    if (strcmp(argv[0], "disk") == 0)
+    Bstr filepath(a->argv[1]);
+
+    if (strcmp(a->argv[0], "disk") == 0)
     {
         const char *type = NULL;
         /* there can be a type parameter */
-        if ((argc > 2) && (argc != 4))
+        if ((a->argc > 2) && (a->argc != 4))
             return errorSyntax(USAGE_REGISTERIMAGE, "Incorrect number of parameters");
-        if (argc == 4)
-        {
-            if (strcmp(argv[2], "-type") != 0)
-                return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(argv[2]).raw());
-            if (   (strcmp(argv[3], "normal") != 0)
-                && (strcmp(argv[3], "immutable") != 0)
-                && (strcmp(argv[3], "writethrough") != 0))
-                return errorArgument("Invalid hard disk type '%s' specified", Utf8Str(argv[3]).raw());
-            type = argv[3];
+        if (a->argc == 4)
+        {
+            if (strcmp(a->argv[2], "-type") != 0)
+                return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(a->argv[2]).raw());
+            if (   (strcmp(a->argv[3], "normal") != 0)
+                && (strcmp(a->argv[3], "immutable") != 0)
+                && (strcmp(a->argv[3], "writethrough") != 0))
+                return errorArgument("Invalid hard disk type '%s' specified", Utf8Str(a->argv[3]).raw());
+            type = a->argv[3];
         }
 
         ComPtr<IHardDisk2> hardDisk;
-        CHECK_ERROR(virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
+        CHECK_ERROR(a->virtualBox, OpenHardDisk2(filepath, hardDisk.asOutParam()));
         if (SUCCEEDED(rc) && hardDisk)
         {
@@ -912,39 +906,38 @@
         }
     }
-    else if (strcmp(argv[0], "dvd") == 0)
+    else if (strcmp(a->argv[0], "dvd") == 0)
     {
         ComPtr<IDVDImage2> dvdImage;
-        CHECK_ERROR(virtualBox, OpenDVDImage(filepath, Guid(), dvdImage.asOutParam()));
-    }
-    else if (strcmp(argv[0], "floppy") == 0)
+        CHECK_ERROR(a->virtualBox, OpenDVDImage(filepath, Guid(), dvdImage.asOutParam()));
+    }
+    else if (strcmp(a->argv[0], "floppy") == 0)
     {
         ComPtr<IFloppyImage2> floppyImage;
-        CHECK_ERROR(virtualBox, OpenFloppyImage(filepath, Guid(), floppyImage.asOutParam()));
+        CHECK_ERROR(a->virtualBox, OpenFloppyImage(filepath, Guid(), floppyImage.asOutParam()));
     }
     else
-        return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
+        return errorSyntax(USAGE_REGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
 
     return SUCCEEDED(rc) ? 0 : 1;
 }
 
-int handleCloseMedium(int argc, char *argv[],
-                      ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleCloseMedium(HandlerArg *a)
 {
     HRESULT rc;
 
-    if (argc != 2)
+    if (a->argc != 2)
         return errorSyntax(USAGE_UNREGISTERIMAGE, "Incorrect number of parameters");
 
     /* first guess is that it's a UUID */
-    Guid uuid(argv[1]);
-
-    if (strcmp(argv[0], "disk") == 0)
+    Guid uuid(a->argv[1]);
+
+    if (strcmp(a->argv[0], "disk") == 0)
     {
         ComPtr<IHardDisk2> hardDisk;
-        rc = virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
+        rc = a->virtualBox->GetHardDisk2(uuid, hardDisk.asOutParam());
         /* not a UUID or not registered? Then it must be a filename */
         if (!hardDisk)
         {
-            CHECK_ERROR(virtualBox, FindHardDisk2(Bstr(argv[1]), hardDisk.asOutParam()));
+            CHECK_ERROR(a->virtualBox, FindHardDisk2(Bstr(a->argv[1]), hardDisk.asOutParam()));
         }
         if (SUCCEEDED(rc) && hardDisk)
@@ -954,12 +947,12 @@
     }
     else
-    if (strcmp(argv[0], "dvd") == 0)
+    if (strcmp(a->argv[0], "dvd") == 0)
     {
         ComPtr<IDVDImage2> dvdImage;
-        rc = virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
+        rc = a->virtualBox->GetDVDImage(uuid, dvdImage.asOutParam());
         /* not a UUID or not registered? Then it must be a filename */
         if (!dvdImage)
         {
-            CHECK_ERROR(virtualBox, FindDVDImage(Bstr(argv[1]), dvdImage.asOutParam()));
+            CHECK_ERROR(a->virtualBox, FindDVDImage(Bstr(a->argv[1]), dvdImage.asOutParam()));
         }
         if (SUCCEEDED(rc) && dvdImage)
@@ -969,12 +962,12 @@
     }
     else
-    if (strcmp(argv[0], "floppy") == 0)
+    if (strcmp(a->argv[0], "floppy") == 0)
     {
         ComPtr<IFloppyImage2> floppyImage;
-        rc = virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
+        rc = a->virtualBox->GetFloppyImage(uuid, floppyImage.asOutParam());
         /* not a UUID or not registered? Then it must be a filename */
         if (!floppyImage)
         {
-            CHECK_ERROR(virtualBox, FindFloppyImage(Bstr(argv[1]), floppyImage.asOutParam()));
+            CHECK_ERROR(a->virtualBox, FindFloppyImage(Bstr(a->argv[1]), floppyImage.asOutParam()));
         }
         if (SUCCEEDED(rc) && floppyImage)
@@ -984,5 +977,5 @@
     }
     else
-        return errorSyntax(USAGE_UNREGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(argv[1]).raw());
+        return errorSyntax(USAGE_UNREGISTERIMAGE, "Invalid parameter '%s'", Utf8Str(a->argv[1]).raw());
 
     return SUCCEEDED(rc) ? 0 : 1;
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestProp.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestProp.cpp	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestProp.cpp	(revision 16052)
@@ -214,23 +214,21 @@
 }
 
-static int handleGetGuestProperty(int argc, char *argv[],
-                                  ComPtr<IVirtualBox> aVirtualBox,
-                                  ComPtr<ISession> aSession)
+static int handleGetGuestProperty(HandlerArg *a)
 {
     HRESULT rc = S_OK;
 
     bool verbose = false;
-    if ((3 == argc) && (0 == strcmp(argv[2], "-verbose")))
+    if ((3 == a->argc) && (0 == strcmp(a->argv[2], "-verbose")))
         verbose = true;
-    else if (argc != 2)
+    else if (a->argc != 2)
         return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
 
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (machine)
@@ -240,14 +238,14 @@
 
         /* open a session for the VM - new or existing */
-        if (FAILED (aVirtualBox->OpenSession(aSession, uuid)))
-            CHECK_ERROR_RET (aVirtualBox, OpenExistingSession(aSession, uuid), 1);
+        if (FAILED (a->virtualBox->OpenSession(a->session, uuid)))
+            CHECK_ERROR_RET (a->virtualBox, OpenExistingSession(a->session, uuid), 1);
 
         /* get the mutable session machine */
-        aSession->COMGETTER(Machine)(machine.asOutParam());
+        a->session->COMGETTER(Machine)(machine.asOutParam());
 
         Bstr value;
         uint64_t u64Timestamp;
         Bstr flags;
-        CHECK_ERROR(machine, GetGuestProperty(Bstr(argv[1]), value.asOutParam(),
+        CHECK_ERROR(machine, GetGuestProperty(Bstr(a->argv[1]), value.asOutParam(),
                     &u64Timestamp, flags.asOutParam()));
         if (!value)
@@ -264,7 +262,5 @@
 }
 
-static int handleSetGuestProperty(int argc, char *argv[],
-                                  ComPtr<IVirtualBox> aVirtualBox,
-                                  ComPtr<ISession> aSession)
+static int handleSetGuestProperty(HandlerArg *a)
 {
     HRESULT rc = S_OK;
@@ -278,31 +274,31 @@
     const char *pszValue = NULL;
     const char *pszFlags = NULL;
-    if (3 == argc)
-    {
-        pszValue = argv[2];
-    }
-    else if (4 == argc)
+    if (3 == a->argc)
+    {
+        pszValue = a->argv[2];
+    }
+    else if (4 == a->argc)
         usageOK = false;
-    else if (5 == argc)
-    {
-        pszValue = argv[2];
-        if (strcmp(argv[3], "-flags") != 0)
+    else if (5 == a->argc)
+    {
+        pszValue = a->argv[2];
+        if (strcmp(a->argv[3], "-flags") != 0)
             usageOK = false;
-        pszFlags = argv[4];
-    }
-    else if (argc != 2)
+        pszFlags = a->argv[4];
+    }
+    else if (a->argc != 2)
         usageOK = false;
     if (!usageOK)
         return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
     /* This is always needed. */
-    pszName = argv[1];
+    pszName = a->argv[1];
 
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (machine)
@@ -312,9 +308,9 @@
 
         /* open a session for the VM - new or existing */
-        if (FAILED (aVirtualBox->OpenSession(aSession, uuid)))
-            CHECK_ERROR_RET (aVirtualBox, OpenExistingSession(aSession, uuid), 1);
+        if (FAILED (a->virtualBox->OpenSession(a->session, uuid)))
+            CHECK_ERROR_RET (a->virtualBox, OpenExistingSession(a->session, uuid), 1);
 
         /* get the mutable session machine */
-        aSession->COMGETTER(Machine)(machine.asOutParam());
+        a->session->COMGETTER(Machine)(machine.asOutParam());
 
         if ((NULL == pszValue) && (NULL == pszFlags))
@@ -328,5 +324,5 @@
             CHECK_ERROR(machine, SaveSettings());
 
-        aSession->Close();
+        a->session->Close();
     }
     return SUCCEEDED(rc) ? 0 : 1;
@@ -339,6 +335,5 @@
  * @note see the command line API description for parameters
  */
-static int handleEnumGuestProperty(int argc, char *argv[],
-                                   ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+static int handleEnumGuestProperty(HandlerArg *a)
 {
 /*
@@ -346,6 +341,6 @@
  * arguments.
  */
-    if ((argc < 1) || (2 == argc) ||
-        ((argc > 3) && strcmp(argv[1], "-patterns") != 0))
+    if ((a->argc < 1) || (2 == a->argc) ||
+        ((a->argc > 3) && strcmp(a->argv[1], "-patterns") != 0))
         return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
 
@@ -353,7 +348,7 @@
  * Pack the patterns
  */
-    Utf8Str Utf8Patterns(argc > 2 ? argv[2] : "*");
-    for (ssize_t i = 3; i < argc; ++i)
-        Utf8Patterns = Utf8StrFmt ("%s,%s", Utf8Patterns.raw(), argv[i]);
+    Utf8Str Utf8Patterns(a->argc > 2 ? a->argv[2] : "*");
+    for (ssize_t i = 3; i < a->argc; ++i)
+        Utf8Patterns = Utf8StrFmt ("%s,%s", Utf8Patterns.raw(), a->argv[i]);
 
 /*
@@ -362,9 +357,9 @@
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    HRESULT rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    HRESULT rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (machine)
@@ -374,9 +369,9 @@
 
         /* open a session for the VM - new or existing */
-        if (FAILED (aVirtualBox->OpenSession(aSession, uuid)))
-            CHECK_ERROR_RET (aVirtualBox, OpenExistingSession(aSession, uuid), 1);
+        if (FAILED (a->virtualBox->OpenSession(a->session, uuid)))
+            CHECK_ERROR_RET (a->virtualBox, OpenExistingSession(a->session, uuid), 1);
 
         /* get the mutable session machine */
-        aSession->COMGETTER(Machine)(machine.asOutParam());
+        a->session->COMGETTER(Machine)(machine.asOutParam());
 
         com::SafeArray <BSTR> names;
@@ -407,6 +402,5 @@
  * @note see the command line API description for parameters
  */
-static int handleWaitGuestProperty(int argc, char *argv[],
-                                   ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+static int handleWaitGuestProperty(HandlerArg *a)
 {
 
@@ -417,24 +411,24 @@
     uint32_t u32Timeout = RT_INDEFINITE_WAIT;
     bool usageOK = true;
-    if (argc < 2)
+    if (a->argc < 2)
         usageOK = false;
     else
-        pszPatterns = argv[1];
+        pszPatterns = a->argv[1];
     ComPtr<IMachine> machine;
     /* assume it's a UUID */
-    HRESULT rc = aVirtualBox->GetMachine(Guid(argv[0]), machine.asOutParam());
+    HRESULT rc = a->virtualBox->GetMachine(Guid(a->argv[0]), machine.asOutParam());
     if (FAILED(rc) || !machine)
     {
         /* must be a name */
-        CHECK_ERROR(aVirtualBox, FindMachine(Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()));
     }
     if (!machine)
         usageOK = false;
-    for (int i = 2; usageOK && i < argc; ++i)
-    {
-        if (strcmp(argv[i], "-timeout") == 0)
-        {
-            if (   i + 1 >= argc
-                || RTStrToUInt32Full(argv[i + 1], 10, &u32Timeout)
+    for (int i = 2; usageOK && i < a->argc; ++i)
+    {
+        if (strcmp(a->argv[i], "-timeout") == 0)
+        {
+            if (   i + 1 >= a->argc
+                || RTStrToUInt32Full(a->argv[i + 1], 10, &u32Timeout)
                        != VINF_SUCCESS
                )
@@ -456,8 +450,8 @@
     GuestPropertyCallback *callback = new GuestPropertyCallback(pszPatterns, uuid);
     callback->AddRef();
-    aVirtualBox->RegisterCallback (callback);
+    a->virtualBox->RegisterCallback (callback);
     bool stop = false;
 #ifdef USE_XPCOM_QUEUE
-    int max_fd = g_pEventQ->GetEventQueueSelectFD();
+    int max_fd = a->eventQ->GetEventQueueSelectFD();
 #endif
     for (; !stop && u32Timeout > 0; u32Timeout -= RT_MIN(u32Timeout, 1000))
@@ -483,5 +477,5 @@
             uint64_t u64NextTime = RTTimeSpecGetMilli(RTTimeNow(&TimeNow));
             u32Timeout += (uint32_t)(u64Time + 1000 - u64NextTime);
-            g_pEventQ->ProcessPendingEvents();
+            a->eventQ->ProcessPendingEvents();
             if (callback->Signalled())
                 stop = true;
@@ -499,5 +493,5 @@
  * Clean up the callback.
  */
-    aVirtualBox->UnregisterCallback (callback);
+    a->virtualBox->UnregisterCallback (callback);
     if (!callback->Signalled())
         RTPrintf("Time out or interruption while waiting for a notification.\n");
@@ -516,17 +510,20 @@
  * @note see the command line API description for parameters
  */
-int handleGuestProperty(int argc, char *argv[],
-                        ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
-{
-    if (0 == argc)
+int handleGuestProperty(HandlerArg *a)
+{
+    HandlerArg arg = *a;
+    arg.argc = a->argc - 1;
+    arg.argv = a->argv + 1;
+
+    if (0 == a->argc)
         return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
-    if (0 == strcmp(argv[0], "get"))
-        return handleGetGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
-    else if (0 == strcmp(argv[0], "set"))
-        return handleSetGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
-    else if (0 == strcmp(argv[0], "enumerate"))
-        return handleEnumGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
-    else if (0 == strcmp(argv[0], "wait"))
-        return handleWaitGuestProperty(argc - 1, argv + 1, aVirtualBox, aSession);
+    if (0 == strcmp(a->argv[0], "get"))
+        return handleGetGuestProperty(&arg);
+    else if (0 == strcmp(a->argv[0], "set"))
+        return handleSetGuestProperty(&arg);
+    else if (0 == strcmp(a->argv[0], "enumerate"))
+        return handleEnumGuestProperty(&arg);
+    else if (0 == strcmp(a->argv[0], "wait"))
+        return handleWaitGuestProperty(&arg);
     /* else */
     return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 16052)
@@ -1857,23 +1857,22 @@
 #endif
 
-int handleShowVMInfo(int argc, char *argv[],
-                     ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleShowVMInfo(HandlerArg *a)
 {
     HRESULT rc;
 
     /* at least one option: the UUID or name of the VM */
-    if (argc < 1)
+    if (a->argc < 1)
         return errorSyntax(USAGE_SHOWVMINFO, "Incorrect number of parameters");
 
     /* try to find the given machine */
     ComPtr <IMachine> machine;
-    Guid uuid (argv[0]);
+    Guid uuid (a->argv[0]);
     if (!uuid.isEmpty())
     {
-        CHECK_ERROR (virtualBox, GetMachine (uuid, machine.asOutParam()));
-    }
-    else
-    {
-        CHECK_ERROR (virtualBox, FindMachine (Bstr(argv[0]), machine.asOutParam()));
+        CHECK_ERROR (a->virtualBox, GetMachine (uuid, machine.asOutParam()));
+    }
+    else
+    {
+        CHECK_ERROR (a->virtualBox, FindMachine (Bstr(a->argv[0]), machine.asOutParam()));
         if (SUCCEEDED (rc))
             machine->COMGETTER(Id) (uuid.asOutParam());
@@ -1887,12 +1886,12 @@
     bool fStatistics = false;
     bool fMachinereadable = false;
-    for (int i=1;i<argc;i++)
-    {
-        if (!strcmp(argv[i], "-details"))
+    for (int i=1;i<a->argc;i++)
+    {
+        if (!strcmp(a->argv[i], "-details"))
             fDetails = true;
         else
-        if (!strcmp(argv[i], "-statistics"))
+        if (!strcmp(a->argv[i], "-statistics"))
             fStatistics = true;
-        if (!strcmp(argv[1], "-machinereadable"))
+        if (!strcmp(a->argv[1], "-machinereadable"))
             fMachinereadable = true;
     }
@@ -1912,16 +1911,16 @@
 
     /* open an existing session for the VM */
-    rc = virtualBox->OpenExistingSession (session, uuid);
+    rc = a->virtualBox->OpenExistingSession (a->session, uuid);
     if (SUCCEEDED(rc))
         /* get the session machine */
-        rc = session->COMGETTER(Machine)(machine.asOutParam());
+        rc = a->session->COMGETTER(Machine)(machine.asOutParam());
     if (SUCCEEDED(rc))
         /* get the session console */
-        rc = session->COMGETTER(Console)(console.asOutParam());
-
-    rc = showVMInfo (virtualBox, machine, console, details);
+        rc = a->session->COMGETTER(Console)(console.asOutParam());
+
+    rc = showVMInfo (a->virtualBox, machine, console, details);
 
     if (console)
-        session->Close();
+        a->session->Close();
 
     return SUCCEEDED (rc) ? 0 : 1;
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageList.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageList.cpp	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageList.cpp	(revision 16052)
@@ -64,15 +64,14 @@
 #endif
 
-int handleList(int argc, char *argv[],
-               ComPtr<IVirtualBox> virtualBox, ComPtr<ISession> session)
+int handleList(HandlerArg *a)
 {
     HRESULT rc = S_OK;
 
     /* exactly one option: the object */
-    if (argc != 1)
+    if (a->argc != 1)
         return errorSyntax(USAGE_LIST, "Incorrect number of parameters");
 
     /* which object? */
-    if (strcmp(argv[0], "vms") == 0)
+    if (strcmp(a->argv[0], "vms") == 0)
     {
         /*
@@ -80,5 +79,5 @@
          */
         com::SafeIfaceArray <IMachine> machines;
-        rc = virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
+        rc = a->virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
         if (SUCCEEDED(rc))
         {
@@ -89,10 +88,10 @@
             {
                 if (machines [i])
-                    rc = showVMInfo(virtualBox, machines [i]);
-            }
-        }
-    }
-    else
-    if (strcmp(argv[0], "runningvms") == 0)
+                    rc = showVMInfo(a->virtualBox, machines [i]);
+            }
+        }
+    }
+    else
+    if (strcmp(a->argv[0], "runningvms") == 0)
     {
         /*
@@ -100,5 +99,5 @@
          */
         com::SafeIfaceArray <IMachine> machines;
-        rc = virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
+        rc = a->virtualBox->COMGETTER(Machines2)(ComSafeArrayAsOutParam (machines));
         if (SUCCEEDED(rc))
         {
@@ -132,9 +131,9 @@
     }
     else
-    if (strcmp(argv[0], "ostypes") == 0)
+    if (strcmp(a->argv[0], "ostypes") == 0)
     {
         ComPtr<IGuestOSTypeCollection> coll;
         ComPtr<IGuestOSTypeEnumerator> enumerator;
-        CHECK_ERROR(virtualBox, COMGETTER(GuestOSTypes)(coll.asOutParam()));
+        CHECK_ERROR(a->virtualBox, COMGETTER(GuestOSTypes)(coll.asOutParam()));
         if (SUCCEEDED(rc) && coll)
         {
@@ -155,8 +154,8 @@
     }
     else
-    if (strcmp(argv[0], "hostdvds") == 0)
+    if (strcmp(a->argv[0], "hostdvds") == 0)
     {
         ComPtr<IHost> host;
-        CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
+        CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
         ComPtr<IHostDVDDriveCollection> coll;
         ComPtr<IHostDVDDriveEnumerator> enumerator;
@@ -177,8 +176,8 @@
     }
     else
-    if (strcmp(argv[0], "hostfloppies") == 0)
+    if (strcmp(a->argv[0], "hostfloppies") == 0)
     {
         ComPtr<IHost> host;
-        CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
+        CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
         ComPtr<IHostFloppyDriveCollection> coll;
         ComPtr<IHostFloppyDriveEnumerator> enumerator;
@@ -199,10 +198,10 @@
     }
     else
-    if (strcmp(argv[0], "hostifs") == 0)
+    if (strcmp(a->argv[0], "hostifs") == 0)
     {
         ComPtr<IHost> host;
-        CHECK_ERROR(virtualBox, COMGETTER(Host)(host.asOutParam()));
+        CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
         com::SafeIfaceArray <IHostNetworkInterface> hostNetworkInterfaces;
-        CHECK_ERROR(host, 
+        CHECK_ERROR(host,
                     COMGETTER(NetworkInterfaces) (ComSafeArrayAsOutParam (hostNetworkInterfaces)));
         for (size_t i = 0; i < hostNetworkInterfaces.size(); ++i)
@@ -256,8 +255,8 @@
     }
     else
-    if (strcmp(argv[0], "hostinfo") == 0)
+    if (strcmp(a->argv[0], "hostinfo") == 0)
     {
         ComPtr<IHost> Host;
-        CHECK_ERROR (virtualBox, COMGETTER(Host)(Host.asOutParam()));
+        CHECK_ERROR (a->virtualBox, COMGETTER(Host)(Host.asOutParam()));
 
         RTPrintf("Host Information:\n\n");
@@ -311,8 +310,8 @@
     }
     else
-    if (strcmp(argv[0], "hddbackends") == 0)
+    if (strcmp(a->argv[0], "hddbackends") == 0)
     {
         ComPtr<ISystemProperties> systemProperties;
-        CHECK_ERROR(virtualBox,
+        CHECK_ERROR(a->virtualBox,
                     COMGETTER(SystemProperties) (systemProperties.asOutParam()));
         com::SafeIfaceArray <IHardDiskFormat> hardDiskFormats;
@@ -387,8 +386,8 @@
     }
     else
-    if (strcmp(argv[0], "hdds") == 0)
+    if (strcmp(a->argv[0], "hdds") == 0)
     {
         com::SafeIfaceArray <IHardDisk2> hdds;
-        CHECK_ERROR(virtualBox, COMGETTER(HardDisks2)(ComSafeArrayAsOutParam (hdds)));
+        CHECK_ERROR(a->virtualBox, COMGETTER(HardDisks2)(ComSafeArrayAsOutParam (hdds)));
         for (size_t i = 0; i < hdds.size(); ++ i)
         {
@@ -413,5 +412,5 @@
             {
                 ComPtr<IMachine> machine;
-                CHECK_ERROR(virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
+                CHECK_ERROR(a->virtualBox, GetMachine(machineIds[j], machine.asOutParam()));
                 ASSERT(machine);
                 Bstr name;
@@ -429,8 +428,8 @@
     }
     else
-    if (strcmp(argv[0], "dvds") == 0)
+    if (strcmp(a->argv[0], "dvds") == 0)
     {
         com::SafeIfaceArray<IDVDImage2> dvds;
-        CHECK_ERROR(virtualBox, COMGETTER(DVDImages)(ComSafeArrayAsOutParam(dvds)));
+        CHECK_ERROR(a->virtualBox, COMGETTER(DVDImages)(ComSafeArrayAsOutParam(dvds)));
         for (size_t i = 0; i < dvds.size(); ++ i)
         {
@@ -450,8 +449,8 @@
     }
     else
-    if (strcmp(argv[0], "floppies") == 0)
+    if (strcmp(a->argv[0], "floppies") == 0)
     {
         com::SafeIfaceArray<IFloppyImage2> floppies;
-        CHECK_ERROR(virtualBox, COMGETTER(FloppyImages)(ComSafeArrayAsOutParam(floppies)));
+        CHECK_ERROR(a->virtualBox, COMGETTER(FloppyImages)(ComSafeArrayAsOutParam(floppies)));
         for (size_t i = 0; i < floppies.size(); ++ i)
         {
@@ -471,8 +470,8 @@
     }
     else
-    if (strcmp(argv[0], "usbhost") == 0)
+    if (strcmp(a->argv[0], "usbhost") == 0)
     {
         ComPtr<IHost> Host;
-        CHECK_ERROR_RET (virtualBox, COMGETTER(Host)(Host.asOutParam()), 1);
+        CHECK_ERROR_RET (a->virtualBox, COMGETTER(Host)(Host.asOutParam()), 1);
 
         ComPtr<IHostUSBDeviceCollection> CollPtr;
@@ -562,10 +561,10 @@
     }
     else
-    if (strcmp(argv[0], "usbfilters") == 0)
+    if (strcmp(a->argv[0], "usbfilters") == 0)
     {
         RTPrintf("Global USB Device Filters:\n\n");
 
         ComPtr <IHost> host;
-        CHECK_ERROR_RET (virtualBox, COMGETTER(Host) (host.asOutParam()), 1);
+        CHECK_ERROR_RET (a->virtualBox, COMGETTER(Host) (host.asOutParam()), 1);
 
         ComPtr<IHostUSBDeviceFilterCollection> coll;
@@ -637,8 +636,8 @@
         }
     }
-    else if (strcmp(argv[0], "systemproperties") == 0)
+    else if (strcmp(a->argv[0], "systemproperties") == 0)
     {
         ComPtr<ISystemProperties> systemProperties;
-        virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
+        a->virtualBox->COMGETTER(SystemProperties)(systemProperties.asOutParam());
 
         Bstr str;
@@ -670,5 +669,5 @@
     }
     else
-        return errorSyntax(USAGE_LIST, "Invalid parameter '%s'", Utf8Str(argv[0]).raw());
+        return errorSyntax(USAGE_LIST, "Invalid parameter '%s'", Utf8Str(a->argv[0]).raw());
 
     return SUCCEEDED(rc) ? 0 : 1;
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageMetrics.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageMetrics.cpp	(revision 16051)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageMetrics.cpp	(revision 16052)
@@ -523,26 +523,25 @@
 }
 
-int handleMetrics(int argc, char *argv[],
-                  ComPtr<IVirtualBox> aVirtualBox, ComPtr<ISession> aSession)
+int handleMetrics(HandlerArg *a)
 {
     int rc;
 
     /* at least one option: subcommand name */
-    if (argc < 1)
+    if (a->argc < 1)
         return errorSyntax(USAGE_METRICS, "Subcommand missing");
 
     ComPtr<IPerformanceCollector> performanceCollector;
-    CHECK_ERROR(aVirtualBox, COMGETTER(PerformanceCollector)(performanceCollector.asOutParam()));
-
-    if (!strcmp(argv[0], "list"))
-        rc = handleMetricsList(argc, argv, aVirtualBox, performanceCollector);
-    else if (!strcmp(argv[0], "setup"))
-        rc = handleMetricsSetup(argc, argv, aVirtualBox, performanceCollector);
-    else if (!strcmp(argv[0], "query"))
-        rc = handleMetricsQuery(argc, argv, aVirtualBox, performanceCollector);
-    else if (!strcmp(argv[0], "collect"))
-        rc = handleMetricsCollect(argc, argv, aVirtualBox, performanceCollector);
+    CHECK_ERROR(a->virtualBox, COMGETTER(PerformanceCollector)(performanceCollector.asOutParam()));
+
+    if (!strcmp(a->argv[0], "list"))
+        rc = handleMetricsList(a->argc, a->argv, a->virtualBox, performanceCollector);
+    else if (!strcmp(a->argv[0], "setup"))
+        rc = handleMetricsSetup(a->argc, a->argv, a->virtualBox, performanceCollector);
+    else if (!strcmp(a->argv[0], "query"))
+        rc = handleMetricsQuery(a->argc, a->argv, a->virtualBox, performanceCollector);
+    else if (!strcmp(a->argv[0], "collect"))
+        rc = handleMetricsCollect(a->argc, a->argv, a->virtualBox, performanceCollector);
     else
-        return errorSyntax(USAGE_METRICS, "Invalid subcommand '%s'", argv[0]);
+        return errorSyntax(USAGE_METRICS, "Invalid subcommand '%s'", a->argv[0]);
 
     return rc;
