Index: /trunk/include/VBox/vmm/pdmdev.h
===================================================================
--- /trunk/include/VBox/vmm/pdmdev.h	(revision 55969)
+++ /trunk/include/VBox/vmm/pdmdev.h	(revision 55970)
@@ -161,7 +161,6 @@
  * Power Off notification.
  *
- * This is only called when the VMR3PowerOff call is made on a running VM.  This
- * means that there is no notification if the VM was suspended before being
- * powered off.  There will also be no callback when hot plugging devices.
+ * This is always called when VMR3PowerOff is called.
+ * There will be no callback when hot plugging devices.
  *
  * @param   pDevIns     The device instance data.
Index: /trunk/include/VBox/vmm/pdmdrv.h
===================================================================
--- /trunk/include/VBox/vmm/pdmdrv.h	(revision 55969)
+++ /trunk/include/VBox/vmm/pdmdrv.h	(revision 55970)
@@ -175,8 +175,7 @@
  * Power Off notification.
  *
- * This is only called when the VMR3PowerOff call is made on a running VM. This
- * means that there is no notification if the VM was suspended before being
- * powered of.  There will also be no callback when hot plugging devices or when
- * replumbing the driver stack.
+ * This is always called when VMR3PowerOff is called.
+ * There will be no callback when hot plugging devices or when replumbing the driver
+ * stack.
  *
  * @param   pDrvIns     The driver instance data.
Index: /trunk/src/VBox/VMM/VMMR3/PDM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PDM.cpp	(revision 55969)
+++ /trunk/src/VBox/VMM/VMMR3/PDM.cpp	(revision 55970)
@@ -2101,4 +2101,29 @@
     LogFlow(("PDMR3PowerOff:\n"));
     uint64_t cNsElapsed = RTTimeNanoTS();
+
+    /*
+     * Clear the suspended flags on all devices and drivers first because they
+     * might have been set during a suspend but the power off callbacks should
+     * be called in any case.
+     */
+    for (PPDMDEVINS pDevIns = pVM->pdm.s.pDevInstances; pDevIns; pDevIns = pDevIns->Internal.s.pNextR3)
+    {
+        pDevIns->Internal.s.fIntFlags &= ~PDMDEVINSINT_FLAGS_SUSPENDED;
+
+        for (PPDMLUN pLun = pDevIns->Internal.s.pLunsR3; pLun; pLun = pLun->pNext)
+            for (PPDMDRVINS pDrvIns = pLun->pTop; pDrvIns; pDrvIns = pDrvIns->Internal.s.pDown)
+                pDrvIns->Internal.s.fVMSuspended = false;
+    }
+
+#ifdef VBOX_WITH_USB
+    for (PPDMUSBINS pUsbIns = pVM->pdm.s.pUsbInstances; pUsbIns; pUsbIns = pUsbIns->Internal.s.pNext)
+    {
+        pUsbIns->Internal.s.fVMSuspended = false;
+
+        for (PPDMLUN pLun = pUsbIns->Internal.s.pLuns; pLun; pLun = pLun->pNext)
+            for (PPDMDRVINS pDrvIns = pLun->pTop; pDrvIns; pDrvIns = pDrvIns->Internal.s.pDown)
+                pDrvIns->Internal.s.fVMSuspended = false;
+    }
+#endif
 
     /*
Index: /trunk/src/VBox/VMM/include/PDMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/PDMInternal.h	(revision 55969)
+++ /trunk/src/VBox/VMM/include/PDMInternal.h	(revision 55970)
@@ -176,5 +176,9 @@
  * to make sure each device gets exactly one notification for each of those
  * events.  PDMR3Resume and PDMR3PowerOn also makes use of it to bail out on
- * a failure (already resumed/powered-on devices are suspended). */
+ * a failure (already resumed/powered-on devices are suspended).
+ * PDMR3PowerOff resets this flag once before going through the devices to make sure
+ * every device gets the power off notification even if it was suspended before with
+ * PDMR3Suspend.
+ */
 #define PDMDEVINSINT_FLAGS_SUSPENDED     RT_BIT_32(1)
 /** Indicates that the device has been reset already.  Used by PDMR3Reset. */
