Index: cpukit/include/rtems/score/threadimpl.h
===================================================================
--- cpukit/include/rtems/score/threadimpl.h	(revision b9083c5597d4130c23549fba66bd83d02663f463)
+++ cpukit/include/rtems/score/threadimpl.h	(revision 73ebf9a27ed5cd0fd3e0dc0da98345d7faa610a2)
@@ -272,17 +272,4 @@
 
 /**
- * @brief Restarts the currently executing thread.
- *
- * @param[in, out] executing The currently executing thread.
- * @param entry The start entry information for @a executing.
- * @param lock_context The lock context.
- */
-RTEMS_NO_RETURN void _Thread_Restart_self(
-  Thread_Control                 *executing,
-  const Thread_Entry_information *entry,
-  ISR_lock_Context               *lock_context
-);
-
-/**
  * @brief Restarts the thread.
  *
@@ -297,5 +284,5 @@
  * @retval STATUS_INCORRECT_STATE The thread was dormant.
  */
-Status_Control _Thread_Restart_other(
+Status_Control _Thread_Restart(
   Thread_Control                 *the_thread,
   const Thread_Entry_information *entry,
Index: cpukit/rtems/src/taskrestart.c
===================================================================
--- cpukit/rtems/src/taskrestart.c	(revision b9083c5597d4130c23549fba66bd83d02663f463)
+++ cpukit/rtems/src/taskrestart.c	(revision 73ebf9a27ed5cd0fd3e0dc0da98345d7faa610a2)
@@ -49,11 +49,5 @@
   entry = the_thread->Start.Entry;
   entry.Kinds.Numeric.argument = argument;
-
-  if ( the_thread == _Thread_Executing ) {
-    _Thread_Restart_self( the_thread, &entry, &lock_context );
-    RTEMS_UNREACHABLE();
-  }
-
-  status = _Thread_Restart_other( the_thread, &entry, &lock_context );
+  status = _Thread_Restart( the_thread, &entry, &lock_context );
 
   return _Status_Get( status );
Index: cpukit/score/src/threadrestart.c
===================================================================
--- cpukit/score/src/threadrestart.c	(revision b9083c5597d4130c23549fba66bd83d02663f463)
+++ cpukit/score/src/threadrestart.c	(revision 73ebf9a27ed5cd0fd3e0dc0da98345d7faa610a2)
@@ -6,6 +6,5 @@
  * @brief This source file contains the implementation of _Thread_Cancel(),
  *   _Thread_Change_life(), _Thread_Close(), _Thread_Exit(), _Thread_Join(),
- *   _Thread_Kill_zombies(), _Thread_Restart_other(), _Thread_Restart_self(),
- *   and _Thread_Set_life_protection().
+ *   _Thread_Kill_zombies(), _Thread_Restart(), and _Thread_Set_life_protection().
  */
 
@@ -518,5 +517,5 @@
 }
 
-Status_Control _Thread_Restart_other(
+Status_Control _Thread_Restart(
   Thread_Control                 *the_thread,
   const Thread_Entry_information *entry,
@@ -526,4 +525,5 @@
   Thread_Life_state    previous;
   Per_CPU_Control     *cpu_self;
+  Thread_Life_state    ignored_life_states;
   Thread_queue_Context queue_context;
 
@@ -533,4 +533,15 @@
     _Thread_State_release( the_thread, lock_context );
     return STATUS_INCORRECT_STATE;
+  }
+
+  cpu_self = _Thread_Dispatch_disable_critical( lock_context );
+
+  if (
+    the_thread == _Per_CPU_Get_executing( cpu_self ) &&
+    !_ISR_Is_in_progress()
+  ) {
+    ignored_life_states = THREAD_LIFE_PROTECTED | THREAD_LIFE_CHANGE_DEFERRED;
+  } else {
+    ignored_life_states = 0;
   }
 
@@ -540,8 +551,6 @@
     0,
     THREAD_LIFE_RESTARTING,
-    0
-  );
-
-  cpu_self = _Thread_Dispatch_disable_critical( lock_context );
+    ignored_life_states
+  );
 
   if ( _Thread_Is_life_change_allowed( previous ) ) {
@@ -574,51 +583,4 @@
 }
 
-void _Thread_Restart_self(
-  Thread_Control                 *executing,
-  const Thread_Entry_information *entry,
-  ISR_lock_Context               *lock_context
-)
-{
-  Per_CPU_Control      *cpu_self;
-  Thread_queue_Context  queue_context;
-
-  _Assert(
-    _Watchdog_Get_state( &executing->Timer.Watchdog ) == WATCHDOG_INACTIVE
-  );
-  _Assert(
-    executing->current_state == STATES_READY
-      || executing->current_state == STATES_SUSPENDED
-  );
-
-  _Thread_queue_Context_initialize( &queue_context );
-  _Thread_queue_Context_clear_priority_updates( &queue_context );
-  _Thread_State_acquire_critical( executing, lock_context );
-
-  executing->Start.Entry = *entry;
-  _Thread_Change_life_locked(
-    executing,
-    0,
-    THREAD_LIFE_RESTARTING,
-    THREAD_LIFE_PROTECTED | THREAD_LIFE_CHANGE_DEFERRED
-  );
-
-  cpu_self = _Thread_Dispatch_disable_critical( lock_context );
-  _Thread_State_release( executing, lock_context );
-
-  _Thread_Wait_acquire_default( executing, lock_context );
-  _Thread_Priority_change(
-    executing,
-    &executing->Real_priority,
-    executing->Start.initial_priority,
-    false,
-    &queue_context
-  );
-  _Thread_Wait_release_default( executing, lock_context );
-
-  _Thread_Priority_update( &queue_context );
-  _Thread_Dispatch_direct_no_return( cpu_self );
-  RTEMS_UNREACHABLE();
-}
-
 Thread_Life_state _Thread_Change_life(
   Thread_Life_state clear,
