Index: cpukit/score/src/threadrestart.c
===================================================================
--- cpukit/score/src/threadrestart.c	(revision c8e832886ab97111af01b9271dfb746a45254b23)
+++ cpukit/score/src/threadrestart.c	(revision 82f907430887607180211c2eba06c03ae0f175e0)
@@ -374,6 +374,4 @@
     _Thread_Disable_dispatch();
     _Thread_Enable_dispatch();
-
-    _Assert_Not_reached();
   }
 #endif
@@ -386,6 +384,4 @@
     _Thread_Start_life_change_for_executing( executing );
     _Thread_Enable_dispatch();
-
-    _Assert_Not_reached();
   }
 
Index: testsuites/smptests/smpthreadlife01/init.c
===================================================================
--- testsuites/smptests/smpthreadlife01/init.c	(revision c8e832886ab97111af01b9271dfb746a45254b23)
+++ testsuites/smptests/smpthreadlife01/init.c	(revision 82f907430887607180211c2eba06c03ae0f175e0)
@@ -183,5 +183,5 @@
 }
 
-static void delay_ipi_task(rtems_task_argument arg)
+static void delay_ipi_task(rtems_task_argument variant)
 {
   test_context *ctx = &test_instance;
@@ -199,10 +199,22 @@
   rtems_counter_delay_nanoseconds(100000000);
 
-  /* We get deleted as a side effect of enabling the thread life protection */
+  if (variant != 0) {
+    _Thread_Disable_dispatch();
+  }
+
+  /*
+   * We get deleted as a side effect of enabling the thread life protection or
+   * later if we enable the thread dispatching.
+   */
   _Thread_Set_life_protection(true);
+
+  if (variant != 0) {
+    _Thread_Enable_dispatch();
+  }
+
   rtems_test_assert(0);
 }
 
-static void test_set_life_protection(void)
+static void test_set_life_protection(rtems_task_argument variant)
 {
   test_context *ctx = &test_instance;
@@ -223,5 +235,5 @@
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
-  sc = rtems_task_start(id, delay_ipi_task, 0);
+  sc = rtems_task_start(id, delay_ipi_task, variant);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
@@ -302,5 +314,6 @@
     test_restart();
     test_delete();
-    test_set_life_protection();
+    test_set_life_protection(0);
+    test_set_life_protection(1);
     test_wait_for_execution_stop();
   }
Index: testsuites/sptests/spthreadlife01/init.c
===================================================================
--- testsuites/sptests/spthreadlife01/init.c	(revision c8e832886ab97111af01b9271dfb746a45254b23)
+++ testsuites/sptests/spthreadlife01/init.c	(revision 82f907430887607180211c2eba06c03ae0f175e0)
@@ -19,4 +19,6 @@
 #include <rtems.h>
 #include <rtems/libcsupport.h>
+
+#include <rtems/score/threadimpl.h>
 
 #include "tmacros.h"
@@ -49,4 +51,10 @@
   DELETE_2,
   DELETE_3,
+  SET_PROTECTION,
+  SET_PROTECTION_DONE,
+  CLEAR_PROTECTION,
+  DELETE_4,
+  DELETE_5,
+  DELETE_6,
   INVALID
 } test_state;
@@ -158,6 +166,15 @@
   assert_priority(PRIO_INIT);
 
-  rtems_test_assert(ctx->current == DELETE_2);
-  ctx->current = DELETE_3;
+  switch (ctx->current) {
+    case DELETE_2:
+      ctx->current = DELETE_3;
+      break;
+    case DELETE_5:
+      ctx->current = DELETE_6;
+      break;
+    default:
+      rtems_test_assert(0);
+      break;
+  }
 }
 
@@ -180,4 +197,7 @@
       ctx->current = DELETE_2;
       break;
+    case DELETE_4:
+      ctx->current = DELETE_5;
+      break;
     default:
       rtems_test_assert(0);
@@ -193,4 +213,5 @@
     test_state state = ctx->current;
     rtems_status_code sc;
+    bool previous_thread_life_protection;
 
     switch (state) {
@@ -232,4 +253,17 @@
         assert_priority(PRIO_HIGH);
         break;
+      case SET_PROTECTION:
+        _Thread_Disable_dispatch();
+        previous_thread_life_protection = _Thread_Set_life_protection(true);
+        rtems_test_assert(!previous_thread_life_protection);
+        _Thread_Enable_dispatch();
+        break;
+      case CLEAR_PROTECTION:
+        _Thread_Disable_dispatch();
+        previous_thread_life_protection = _Thread_Set_life_protection(false);
+        rtems_test_assert(previous_thread_life_protection);
+        ctx->current = DELETE_4;
+        _Thread_Enable_dispatch();
+        break;
       default:
         rtems_test_assert(0);
@@ -256,15 +290,7 @@
 }
 
-static void test(void)
-{
-  test_context *ctx = &test_instance;
-  rtems_status_code sc;
-  rtems_resource_snapshot snapshot;
-
-  ctx->main_task_id = rtems_task_self();
-
-  rtems_resource_snapshot_take(&snapshot);
-
-  create_sema(ctx);
+static void create_and_start_worker(test_context *ctx)
+{
+  rtems_status_code sc;
 
   sc = rtems_task_create(
@@ -280,4 +306,18 @@
   sc = rtems_task_start(ctx->worker_task_id, worker_task, 0);
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void test(void)
+{
+  test_context *ctx = &test_instance;
+  rtems_status_code sc;
+  rtems_resource_snapshot snapshot;
+
+  ctx->main_task_id = rtems_task_self();
+
+  rtems_resource_snapshot_take(&snapshot);
+
+  create_sema(ctx);
+  create_and_start_worker(ctx);
 
   change_state_and_wait(ctx, INIT, SET_PRIO, SET_PRIO_DONE);
@@ -317,5 +357,15 @@
   rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
 
-  rtems_test_assert(ctx->current == DELETE_3);
+  create_and_start_worker(ctx);
+
+  change_state_and_wait(ctx, DELETE_3, SET_PROTECTION, SET_PROTECTION_DONE);
+  change_state(ctx, SET_PROTECTION_DONE, CLEAR_PROTECTION, INVALID);
+
+  sc = rtems_task_delete(ctx->worker_task_id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
+
+  rtems_test_assert(ctx->current == DELETE_6);
 }
 
