Index: /trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp
===================================================================
--- /trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp	(revision 37522)
+++ /trunk/src/VBox/Main/src-server/MachineImplCloneVM.cpp	(revision 37523)
@@ -237,4 +237,20 @@
     try
     {
+        /* Handle the special case that someone is requesting a _full_ clone
+         * with all snapshots (and the current state), but uses a snapshot
+         * machine (and not the current one) as source machine. In this case we
+         * just replace the source (snapshot) machine with the current machine. */
+        if (   d->mode == CloneMode_AllStates
+            && d->pSrcMachine->isSnapshotMachine())
+        {
+            Bstr bstrSrcMachineId;
+            rc = d->pSrcMachine->COMGETTER(Id)(bstrSrcMachineId.asOutParam());
+            if (FAILED(rc)) throw rc;
+            ComPtr<IMachine> newSrcMachine;
+            rc = d->pSrcMachine->getVirtualBox()->FindMachine(bstrSrcMachineId.raw(), newSrcMachine.asOutParam());
+            if (FAILED(rc)) throw rc;
+            d->pSrcMachine = (Machine*)(IMachine*)newSrcMachine;
+        }
+
         /* Lock the target machine early (so nobody mess around with it in the meantime). */
         AutoWriteLock trgLock(d->pTrgMachine COMMA_LOCKVAL_SRC_POS);
@@ -248,6 +264,6 @@
 
         /* Include current state? */
-        if (   d->mode == CloneMode_MachineState)
-//            || d->mode == CloneMode_AllStates)
+        if (   d->mode == CloneMode_MachineState
+            || d->mode == CloneMode_AllStates)
             machineList.append(d->pSrcMachine);
         /* Should be done a depth copy with all child snapshots? */
@@ -269,6 +285,9 @@
                 rc = d->cloneCreateMachineList(pSnapshot, machineList);
                 if (FAILED(rc)) throw rc;
-                rc = pSnapshot->COMGETTER(Machine)(d->pOldMachineState.asOutParam());
-                if (FAILED(rc)) throw rc;
+                if (d->mode == CloneMode_MachineAndChildStates)
+                {
+                    rc = pSnapshot->COMGETTER(Machine)(d->pOldMachineState.asOutParam());
+                    if (FAILED(rc)) throw rc;
+                }
             }
         }
