Index: /trunk/include/VBox/RemoteDesktop/VRDE.h
===================================================================
--- /trunk/include/VBox/RemoteDesktop/VRDE.h	(revision 35104)
+++ /trunk/include/VBox/RemoteDesktop/VRDE.h	(revision 35105)
@@ -1416,4 +1416,14 @@
 typedef FNVRDECREATESERVER *PFNVRDECREATESERVER;
 
+/**
+ * List of names of the VRDE properties, which are recognized by the VRDE.
+ *
+ * @returns pointer to array of pointers to name strings (UTF8).
+ */
+DECLEXPORT(const char * const *) VRDESupportedProperties (void);
+
+typedef DECLCALLBACK(const char * const *) FNVRDESUPPORTEDPROPERTIES (void);
+typedef FNVRDESUPPORTEDPROPERTIES *PFNVRDESUPPORTEDPROPERTIES;
+
 RT_C_DECLS_END
 
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp	(revision 35104)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp	(revision 35105)
@@ -612,6 +612,4 @@
         else if (!strcmp(a->argv[1], "vrdpport"))
         {
-            RTStrmPrintf(g_pStdErr, "Warning: 'vrdpport' is deprecated. Use 'setvrdeproperty'.\n");
-
             if (a->argc <= 1 + 1)
             {
@@ -620,4 +618,7 @@
                 break;
             }
+
+            RTStrmPrintf(g_pStdErr, "Warning: 'vrdpport' is deprecated. Use 'vrdeproperty TCP/Ports=%s'.\n", a->argv[2]);
+
             ComPtr<IVRDEServer> vrdeServer;
             sessionMachine->COMGETTER(VRDEServer)(vrdeServer.asOutParam());
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 35104)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp	(revision 35105)
@@ -1448,6 +1448,6 @@
                 RTPrintf("vrde=\"on\"\n");
                 RTPrintf("vrdeport=%d\n", currentPort);
-                RTPrintf("vrdeproperty[TCP/Ports]=\"%lS\"\n", ports.raw());
-                RTPrintf("vrdeproperty[TCP/Address]=\"%lS\"\n", address.raw());
+                RTPrintf("vrdeports=\"%lS\"\n", ports.raw());
+                RTPrintf("vrdeaddress=\"%lS\"\n", address.raw());
                 RTPrintf("vrdeauthtype=\"%s\"\n", strAuthType);
                 RTPrintf("vrdemulticon=\"%s\"\n", fMultiCon ? "on" : "off");
@@ -1468,4 +1468,28 @@
                 else
                     RTPrintf("Video redirection: disabled\n");
+            }
+            com::SafeArray<BSTR> aProperties;
+            if (SUCCEEDED(vrdeServer->COMGETTER(VRDEProperties)(ComSafeArrayAsOutParam(aProperties))))
+            {
+                unsigned i;
+                for (i = 0; i < aProperties.size(); ++i)
+                {
+                    Bstr value;
+                    vrdeServer->GetVRDEProperty(aProperties[i], value.asOutParam());
+                    if (details == VMINFO_MACHINEREADABLE)
+                    {
+                        if (value.isEmpty())
+                            RTPrintf("vrdeproperty[%lS]=<not set>\n", aProperties[i]);
+                        else
+                            RTPrintf("vrdeproperty[%lS]=\"%lS\"\n", aProperties[i], value.raw());
+                    }
+                    else
+                    {
+                        if (value.isEmpty())
+                            RTPrintf("VRDE property: %-10lS = <not set>\n", aProperties[i]);
+                        else
+                            RTPrintf("VRDE property: %-10lS = \"%lS\"\n", aProperties[i], value.raw());
+                    }
+                }
             }
         }
Index: /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 35104)
+++ /trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp	(revision 35105)
@@ -141,4 +141,6 @@
     MODIFYVM_VRDP,                    /* VRDE: deprecated */
     MODIFYVM_VRDEPROPERTY,
+    MODIFYVM_VRDEPORT,
+    MODIFYVM_VRDEADDRESS,
     MODIFYVM_VRDEAUTHTYPE,
     MODIFYVM_VRDEAUTHLIBRARY,
@@ -265,4 +267,6 @@
     { "--vrdp",                     MODIFYVM_VRDP,                      RTGETOPT_REQ_BOOL_ONOFF }, /* deprecated */
     { "--vrdeproperty",             MODIFYVM_VRDEPROPERTY,              RTGETOPT_REQ_STRING },
+    { "--vrdeport",                 MODIFYVM_VRDEPORT,                  RTGETOPT_REQ_STRING },
+    { "--vrdeaddress",              MODIFYVM_VRDEADDRESS,               RTGETOPT_REQ_STRING },
     { "--vrdeauthtype",             MODIFYVM_VRDEAUTHTYPE,              RTGETOPT_REQ_STRING },
     { "--vrdeauthlibrary",          MODIFYVM_VRDEAUTHLIBRARY,           RTGETOPT_REQ_STRING },
@@ -296,10 +300,4 @@
 {
     RTStrmPrintf(g_pStdErr, "Warning: '--vrdp%s' is deprecated. Use '--vrde%s'.\n", pszOption, pszOption);
-}
-
-static void vrdeWarningDeprecatedProperty(const char *pszOption, const char *pszProperty, const char *pszArg)
-{
-    RTStrmPrintf(g_pStdErr, "Warning: '--%s' is deprecated. Use '--vrdeproperty \"%s=%s\"'.\n",
-                 pszOption, pszProperty, pszArg);
 }
 
@@ -1883,7 +1881,8 @@
 
             case MODIFYVM_VRDPPORT:
-            {
-                vrdeWarningDeprecatedProperty("vrdpport", "TCP/Ports", ValueUnion.psz);
-
+                vrdeWarningDeprecatedOption("port");
+
+            case MODIFYVM_VRDEPORT:
+            {
                 ComPtr<IVRDEServer> vrdeServer;
                 machine->COMGETTER(VRDEServer)(vrdeServer.asOutParam());
@@ -1898,7 +1897,8 @@
 
             case MODIFYVM_VRDPADDRESS:
-            {
-                vrdeWarningDeprecatedProperty("vrdpaddress", "TCP/Address", ValueUnion.psz);
-
+                vrdeWarningDeprecatedOption("address");
+
+            case MODIFYVM_VRDEADDRESS:
+            {
                 ComPtr<IVRDEServer> vrdeServer;
                 machine->COMGETTER(VRDEServer)(vrdeServer.asOutParam());
Index: /trunk/src/VBox/Main/VRDEServerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/VRDEServerImpl.cpp	(revision 35104)
+++ /trunk/src/VBox/Main/VRDEServerImpl.cpp	(revision 35105)
@@ -26,6 +26,8 @@
 #include <iprt/ctype.h>
 #include <iprt/ldr.h>
+#include <iprt/path.h>
 
 #include <VBox/err.h>
+#include <VBox/sup.h>
 
 #include <VBox/RemoteDesktop/VRDE.h>
@@ -487,4 +489,147 @@
 }
 
+static int loadVRDELibrary(const char *pszLibraryName, RTLDRMOD *phmod, PFNVRDESUPPORTEDPROPERTIES *ppfn)
+{
+    int rc = VINF_SUCCESS;
+
+    RTLDRMOD hmod = NIL_RTLDRMOD;
+
+    char szErr[4096 + 512];
+    szErr[0] = '\0';
+    if (RTPathHavePath(pszLibraryName))
+        rc = SUPR3HardenedLdrLoadPlugIn(pszLibraryName, &hmod, szErr, sizeof(szErr));
+    else
+        rc = SUPR3HardenedLdrLoadAppPriv(pszLibraryName, &hmod, szErr, sizeof(szErr));
+    if (RT_SUCCESS(rc))
+    {
+        rc = RTLdrGetSymbol(hmod, "VRDESupportedProperties", (void **)ppfn);
+
+        if (RT_FAILURE(rc) && rc != VERR_SYMBOL_NOT_FOUND)
+            LogRel(("VRDE: Error resolving symbol '%s', rc %Rrc.\n", "VRDESupportedProperties", rc));
+    }
+    else
+    {
+        if (szErr[0])
+            LogRel(("VRDE: Error loading the library '%s': %s (%Rrc)\n", pszLibraryName, szErr, rc));
+        else
+            LogRel(("VRDE: Error loading the library '%s' rc = %Rrc.\n", pszLibraryName, rc));
+
+        hmod = NIL_RTLDRMOD;
+    }
+
+    if (RT_SUCCESS(rc))
+    {
+        *phmod = hmod;
+    }
+    else
+    {
+        if (hmod != NIL_RTLDRMOD)
+        {
+            RTLdrClose(hmod);
+            hmod = NIL_RTLDRMOD;
+        }
+    }
+
+    return rc;
+}
+
+STDMETHODIMP VRDEServer::COMGETTER(VRDEProperties)(ComSafeArrayOut(BSTR, aProperties))
+{
+    if (ComSafeArrayOutIsNull(aProperties))
+        return E_POINTER;
+
+    AutoCaller autoCaller(this);
+    if (FAILED(autoCaller.rc())) return autoCaller.rc();
+
+    size_t cProperties = 0;
+
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+    if (!mData->mEnabled)
+    {
+        com::SafeArray<BSTR> properties(cProperties);
+        properties.detachTo(ComSafeArrayOutArg(aProperties));
+        return S_OK;
+    }
+    alock.release();
+
+    /*
+     * Check that a VRDE extension pack name is set and resolve it into a
+     * library path.
+     */
+    Bstr bstrExtPack;
+    HRESULT hrc = COMGETTER(VRDEExtPack)(bstrExtPack.asOutParam());
+    Log(("VRDEPROP: get extpack hrc 0x%08X, isEmpty %d\n", hrc, bstrExtPack.isEmpty()));
+    if (FAILED(hrc))
+        return hrc;
+    if (bstrExtPack.isEmpty())
+        return E_FAIL;
+
+    Utf8Str strExtPack(bstrExtPack);
+    Utf8Str strVrdeLibrary;
+    int vrc = VINF_SUCCESS;
+    if (strExtPack.equals(VBOXVRDP_KLUDGE_EXTPACK_NAME))
+        strVrdeLibrary = "VBoxVRDP";
+    else
+    {
+#ifdef VBOX_WITH_EXTPACK
+        VirtualBox *pVirtualBox = mParent->getVirtualBox();
+        ExtPackManager *pExtPackMgr = pVirtualBox->getExtPackManager();
+        vrc = pExtPackMgr->getVrdeLibraryPathForExtPack(&strExtPack, &strVrdeLibrary);
+#else
+        vrc = VERR_FILE_NOT_FOUND;
+#endif
+    }
+    Log(("VRDEPROP: library get rc %Rrc\n", vrc));
+
+    if (RT_SUCCESS(vrc))
+    {
+        /*
+         * Load the VRDE library and start the server, if it is enabled.
+         */
+        PFNVRDESUPPORTEDPROPERTIES pfn = NULL;
+        RTLDRMOD hmod = NIL_RTLDRMOD;
+        vrc = loadVRDELibrary(strVrdeLibrary.c_str(), &hmod, &pfn);
+        Log(("VRDEPROP: load library [%s] rc %Rrc\n", strVrdeLibrary.c_str(), vrc));
+        if (RT_SUCCESS(vrc))
+        {
+            const char * const *papszNames = pfn();
+
+            if (papszNames)
+            {
+                size_t i;
+                for (i = 0; papszNames[i] != NULL; ++i)
+                {
+                    cProperties++;
+                }
+            }
+            Log(("VRDEPROP: %d properties\n", cProperties));
+
+            com::SafeArray<BSTR> properties(cProperties);
+
+            if (cProperties > 0)
+            {
+                size_t i;
+                for (i = 0; papszNames[i] != NULL && i < cProperties; ++i)
+                {
+                    Bstr tmp(papszNames[i]);
+                    tmp.cloneTo(&properties[i]);
+                }
+            }
+
+            /* Do not forget to unload the library. */
+            RTLdrClose(hmod);
+            hmod = NIL_RTLDRMOD;
+
+            properties.detachTo(ComSafeArrayOutArg(aProperties));
+        }
+    }
+
+    if (RT_FAILURE(vrc))
+    {
+        return E_FAIL;
+    }
+
+    return S_OK;
+}
 
 STDMETHODIMP VRDEServer::COMGETTER(AuthType) (AuthType_T *aType)
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 35104)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 35105)
@@ -12758,4 +12758,10 @@
     </attribute>
 
+    <attribute name="VRDEProperties" type="wstring" readonly="yes" safearray="yes">
+      <desc>
+        Array of names of properties, which are supported by this VRDE server.
+      </desc>
+    </attribute>
+
     <method name="setVRDEProperty">
       <desc>
Index: /trunk/src/VBox/Main/include/VRDEServerImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/VRDEServerImpl.h	(revision 35104)
+++ /trunk/src/VBox/Main/include/VRDEServerImpl.h	(revision 35105)
@@ -88,4 +88,5 @@
     STDMETHOD(COMGETTER(AuthLibrary)) (BSTR *aValue);
     STDMETHOD(COMSETTER(AuthLibrary)) (IN_BSTR aValue);
+    STDMETHOD(COMGETTER(VRDEProperties)) (ComSafeArrayOut (BSTR, aProperties));
 
     // IVRDEServer methods
