Index: trunk/src/VBox/Main/src-server/UnattendedImpl.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/UnattendedImpl.cpp	(revision 102053)
+++ trunk/src/VBox/Main/src-server/UnattendedImpl.cpp	(revision 102116)
@@ -318,4 +318,5 @@
         mfInstallGuestAdditions     = false;
         mfInstallTestExecService    = false;
+        mfInstallUserPayload        = false;
         midxImage                   = 1;
 
@@ -2570,4 +2571,7 @@
         return setErrorBoth(E_FAIL, VERR_FILE_NOT_FOUND, tr("Could not locate the validation kit ISO file '%s'"),
                             mStrValidationKitIsoPath.c_str());
+    if (mfInstallUserPayload && !RTFileExists(mStrUserPayloadIsoPath.c_str()))
+        return setErrorBoth(E_FAIL, VERR_FILE_NOT_FOUND, tr("Could not locate the User Payload ISO file '%s'"),
+                            mStrUserPayloadIsoPath.c_str());
     if (mStrScriptTemplatePath.isNotEmpty() && !RTFileExists(mStrScriptTemplatePath.c_str()))
         return setErrorBoth(E_FAIL, VERR_FILE_NOT_FOUND, tr("Could not locate unattended installation script template '%s'"),
@@ -3522,4 +3526,34 @@
     AssertReturn(mpInstaller == NULL, setErrorBoth(E_FAIL, VERR_WRONG_ORDER, tr("Cannot change after prepare() has been called")));
     mfInstallTestExecService = aInstallTestExecService != FALSE;
+    return S_OK;
+}
+
+HRESULT Unattended::getUserPayloadIsoPath(com::Utf8Str &aUserPayloadIsoPath)
+{
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+    aUserPayloadIsoPath = mStrUserPayloadIsoPath;
+    return S_OK;
+}
+
+HRESULT Unattended::setUserPayloadIsoPath(const com::Utf8Str &aUserPayloadIsoPath)
+{
+    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+    AssertReturn(mpInstaller == NULL, setErrorBoth(E_FAIL, VERR_WRONG_ORDER, tr("Cannot change after prepare() has been called")));
+    mStrUserPayloadIsoPath = aUserPayloadIsoPath;
+    return S_OK;
+}
+
+HRESULT Unattended::getInstallUserPayload(BOOL *aInstallUserPayload)
+{
+    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+    *aInstallUserPayload = mfInstallUserPayload;
+    return S_OK;
+}
+
+HRESULT Unattended::setInstallUserPayload(BOOL aInstallUserPayload)
+{
+    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+    AssertReturn(mpInstaller == NULL, setErrorBoth(E_FAIL, VERR_WRONG_ORDER, tr("Cannot change after prepare() has been called")));
+    mfInstallUserPayload = aInstallUserPayload != FALSE;
     return S_OK;
 }
@@ -4098,4 +4132,16 @@
 }
 
+Utf8Str const &Unattended::i_getUserPayloadIsoPath() const
+{
+    Assert(isReadLockedOnCurrentThread());
+    return mStrUserPayloadIsoPath;
+}
+
+bool           Unattended::i_getInstallUserPayload() const
+{
+    Assert(isReadLockedOnCurrentThread());
+    return mfInstallUserPayload;
+}
+
 Utf8Str const &Unattended::i_getTimeZone() const
 {
Index: trunk/src/VBox/Main/src-server/UnattendedInstaller.cpp
===================================================================
--- trunk/src/VBox/Main/src-server/UnattendedInstaller.cpp	(revision 102053)
+++ trunk/src/VBox/Main/src-server/UnattendedInstaller.cpp	(revision 102116)
@@ -256,8 +256,9 @@
 bool UnattendedInstaller::isAuxiliaryIsoNeeded() const
 {
-    /* In the VISO case we use the AUX ISO for GAs and TXS. */
+    /* In the VISO case we use the AUX ISO for GAs, TXS, and User Payloads. */
     return isAuxiliaryIsoIsVISO()
         && (   mpParent->i_getInstallGuestAdditions()
-            || mpParent->i_getInstallTestExecService());
+            || mpParent->i_getInstallTestExecService()
+            || mpParent->i_getInstallUserPayload());
 }
 
@@ -755,4 +756,14 @@
                 rVecArgs.append().append("--push-iso=").append(mpParent->i_getValidationKitIsoPath());
                 rVecArgs.append() = "/vboxvalidationkit=/";
+                rVecArgs.append() = "--pop";
+            }
+
+            /*
+             * If we've got a User Payload ISO, add its content to a /vboxuserpayload dir.
+             */
+            if (mpParent->i_getInstallUserPayload())
+            {
+                rVecArgs.append().append("--push-iso=").append(mpParent->i_getUserPayloadIsoPath());
+                rVecArgs.append() = "/vboxuserpayload=/";
                 rVecArgs.append() = "--pop";
             }
