Index: c/src/lib/libbsp/shared/clockdrv_shell.h
===================================================================
--- c/src/lib/libbsp/shared/clockdrv_shell.h	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ c/src/lib/libbsp/shared/clockdrv_shell.h	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -74,6 +74,9 @@
     do {
       rtems_clock_tick();
-    } while ( _Thread_Executing == _Thread_Idle &&
-            _Thread_Heir == _Thread_Executing);
+    } while (
+      _Thread_Heir == _Thread_Executing
+        && _Thread_Executing->Start.entry_point
+          == rtems_configuration_get_idle_task()
+    );
 
     Clock_driver_support_at_tick();
Index: c/src/lib/libcpu/bfin/clock/clock.c
===================================================================
--- c/src/lib/libcpu/bfin/clock/clock.c	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ c/src/lib/libcpu/bfin/clock/clock.c	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -40,6 +40,9 @@
   do {
     rtems_clock_tick();
-  } while (_Thread_Executing == _Thread_Idle &&
-           _Thread_Heir == _Thread_Executing);
+  } while (
+    _Thread_Heir == _Thread_Executing
+      && _Thread_Executing->Start.entry_point
+        == rtems_configuration_get_idle_task()
+  );
 #else
   rtems_clock_tick();
Index: c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
===================================================================
--- c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -99,6 +99,9 @@
     do {
       rtems_clock_tick();
-    } while ( _Thread_Executing == _Thread_Idle &&
-              _Thread_Heir == _Thread_Executing);
+    } while (
+      _Thread_Heir == _Thread_Executing
+        && _Thread_Executing->Start.entry_point
+          == rtems_configuration_get_idle_task()
+    );
 
   #else
Index: cpukit/sapi/src/exinit.c
===================================================================
--- cpukit/sapi/src/exinit.c	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ cpukit/sapi/src/exinit.c	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -238,6 +238,6 @@
    *******************************************************************
    *******************************************************************/
-  
-  status = _Per_CPU_Information[0].idle->Wait.return_code;
+
+  status = _Thread_Get_global_exit_status();
   rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, status );
 }
Index: cpukit/sapi/src/exshutdown.c
===================================================================
--- cpukit/sapi/src/exshutdown.c	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ cpukit/sapi/src/exshutdown.c	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -45,6 +45,5 @@
     #endif
 
-    _Per_CPU_Information[0].idle->Wait.return_code = result;
-
+    _Thread_Set_global_exit_status( result );
     _System_state_Set( SYSTEM_STATE_SHUTDOWN );
     _Thread_Stop_multitasking();
Index: cpukit/score/include/rtems/score/percpu.h
===================================================================
--- cpukit/score/include/rtems/score/percpu.h	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ cpukit/score/include/rtems/score/percpu.h	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -163,7 +163,4 @@
   Thread_Control *heir;
 
-  /** This is the idle thread for this CPU. */
-  Thread_Control *idle;
-
   /** This is the time of the last context switch on this CPU. */
   Timestamp_Control time_of_last_context_switch;
@@ -284,6 +281,4 @@
 #define _Thread_Executing \
   _Per_CPU_Information[bsp_smp_processor_id()].executing
-#define _Thread_Idle \
-  _Per_CPU_Information[bsp_smp_processor_id()].idle
 #define _ISR_Nest_level \
   _Per_CPU_Information[bsp_smp_processor_id()].isr_nest_level
Index: cpukit/score/inline/rtems/score/thread.inl
===================================================================
--- cpukit/score/inline/rtems/score/thread.inl	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ cpukit/score/inline/rtems/score/thread.inl	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -345,4 +345,22 @@
 }
 
+RTEMS_INLINE_ROUTINE void _Thread_Set_global_exit_status(
+  uint32_t exit_status
+)
+{
+  Thread_Control *idle = (Thread_Control *)
+    _Thread_Internal_information.local_table[ 1 ];
+
+  idle->Wait.return_code = exit_status;
+}
+
+RTEMS_INLINE_ROUTINE uint32_t _Thread_Get_global_exit_status( void )
+{
+  const Thread_Control *idle = (const Thread_Control *)
+    _Thread_Internal_information.local_table[ 1 ];
+
+  return idle->Wait.return_code;
+}
+
 /**
  * This routine returns the C library re-enterant pointer.
Index: cpukit/score/src/threadcreateidle.c
===================================================================
--- cpukit/score/src/threadcreateidle.c	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ cpukit/score/src/threadcreateidle.c	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -41,7 +41,9 @@
 )
 {
-  Objects_Name    name;
-  Thread_Control *idle;
+  Per_CPU_Control *per_cpu;
+  Objects_Name     name;
+  Thread_Control  *idle;
 
+  per_cpu = &_Per_CPU_Information[ cpu ];
   name.name_u32 = name_u32;
 
@@ -80,7 +82,6 @@
    *             MUST be done before _Thread_Start is invoked.
    */
-  _Per_CPU_Information[ cpu ].idle      =
-  _Per_CPU_Information[ cpu ].heir      =
-  _Per_CPU_Information[ cpu ].executing = idle;
+  per_cpu->heir      =
+  per_cpu->executing = idle;
 
   _Thread_Start(
Index: testsuites/sptests/spsimplesched02/init.c
===================================================================
--- testsuites/sptests/spsimplesched02/init.c	(revision 17e09f8e0b00d23a75727558acc5403c42b8f0e8)
+++ testsuites/sptests/spsimplesched02/init.c	(revision e3be6915989d79a8797b775974f501a359226319)
@@ -22,4 +22,5 @@
  *  Keep the names and IDs in global variables so another task can use them.
  */
+rtems_id   Idle_id;
 rtems_id   Task_id[ 3 ];         /* array of task ids */
 rtems_name Task_name[ 3 ];       /* array of task names */
@@ -49,5 +50,5 @@
   if (suspendIdle) {
     puts( "INIT - Suspend Idle Task");
-    status = rtems_task_suspend( _Thread_Idle->Object.id );
+    status = rtems_task_suspend( Idle_id );
     directive_failed( status, "rtems_task_suspend idle" );
   }
@@ -63,5 +64,5 @@
   if (suspendIdle) {
     puts( "INIT - Resume Idle Task");
-    status = rtems_task_resume( _Thread_Idle->Object.id );
+    status = rtems_task_resume( Idle_id );
     directive_failed( status, "rtems_task_resume idle" );
   }
@@ -75,4 +76,12 @@
 
   puts( "\n\n*** SIMPLE SCHEDULER 02 TEST ***" );
+
+  status = _Objects_Name_to_id_u32(
+    &_Thread_Internal_information,
+    rtems_build_name( 'I', 'D', 'L', 'E' ),
+    RTEMS_SEARCH_LOCAL_NODE,
+    &Idle_id
+  );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
 
   /*
