Index: /trunk/src/VBox/ValidationKit/testdriver/vbox.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testdriver/vbox.py	(revision 61950)
+++ /trunk/src/VBox/ValidationKit/testdriver/vbox.py	(revision 61951)
@@ -2649,32 +2649,33 @@
         # Check if the VM has terminated by it self before powering it off.
         fClose = True;
-        fRc = oSession.pollTask();
-        if fRc is not True:
+        fRc    = True;
+        if oSession.needsPoweringOff():
             reporter.log('terminateVmBySession: powering off "%s"...' % (oSession.sName,));
             fRc = oSession.powerOff(fFudgeOnFailure = False);
-        if fRc is not True:
-            # power off failed, try terminate it in a nice manner.
-            fRc = False;
-            uPid = oSession.getPid();
-            if uPid is not None:
-                reporter.error('terminateVmBySession: Terminating PID %u (VM %s)' % (uPid, oSession.sName));
-                fClose = base.processTerminate(uPid);
-                if fClose is True:
-                    self.waitOnDirectSessionClose(oSession.oVM, 5000);
-                    fClose = oSession.waitForTask(1000);
-
-                if fClose is not True:
-                    # Being nice failed...
-                    reporter.error('terminateVmBySession: Termination failed, trying to kill PID %u (VM %s) instead' \
-                                   % (uPid, oSession.sName));
-                    fClose = base.processKill(uPid);
+            if fRc is not True:
+                # power off failed, try terminate it in a nice manner.
+                fRc = False;
+                uPid = oSession.getPid();
+                if uPid is not None:
+                    reporter.error('terminateVmBySession: Terminating PID %u (VM %s)' % (uPid, oSession.sName));
+                    fClose = base.processTerminate(uPid);
                     if fClose is True:
                         self.waitOnDirectSessionClose(oSession.oVM, 5000);
                         fClose = oSession.waitForTask(1000);
+
                     if fClose is not True:
-                        reporter.error('terminateVmBySession: Failed to kill PID %u (VM %s)' % (uPid, oSession.sName));
+                        # Being nice failed...
+                        reporter.error('terminateVmBySession: Termination failed, trying to kill PID %u (VM %s) instead' \
+                                       % (uPid, oSession.sName));
+                        fClose = base.processKill(uPid);
+                        if fClose is True:
+                            self.waitOnDirectSessionClose(oSession.oVM, 5000);
+                            fClose = oSession.waitForTask(1000);
+                        if fClose is not True:
+                            reporter.error('terminateVmBySession: Failed to kill PID %u (VM %s)' % (uPid, oSession.sName));
 
         # The final steps.
         if fClose is True:
+            reporter.log('terminateVmBySession: closing session "%s"...' % (oSession.sName,));
             oSession.close();
             self.waitOnDirectSessionClose(oSession.oVM, 10000);
Index: /trunk/src/VBox/ValidationKit/testdriver/vboxwrappers.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testdriver/vboxwrappers.py	(revision 61950)
+++ /trunk/src/VBox/ValidationKit/testdriver/vboxwrappers.py	(revision 61951)
@@ -701,5 +701,4 @@
         return self.oConsoleEventHandler is not None;
 
-
     def deregisterEventHandlerForTask(self):
         """
@@ -710,5 +709,4 @@
             self.oConsoleEventHandler = None;
 
-
     def signalHostMemoryLow(self):
         """
@@ -720,4 +718,42 @@
         return True;
 
+    def needsPoweringOff(self):
+        """
+        Examins the machine state to see if the VM needs powering off.
+        """
+        try:
+            try:
+                eState = self.o.machine.state;
+            except Exception, oXcpt:
+                if vbox.ComError.notEqual(oXcpt, vbox.ComError.E_UNEXPECTED):
+                    reporter.logXcpt();
+                return False;
+        finally:
+            self.oTstDrv.processPendingEvents();
+
+        # Switch
+        if eState == vboxcon.MachineState_Running:
+            return True;
+        if eState == vboxcon.MachineState_Paused:
+            return True;
+        if eState == vboxcon.MachineState_Stuck:
+            return True;
+        if eState == vboxcon.MachineState_Teleporting:
+            return True;
+        if eState == vboxcon.MachineState_LiveSnapshotting:
+            return True;
+        if eState == vboxcon.MachineState_Starting:
+            return True;
+        if eState == vboxcon.MachineState_Saving:
+            return True;
+        if eState == vboxcon.MachineState_Restoring:
+            return True;
+        if eState == vboxcon.MachineState_TeleportingPausedVM:
+            return True;
+        if eState == vboxcon.MachineState_TeleportingIn:
+            return True;
+        if eState == vboxcon.MachineState_FaultTolerantSyncing:
+            return True;
+        return False;
 
     def assertPoweredOff(self):
@@ -740,5 +776,4 @@
                        % (_nameMachineState(eState),));
         return False;
-
 
     def getMachineStateWithName(self):
