Index: cpukit/score/include/rtems/score/schedulersmpimpl.h
===================================================================
--- cpukit/score/include/rtems/score/schedulersmpimpl.h	(revision e9ee2f034d6419ce893fe8f66d9fdf96f37b0665)
+++ cpukit/score/include/rtems/score/schedulersmpimpl.h	(revision 3730a07fac4c66e9f01c4c620fec33b93a3aff3b)
@@ -315,21 +315,28 @@
 
 typedef Thread_Control *( *Scheduler_SMP_Get_highest_ready )(
-  Scheduler_SMP_Context *self
+  Scheduler_Context *context
 );
 
 typedef void ( *Scheduler_SMP_Extract )(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread
 );
 
 typedef void ( *Scheduler_SMP_Insert )(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread_to_insert
 );
 
 typedef void ( *Scheduler_SMP_Move )(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread_to_move
 );
+
+static inline Scheduler_SMP_Context *_Scheduler_SMP_Get_self(
+  Scheduler_Context *context
+)
+{
+  return (Scheduler_SMP_Context *) context;
+}
 
 static inline void _Scheduler_SMP_Initialize(
@@ -473,5 +480,5 @@
  */
 static inline void _Scheduler_SMP_Enqueue_ordered(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread,
   Chain_Node_order order,
@@ -483,8 +490,9 @@
 )
 {
+  Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context );
   Scheduler_SMP_Node *node = _Scheduler_SMP_Node_get( thread );
 
   if ( node->state == SCHEDULER_SMP_NODE_IN_THE_AIR ) {
-    Thread_Control *highest_ready = ( *get_highest_ready )( self );
+    Thread_Control *highest_ready = ( *get_highest_ready )( &self->Base );
 
     /*
@@ -500,12 +508,13 @@
       _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_READY );
       _Scheduler_SMP_Allocate_processor( self, highest_ready, thread );
-      ( *insert_ready )( self, thread );
-      ( *move_from_ready_to_scheduled )( self, highest_ready );
+      ( *insert_ready )( &self->Base, thread );
+      ( *move_from_ready_to_scheduled )( &self->Base, highest_ready );
     } else {
       _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_SCHEDULED );
-      ( *insert_scheduled )( self, thread );
+      ( *insert_scheduled )( &self->Base, thread );
     }
   } else {
-    Thread_Control *lowest_scheduled = _Scheduler_SMP_Get_lowest_scheduled( self );
+    Thread_Control *lowest_scheduled =
+      _Scheduler_SMP_Get_lowest_scheduled( self );
 
     /*
@@ -525,9 +534,9 @@
       );
       _Scheduler_SMP_Allocate_processor( self, thread, lowest_scheduled );
-      ( *insert_scheduled )( self, thread );
-      ( *move_from_scheduled_to_ready )( self, lowest_scheduled );
+      ( *insert_scheduled )( &self->Base, thread );
+      ( *move_from_scheduled_to_ready )( &self->Base, lowest_scheduled );
     } else {
       _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_READY );
-      ( *insert_ready )( self, thread );
+      ( *insert_ready )( &self->Base, thread );
     }
   }
@@ -535,5 +544,5 @@
 
 static inline void _Scheduler_SMP_Schedule_highest_ready(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *victim,
   Scheduler_SMP_Get_highest_ready get_highest_ready,
@@ -541,9 +550,10 @@
 )
 {
-  Thread_Control *highest_ready = ( *get_highest_ready )( self );
+  Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context );
+  Thread_Control *highest_ready = ( *get_highest_ready )( &self->Base );
 
   _Scheduler_SMP_Allocate_processor( self, highest_ready, victim );
 
-  ( *move_from_ready_to_scheduled )( self, highest_ready );
+  ( *move_from_ready_to_scheduled )( &self->Base, highest_ready );
 }
 
@@ -558,5 +568,5 @@
  */
 static inline void _Scheduler_SMP_Schedule(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread,
   Scheduler_SMP_Get_highest_ready get_highest_ready,
@@ -570,5 +580,5 @@
 
     _Scheduler_SMP_Schedule_highest_ready(
-      self,
+      context,
       thread,
       get_highest_ready,
@@ -579,5 +589,5 @@
 
 static inline void _Scheduler_SMP_Block(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread,
   Scheduler_SMP_Extract extract,
@@ -586,8 +596,8 @@
 )
 {
-  ( *extract )( self, thread );
+  ( *extract )( context, thread );
 
   _Scheduler_SMP_Schedule(
-    self,
+    context,
     thread,
     get_highest_ready,
@@ -605,17 +615,19 @@
  */
 static inline void _Scheduler_SMP_Extract(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread,
   Scheduler_SMP_Extract extract
 )
 {
-  ( *extract )( self, thread );
+  ( *extract )( context, thread );
 }
 
 static inline void _Scheduler_SMP_Insert_scheduled_lifo(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread
 )
 {
+  Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context );
+
   _Chain_Insert_ordered_unprotected(
     &self->Scheduled,
@@ -626,8 +638,10 @@
 
 static inline void _Scheduler_SMP_Insert_scheduled_fifo(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread
 )
 {
+  Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context );
+
   _Chain_Insert_ordered_unprotected(
     &self->Scheduled,
@@ -638,9 +652,10 @@
 
 static inline void _Scheduler_SMP_Start_idle(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread,
   Per_CPU_Control *cpu
 )
 {
+  Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context );
   Scheduler_SMP_Node *node = _Scheduler_SMP_Node_get( thread );
 
Index: cpukit/score/src/schedulerprioritysmp.c
===================================================================
--- cpukit/score/src/schedulerprioritysmp.c	(revision e9ee2f034d6419ce893fe8f66d9fdf96f37b0665)
+++ cpukit/score/src/schedulerprioritysmp.c	(revision 3730a07fac4c66e9f01c4c620fec33b93a3aff3b)
@@ -37,9 +37,7 @@
 
 static Scheduler_priority_SMP_Context *
-_Scheduler_priority_SMP_Self_from_SMP_base( Scheduler_SMP_Context *smp_base )
-{
-  return (Scheduler_priority_SMP_Context *)
-    ( (char *) smp_base
-      - offsetof( Scheduler_priority_SMP_Context, Base ) );
+_Scheduler_priority_SMP_Get_self( Scheduler_Context *context )
+{
+  return (Scheduler_priority_SMP_Context *) context;
 }
 
@@ -92,9 +90,9 @@
 
 static Thread_Control *_Scheduler_priority_SMP_Get_highest_ready(
-  Scheduler_SMP_Context *smp_base
-)
-{
-  Scheduler_priority_SMP_Context *self =
-    _Scheduler_priority_SMP_Self_from_SMP_base( smp_base );
+  Scheduler_Context *context
+)
+{
+  Scheduler_priority_SMP_Context *self =
+    _Scheduler_priority_SMP_Get_self( context );
   Thread_Control *highest_ready = NULL;
 
@@ -110,10 +108,10 @@
 
 static void _Scheduler_priority_SMP_Move_from_scheduled_to_ready(
-  Scheduler_SMP_Context *smp_base,
+  Scheduler_Context *context,
   Thread_Control *scheduled_to_ready
 )
 {
   Scheduler_priority_SMP_Context *self =
-    _Scheduler_priority_SMP_Self_from_SMP_base( smp_base );
+    _Scheduler_priority_SMP_Get_self( context );
   Scheduler_priority_SMP_Node *node =
     _Scheduler_priority_SMP_Node_get( scheduled_to_ready );
@@ -128,10 +126,10 @@
 
 static void _Scheduler_priority_SMP_Move_from_ready_to_scheduled(
-  Scheduler_SMP_Context *smp_base,
+  Scheduler_Context *context,
   Thread_Control *ready_to_scheduled
 )
 {
   Scheduler_priority_SMP_Context *self =
-    _Scheduler_priority_SMP_Self_from_SMP_base( smp_base );
+    _Scheduler_priority_SMP_Get_self( context );
   Scheduler_priority_SMP_Node *node =
     _Scheduler_priority_SMP_Node_get( ready_to_scheduled );
@@ -149,10 +147,10 @@
 
 static void _Scheduler_priority_SMP_Insert_ready_lifo(
-  Scheduler_SMP_Context *smp_base,
-  Thread_Control *thread
-)
-{
-  Scheduler_priority_SMP_Context *self =
-    _Scheduler_priority_SMP_Self_from_SMP_base( smp_base );
+  Scheduler_Context *context,
+  Thread_Control *thread
+)
+{
+  Scheduler_priority_SMP_Context *self =
+    _Scheduler_priority_SMP_Get_self( context );
   Scheduler_priority_SMP_Node *node =
     _Scheduler_priority_SMP_Node_get( thread );
@@ -166,10 +164,10 @@
 
 static void _Scheduler_priority_SMP_Insert_ready_fifo(
-  Scheduler_SMP_Context *smp_base,
-  Thread_Control *thread
-)
-{
-  Scheduler_priority_SMP_Context *self =
-    _Scheduler_priority_SMP_Self_from_SMP_base( smp_base );
+  Scheduler_Context *context,
+  Thread_Control *thread
+)
+{
+  Scheduler_priority_SMP_Context *self =
+    _Scheduler_priority_SMP_Get_self( context );
   Scheduler_priority_SMP_Node *node =
     _Scheduler_priority_SMP_Node_get( thread );
@@ -183,10 +181,10 @@
 
 static void _Scheduler_priority_SMP_Do_extract(
-  Scheduler_SMP_Context *smp_base,
-  Thread_Control *thread
-)
-{
-  Scheduler_priority_SMP_Context *self =
-    _Scheduler_priority_SMP_Self_from_SMP_base( smp_base );
+  Scheduler_Context *context,
+  Thread_Control *thread
+)
+{
+  Scheduler_priority_SMP_Context *self =
+    _Scheduler_priority_SMP_Get_self( context );
   Scheduler_priority_SMP_Node *node =
     _Scheduler_priority_SMP_Node_get( thread );
@@ -220,5 +218,5 @@
 
   _Scheduler_SMP_Block(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_priority_SMP_Do_extract,
@@ -229,5 +227,5 @@
 
 static void _Scheduler_priority_SMP_Enqueue_ordered(
-  Scheduler_SMP_Context *self,
+  Scheduler_Context *context,
   Thread_Control *thread,
   Chain_Node_order order,
@@ -237,5 +235,5 @@
 {
   _Scheduler_SMP_Enqueue_ordered(
-    self,
+    context,
     thread,
     order,
@@ -257,5 +255,5 @@
 
   _Scheduler_priority_SMP_Enqueue_ordered(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_simple_Insert_priority_lifo_order,
@@ -274,5 +272,5 @@
 
   _Scheduler_priority_SMP_Enqueue_ordered(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_simple_Insert_priority_fifo_order,
@@ -291,5 +289,5 @@
 
   _Scheduler_SMP_Extract(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_priority_SMP_Do_extract
@@ -321,5 +319,5 @@
 
   _Scheduler_SMP_Schedule(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_priority_SMP_Get_highest_ready,
@@ -337,4 +335,4 @@
     _Scheduler_priority_SMP_Get_context( scheduler );
 
-  _Scheduler_SMP_Start_idle( &self->Base, thread, cpu );
-}
+  _Scheduler_SMP_Start_idle( &self->Base.Base, thread, cpu );
+}
Index: cpukit/score/src/schedulersimplesmp.c
===================================================================
--- cpukit/score/src/schedulersimplesmp.c	(revision e9ee2f034d6419ce893fe8f66d9fdf96f37b0665)
+++ cpukit/score/src/schedulersimplesmp.c	(revision 3730a07fac4c66e9f01c4c620fec33b93a3aff3b)
@@ -30,8 +30,7 @@
 
 static Scheduler_simple_SMP_Context *
-_Scheduler_simple_SMP_Self_from_SMP_base( Scheduler_SMP_Context *smp_base )
-{
-  return (Scheduler_simple_SMP_Context *)
-    ( (char *) smp_base - offsetof( Scheduler_simple_SMP_Context, Base ) );
+_Scheduler_simple_SMP_Get_self( Scheduler_Context *context )
+{
+  return (Scheduler_simple_SMP_Context *) context;
 }
 
@@ -58,9 +57,9 @@
 
 static Thread_Control *_Scheduler_simple_SMP_Get_highest_ready(
-  Scheduler_SMP_Context *smp_base
-)
-{
-  Scheduler_simple_SMP_Context *self =
-    _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
+  Scheduler_Context *context
+)
+{
+  Scheduler_simple_SMP_Context *self =
+    _Scheduler_simple_SMP_Get_self( context );
   Thread_Control *highest_ready = NULL;
   Chain_Control *ready = &self->Ready;
@@ -74,10 +73,10 @@
 
 static void _Scheduler_simple_SMP_Move_from_scheduled_to_ready(
-  Scheduler_SMP_Context *smp_base,
+  Scheduler_Context *context,
   Thread_Control *scheduled_to_ready
 )
 {
   Scheduler_simple_SMP_Context *self =
-    _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
+    _Scheduler_simple_SMP_Get_self( context );
 
   _Chain_Extract_unprotected( &scheduled_to_ready->Object.Node );
@@ -89,11 +88,14 @@
 
 static void _Scheduler_simple_SMP_Move_from_ready_to_scheduled(
-  Scheduler_SMP_Context *smp_base,
+  Scheduler_Context *context,
   Thread_Control *ready_to_scheduled
 )
 {
+  Scheduler_simple_SMP_Context *self =
+    _Scheduler_simple_SMP_Get_self( context );
+
   _Chain_Extract_unprotected( &ready_to_scheduled->Object.Node );
   _Scheduler_simple_Insert_priority_fifo(
-    &smp_base->Scheduled,
+    &self->Base.Scheduled,
     ready_to_scheduled
   );
@@ -101,10 +103,10 @@
 
 static void _Scheduler_simple_SMP_Insert_ready_lifo(
-  Scheduler_SMP_Context *smp_base,
-  Thread_Control *thread
-)
-{
-  Scheduler_simple_SMP_Context *self =
-    _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
+  Scheduler_Context *context,
+  Thread_Control *thread
+)
+{
+  Scheduler_simple_SMP_Context *self =
+    _Scheduler_simple_SMP_Get_self( context );
 
   _Chain_Insert_ordered_unprotected(
@@ -116,10 +118,10 @@
 
 static void _Scheduler_simple_SMP_Insert_ready_fifo(
-  Scheduler_SMP_Context *smp_base,
-  Thread_Control *thread
-)
-{
-  Scheduler_simple_SMP_Context *self =
-    _Scheduler_simple_SMP_Self_from_SMP_base( smp_base );
+  Scheduler_Context *context,
+  Thread_Control *thread
+)
+{
+  Scheduler_simple_SMP_Context *self =
+    _Scheduler_simple_SMP_Get_self( context );
 
   _Chain_Insert_ordered_unprotected(
@@ -131,5 +133,5 @@
 
 static void _Scheduler_simple_SMP_Do_extract(
-  Scheduler_SMP_Context *smp_base,
+  Scheduler_Context *context,
   Thread_Control *thread
 )
@@ -137,5 +139,5 @@
   Scheduler_SMP_Node *node = _Scheduler_SMP_Node_get( thread );
 
-  (void) smp_base;
+  (void) context;
 
   if ( node->state == SCHEDULER_SMP_NODE_SCHEDULED ) {
@@ -157,5 +159,5 @@
 
   _Scheduler_SMP_Block(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_simple_SMP_Do_extract,
@@ -166,5 +168,5 @@
 
 static void _Scheduler_simple_SMP_Enqueue_ordered(
-  Scheduler_SMP_Context *smp_base,
+  Scheduler_Context *context,
   Thread_Control *thread,
   Chain_Node_order order,
@@ -174,5 +176,5 @@
 {
   _Scheduler_SMP_Enqueue_ordered(
-    smp_base,
+    context,
     thread,
     order,
@@ -194,5 +196,5 @@
 
   _Scheduler_simple_SMP_Enqueue_ordered(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_simple_Insert_priority_lifo_order,
@@ -211,5 +213,5 @@
 
   _Scheduler_simple_SMP_Enqueue_ordered(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_simple_Insert_priority_fifo_order,
@@ -228,5 +230,5 @@
 
   _Scheduler_SMP_Extract(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_simple_SMP_Do_extract
@@ -258,5 +260,5 @@
 
   _Scheduler_SMP_Schedule(
-    &self->Base,
+    &self->Base.Base,
     thread,
     _Scheduler_simple_SMP_Get_highest_ready,
@@ -274,4 +276,4 @@
     _Scheduler_simple_SMP_Get_context( scheduler );
 
-  _Scheduler_SMP_Start_idle( &self->Base, thread, cpu );
-}
+  _Scheduler_SMP_Start_idle( &self->Base.Base, thread, cpu );
+}
