Index: /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemption.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemption.cpp	(revision 19934)
+++ /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemption.cpp	(revision 19935)
@@ -88,4 +88,5 @@
         case TSTR0THREADPREMEPTION_IS_PENDING:
         {
+            /* This isn't 100% proof... */
             RTTHREADPREEMPTSTATE State = RTTHREADPREEMPTSTATE_INITIALIZER;
             RTThreadPreemptDisable(&State);
@@ -121,4 +122,38 @@
         }
 
+        case TSTR0THREADPREMEPTION_NESTED:
+        {
+            RTTHREADPREEMPTSTATE State1 = RTTHREADPREEMPTSTATE_INITIALIZER;
+            RTThreadPreemptDisable(&State1);
+            if (!RTThreadPreemptIsEnabled(NIL_RTTHREAD))
+            {
+                RTTHREADPREEMPTSTATE State2 = RTTHREADPREEMPTSTATE_INITIALIZER;
+                RTThreadPreemptDisable(&State2);
+                if (!RTThreadPreemptIsEnabled(NIL_RTTHREAD))
+                {
+                    RTTHREADPREEMPTSTATE State3 = RTTHREADPREEMPTSTATE_INITIALIZER;
+                    RTThreadPreemptDisable(&State3);
+                    if (RTThreadPreemptIsEnabled(NIL_RTTHREAD))
+                        RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 3rd RTThreadPreemptDisable");
+
+                    RTThreadPreemptRestore(&State3);
+                    if (RTThreadPreemptIsEnabled(NIL_RTTHREAD) && !*pszErr)
+                        RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 1st RTThreadPreemptRestore");
+                }
+                else
+                    RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 2nd RTThreadPreemptDisable");
+
+                RTThreadPreemptRestore(&State2);
+                if (RTThreadPreemptIsEnabled(NIL_RTTHREAD) && !*pszErr)
+                    RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 2nd RTThreadPreemptRestore");
+            }
+            else
+                RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns true after 1st RTThreadPreemptDisable");
+            RTThreadPreemptRestore(&State1);
+            if (!RTThreadPreemptIsEnabled(NIL_RTTHREAD) && !*pszErr)
+                RTStrPrintf(pszErr, cchErr, "!RTThreadPreemptIsEnabled returns false after 3rd RTThreadPreemptRestore");
+            break;
+        }
+
         default:
             RTStrPrintf(pszErr, cchErr, "!Unknown test #%d\n", uOperation);
Index: /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemption.h
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemption.h	(revision 19934)
+++ /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemption.h	(revision 19935)
@@ -42,4 +42,5 @@
     TSTR0THREADPREMEPTION_BASIC,
     TSTR0THREADPREMEPTION_IS_PENDING,
+    TSTR0THREADPREMEPTION_NESTED
 } TSTR0THREADPREMEPTION;
 
Index: /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemptionDriver.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemptionDriver.cpp	(revision 19934)
+++ /trunk/src/VBox/Runtime/testcase/tstR0ThreadPreemptionDriver.cpp	(revision 19935)
@@ -163,4 +163,19 @@
 
     /*
+     * Stay in ring-0 until preemption is pending.
+     */
+    RTTestSub(hTest, "Nested");
+    Req.Hdr.u32Magic = SUPR0SERVICEREQHDR_MAGIC;
+    Req.Hdr.cbReq = sizeof(Req);
+    Req.szMsg[0] = '\0';
+    RTTESTI_CHECK_RC(rc = SUPR3CallR0Service("tstR0ThreadPreemption", sizeof("tstR0ThreadPreemption") - 1,
+                                             TSTR0THREADPREMEPTION_NESTED, 0, &Req.Hdr), VINF_SUCCESS);
+    RTTESTI_CHECK_MSG(Req.szMsg[0] != '!', ("%s", Req.szMsg));
+    if (Req.szMsg[0])
+        RTTestIPrintf(RTTESTLVL_ALWAYS, "%s", Req.szMsg);
+
+
+
+    /*
      * Done.
      */
