Index: trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp	(revision 36415)
+++ trunk/src/VBox/VMM/VMMR3/PDMDevHlp.cpp	(revision 36437)
@@ -3029,5 +3029,6 @@
     if (RT_SUCCESS(rc))
     {
-        rc = pVM->pUVM->pVmm2UserMethods->pfnSaveState(pVM->pUVM->pVmm2UserMethods, pVM);
+        PUVM pUVM = pVM->pUVM;
+        rc = pUVM->pVmm2UserMethods->pfnSaveState(pVM->pUVM->pVmm2UserMethods, pUVM);
 
         /*
Index: trunk/src/VBox/VMM/VMMR3/PDMThread.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR3/PDMThread.cpp	(revision 36415)
+++ trunk/src/VBox/VMM/VMMR3/PDMThread.cpp	(revision 36437)
@@ -759,4 +759,9 @@
     pThread->Thread = Thread;
 
+    PUVM pUVM = pThread->Internal.s.pVM->pUVM;
+    if (   pUVM->pVmm2UserMethods
+        && pUVM->pVmm2UserMethods->pfnNotifyPdmtInit)
+        pUVM->pVmm2UserMethods->pfnNotifyPdmtInit(pUVM->pVmm2UserMethods, pUVM);
+
     /*
      * The run loop.
@@ -840,4 +845,7 @@
     int rc2 = RTThreadUserSignal(Thread); AssertRC(rc2);
 
+    if (   pUVM->pVmm2UserMethods
+        && pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm)
+        pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm(pUVM->pVmm2UserMethods, pUVM);
     Log(("PDMThread: Terminating thread %RTthrd / %p / '%s': %Rrc\n", Thread, pThread, RTThreadGetName(Thread), rc));
     return rc;
Index: trunk/src/VBox/VMM/VMMR3/VM.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR3/VM.cpp	(revision 36415)
+++ trunk/src/VBox/VMM/VMMR3/VM.cpp	(revision 36437)
@@ -169,9 +169,9 @@
  * @returns VBox error code on failure.
  * @param   cCpus               Number of virtual CPUs for the new VM.
- * @param   pVmm2UserMethods    An optional method table that the VMM can use to
- *                              make the user perform various action, like for
- *                              instance state saving.
+ * @param   pVmm2UserMethods    An optional method table that the VMM can use
+ *                              to make the user perform various action, like
+ *                              for instance state saving.
  * @param   pfnVMAtError        Pointer to callback function for setting VM
- *                              errors. This was added as an implicit call to
+ *                              errors.  This was added as an implicit call to
  *                              VMR3AtErrorRegister() since there is no way the
  *                              caller can get to the VM handle early enough to
@@ -197,5 +197,9 @@
         AssertReturn(pVmm2UserMethods->u32Magic    == VMM2USERMETHODS_MAGIC,   VERR_INVALID_PARAMETER);
         AssertReturn(pVmm2UserMethods->u32Version  == VMM2USERMETHODS_VERSION, VERR_INVALID_PARAMETER);
-        AssertPtrReturn(pVmm2UserMethods->pfnSaveState, VERR_INVALID_POINTER);
+        AssertPtrNullReturn(pVmm2UserMethods->pfnSaveState, VERR_INVALID_POINTER);
+        AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyEmtInit, VERR_INVALID_POINTER);
+        AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyEmtTerm, VERR_INVALID_POINTER);
+        AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyPdmtInit, VERR_INVALID_POINTER);
+        AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyPdmtTerm, VERR_INVALID_POINTER);
         AssertReturn(pVmm2UserMethods->u32EndMagic == VMM2USERMETHODS_MAGIC,   VERR_INVALID_PARAMETER);
     }
Index: trunk/src/VBox/VMM/VMMR3/VMEmt.cpp
===================================================================
--- trunk/src/VBox/VMM/VMMR3/VMEmt.cpp	(revision 36415)
+++ trunk/src/VBox/VMM/VMMR3/VMEmt.cpp	(revision 36437)
@@ -81,4 +81,8 @@
     AssertReleaseMsgRCReturn(rc, ("RTTlsSet %x failed with %Rrc\n", pUVM->vm.s.idxTLS, rc), rc);
 
+    if (   pUVM->pVmm2UserMethods
+        && pUVM->pVmm2UserMethods->pfnNotifyEmtInit)
+        pUVM->pVmm2UserMethods->pfnNotifyEmtInit(pUVM->pVmm2UserMethods, pUVM, pUVCpu);
+
     /*
      * The request loop.
@@ -254,4 +258,8 @@
         AssertLogRelRC(rc2);
     }
+
+    if (   pUVM->pVmm2UserMethods
+        && pUVM->pVmm2UserMethods->pfnNotifyEmtTerm)
+        pUVM->pVmm2UserMethods->pfnNotifyEmtTerm(pUVM->pVmm2UserMethods, pUVM, pUVCpu);
 
     pUVCpu->vm.s.NativeThreadEMT = NIL_RTNATIVETHREAD;
