Index: /trunk/src/VBox/Main/include/CloudUserProfileManagerImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/CloudUserProfileManagerImpl.h	(revision 73548)
+++ /trunk/src/VBox/Main/include/CloudUserProfileManagerImpl.h	(revision 73549)
@@ -41,5 +41,9 @@
 private:
     ComPtr<VirtualBox> const mParent;       /**< Strong reference to the parent object (VirtualBox/IMachine). */
+#ifdef CLOUD_PROVIDERS_IN_EXTPACK
+    std::vector<ComPtr<ICloudUserProfileManager>> mUserProfileManagers;
+#else
     std::vector<CloudProviderId_T> mSupportedProviders;
+#endif
 
     HRESULT getSupportedProviders(std::vector<CloudProviderId_T> &aProviderTypes);
Index: /trunk/src/VBox/Main/src-server/CloudUserProfileManagerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/CloudUserProfileManagerImpl.cpp	(revision 73548)
+++ /trunk/src/VBox/Main/src-server/CloudUserProfileManagerImpl.cpp	(revision 73549)
@@ -25,4 +25,5 @@
 #include "CloudUserProfilesImpl.h"
 #include "VirtualBoxImpl.h"
+#include "ExtPackManagerImpl.h"
 #include "Global.h"
 #include "ProgressImpl.h"
@@ -67,6 +68,25 @@
 
     unconst(mParent) = aParent;
+
+#ifdef CLOUD_PROVIDERS_IN_EXTPACK
+    /*
+     * Engage the extension pack manager and get all the implementations of this class.
+     */
+    ExtPackManager *pExtPackMgr = aParent->i_getExtPackManager();
+    std::vector<ComPtr<IUnknown> > Objects;
+    com::Guid idObj(COM_IIDOF(ICloudUserProfileManager));
+    pExtPackMgr->i_queryObjects(idObj.toString(), Objects);
+    for (unsigned i = 0; i < Objects.size(); i++)
+    {
+        ComPtr<ICloudUserProfileManager> ptrTmp;
+        HRESULT hrc = Objects[i].queryInterfaceTo(ptrTmp.asOutParam());
+        if (SUCCEEDED(hrc))
+            mUserProfileManagers.push_back(ptrTmp);
+    }
+#else
+
     mSupportedProviders.clear();
     mSupportedProviders.push_back(CloudProviderId_OCI);
+#endif
 
     autoInitSpan.setSucceeded();
@@ -86,10 +106,50 @@
 HRESULT CloudUserProfileManager::getSupportedProviders(std::vector<CloudProviderId_T> &aSupportedProviders)
 {
+#ifdef CLOUD_PROVIDERS_IN_EXTPACK
+    /*
+     * Collect all the provider names from all the extension pack objects.
+     */
+    HRESULT hrc = S_OK;
+    for (unsigned i = 0; i < mUserProfileManagers.size(); i++)
+    {
+        SafeArray<CloudProviderId_T> FromCurrent;
+        HRESULT hrc2 = mUserProfileManagers[i]->COMGETTER(SupportedProviders)(ComSafeArrayAsOutParam(FromCurrent));
+        if (SUCCEEDED(hrc2))
+            for (size_t i = 0; i < FromCurrent.size(); i++)
+                aSupportedProviders.push_back(FromCurrent[i]);
+        else if (SUCCEEDED(hrc))
+            hrc = hrc2;
+    }
+    if (aSupportedProviders.size() > 0)
+        hrc = S_OK;
+    return hrc;
+#else
     aSupportedProviders = mSupportedProviders;
     return S_OK;
+#endif
 }
 
 HRESULT CloudUserProfileManager::getAllProfiles(std::vector<ComPtr<ICloudUserProfiles> > &aProfilesList)
 {
+#ifdef CLOUD_PROVIDERS_IN_EXTPACK
+    /*
+     * Collect all the cloud providers from all the extension pack objects.
+     */
+    HRESULT hrc = S_OK;
+    for (unsigned i = 0; i < mUserProfileManagers.size(); i++)
+    {
+        SafeIfaceArray<ICloudUserProfiles> FromCurrent;
+        HRESULT hrc2 = mUserProfileManagers[i]->GetAllProfiles(ComSafeArrayAsOutParam(FromCurrent));
+        if (SUCCEEDED(hrc2))
+            for (size_t i = 0; i < FromCurrent.size(); i++)
+                aProfilesList.push_back(FromCurrent[i]);
+        else if (SUCCEEDED(hrc))
+            hrc = hrc2;
+    }
+    if (aProfilesList.size() > 0)
+        hrc = S_OK;
+    return hrc;
+
+#else
     HRESULT hrc = S_OK;
     std::vector<ComPtr<ICloudUserProfiles> > lProfilesList;
@@ -108,4 +168,5 @@
 
     return hrc;
+#endif
 }
 
@@ -113,4 +174,19 @@
                                                        ComPtr<ICloudUserProfiles> &aProfiles)
 {
+#ifdef CLOUD_PROVIDERS_IN_EXTPACK
+    /*
+     * Return the first provider we get.
+     */
+    HRESULT hrc = VBOX_E_OBJECT_NOT_FOUND;
+    for (unsigned i = 0; i < mUserProfileManagers.size(); i++)
+    {
+        hrc = mUserProfileManagers[i]->GetProfilesByProvider(aProviderType, aProfiles.asOutParam());
+        if (SUCCEEDED(hrc))
+            break;
+    }
+    return hrc;
+
+#else
+
     ComObjPtr<CloudUserProfiles> ptrCloudUserProfiles;
     HRESULT hrc = ptrCloudUserProfiles.createObject();
@@ -158,4 +234,5 @@
 
     return hrc;
-}
-
+#endif
+}
+
