Index: c/src/exec/rtems/src/mp.c
===================================================================
--- c/src/exec/rtems/src/mp.c	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ c/src/exec/rtems/src/mp.c	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -56,5 +56,11 @@
 void rtems_multiprocessing_announce ( void )
 {
-  _Thread_MP_Ready();
+  _Thread_Disable_dispatch();
+  _Event_sets_Post(
+    RTEMS_EVENT_0,
+    &_Internal_threads_System_initialization_thread->pending_events
+  );
+  _Event_Surrender( _Internal_threads_System_initialization_thread );
+  _Thread_Enable_dispatch();
 }
 
@@ -65,4 +71,17 @@
  */
 
+typedef void (*packet_processor)( rtems_packet_prefix * );
+
+packet_processor _Multiprocessor_Packet_processors[] = {
+  _Internal_threads_MP_Process_packet, /* RTEMS_MP_PACKET_INTERNAL_THREADS */
+  _RTEMS_tasks_MP_Process_packet,      /* RTEMS_MP_PACKET_TASKS */
+  _Message_queue_MP_Process_packet,    /* RTEMS_MP_PACKET_MESSAGE_QUEUE */
+  _Semaphore_MP_Process_packet,        /* RTEMS_MP_PACKET_SEMAPHORE */
+  _Partition_MP_Process_packet,        /* RTEMS_MP_PACKET_PARTITION */
+  0,                                   /* RTEMS_MP_PACKET_REGION */
+  _Event_MP_Process_packet,            /* RTEMS_MP_PACKET_EVENT */
+  _Signal_MP_Process_packet            /* RTEMS_MP_PACKET_SIGNAL */
+};
+
 Thread _Multiprocessing_Receive_server (
   Thread_Argument ignored
@@ -71,55 +90,67 @@
 
   rtems_packet_prefix *the_packet;
-
-  _Thread_Dispatch_disable_level = 1;
+  packet_processor     the_function;
 
   for ( ; ; ) {
 
-    _Internal_threads_System_initialization_thread->Notepads[ 0 ] = 1;
+    _Thread_Disable_dispatch();
+    _Event_Seize( RTEMS_EVENT_0, RTEMS_DEFAULT_OPTIONS, RTEMS_NO_TIMEOUT );
+    _Thread_Enable_dispatch();
 
-    the_packet = _MPCI_Receive_packet();
+    for ( ; ; ) {
+      the_packet = _MPCI_Receive_packet();
 
-    if ( ! the_packet ) {
-      _Thread_MP_Block();
-      _Thread_Dispatch_disable_level = 1;
-    }
-    else {
+      if ( !the_packet ) 
+        break;
 
       _Thread_Executing->receive_packet = the_packet;
 
+      if ( !_Mp_packet_Is_valid_packet_class ( the_packet->the_class ) )
+        break;
+
+      the_function = _Multiprocessor_Packet_processors[ the_packet->the_class ];
+    
+      if ( !the_function )
+        break;
+
+      (*the_function)( the_packet );
+#if 0
       switch ( the_packet->the_class ) {
-
+ 
         case RTEMS_MP_PACKET_INTERNAL_THREADS:
           _Internal_threads_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_TASKS:
           _RTEMS_tasks_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_MESSAGE_QUEUE:
           _Message_queue_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_SEMAPHORE:
           _Semaphore_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_PARTITION:
           _Partition_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_REGION:
           /* Global regions are unsupported at this time */
           break;
-
+ 
         case RTEMS_MP_PACKET_EVENT:
           _Event_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_SIGNAL:
           _Signal_MP_Process_packet( the_packet );
           break;
       }
+#endif
+
+
     }
   }
Index: c/src/exec/score/headers/mppkt.h
===================================================================
--- c/src/exec/score/headers/mppkt.h	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ c/src/exec/score/headers/mppkt.h	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -39,5 +39,5 @@
 typedef enum {
   RTEMS_MP_PACKET_INTERNAL_THREADS = 0,
-  RTEMS_MP_PACKET_TASKS      = 1,
+  RTEMS_MP_PACKET_TASKS            = 1,
   RTEMS_MP_PACKET_MESSAGE_QUEUE    = 2,
   RTEMS_MP_PACKET_SEMAPHORE        = 3,
Index: c/src/exec/score/headers/threadmp.h
===================================================================
--- c/src/exec/score/headers/threadmp.h	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ c/src/exec/score/headers/threadmp.h	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -91,24 +91,4 @@
 
 /*
- *  _Thread_MP_Block
- *
- *  DESCRIPTION:
- *
- *  This routine blocks the MP Receive server thread.
- */
-
-void _Thread_MP_Block( void );
-
-/*
- *  _Thread_MP_Ready
- *
- *  DESCRIPTION:
- *
- *  This routine readies the MP Receive server thread.
- */
-
-void _Thread_MP_Ready( void );
-
-/*
  *  The following is used to determine when the multiprocessing receive
  *  thread is executing so that a proxy can be allocated instead of
Index: c/src/exec/score/include/rtems/score/mppkt.h
===================================================================
--- c/src/exec/score/include/rtems/score/mppkt.h	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ c/src/exec/score/include/rtems/score/mppkt.h	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -39,5 +39,5 @@
 typedef enum {
   RTEMS_MP_PACKET_INTERNAL_THREADS = 0,
-  RTEMS_MP_PACKET_TASKS      = 1,
+  RTEMS_MP_PACKET_TASKS            = 1,
   RTEMS_MP_PACKET_MESSAGE_QUEUE    = 2,
   RTEMS_MP_PACKET_SEMAPHORE        = 3,
Index: c/src/exec/score/include/rtems/score/threadmp.h
===================================================================
--- c/src/exec/score/include/rtems/score/threadmp.h	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ c/src/exec/score/include/rtems/score/threadmp.h	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -91,24 +91,4 @@
 
 /*
- *  _Thread_MP_Block
- *
- *  DESCRIPTION:
- *
- *  This routine blocks the MP Receive server thread.
- */
-
-void _Thread_MP_Block( void );
-
-/*
- *  _Thread_MP_Ready
- *
- *  DESCRIPTION:
- *
- *  This routine readies the MP Receive server thread.
- */
-
-void _Thread_MP_Ready( void );
-
-/*
  *  The following is used to determine when the multiprocessing receive
  *  thread is executing so that a proxy can be allocated instead of
Index: c/src/exec/score/src/thread.c
===================================================================
--- c/src/exec/score/src/thread.c	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ c/src/exec/score/src/thread.c	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -317,5 +317,6 @@
       if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
         _Thread_Heir = the_thread;
-        if ( _Modes_Is_preempt( _Thread_Executing->current_modes ) )
+        if ( _Modes_Is_preempt( _Thread_Executing->current_modes ) ||
+             the_thread->current_priority == 0 )
           _Context_Switch_necessary = TRUE;
       }
Index: c/src/exec/score/src/threadmp.c
===================================================================
--- c/src/exec/score/src/threadmp.c	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ c/src/exec/score/src/threadmp.c	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -158,72 +158,2 @@
   return NULL;
 }
-
-/*PAGE
- *
- *  _Thread_MP_Block
- *
- */
-
-void _Thread_MP_Block( void )
-{
-  ISR_Level   level;
-
-  _ISR_Disable( level );
-
-    if ( _Thread_MP_Receive->Notepads[ 0 ] != 0 ) {
-      _Priority_Remove_from_bit_map( &_Thread_MP_Receive->Priority_map );
-
-      _Thread_MP_Receive->current_state = STATES_SUSPENDED;
-
-      _ISR_Flash( level );
-
-      _Thread_Calculate_heir();
-
-      _Context_Switch_necessary = TRUE;
-
-      _ISR_Enable( level );
-
-      _Thread_Dispatch_disable_level = 0;
-
-      _Thread_Dispatch();
-
-      return;
-
-    }
-  _ISR_Enable( level );
-
-}
-
-/*PAGE
- *
- *  _Thread_MP_Ready
- *
- */
-
-void _Thread_MP_Ready( void )
-{
-  ISR_Level   level;
-
-  _ISR_Disable( level );
-
-    if ( _States_Is_suspended( _Thread_MP_Receive->current_state ) ) {
-      _Priority_Add_to_bit_map( &_Thread_MP_Receive->Priority_map );
-
-      _Thread_MP_Receive->current_state = STATES_READY;
-
-      _Thread_Heir = _Thread_MP_Receive;
-
-      _Context_Switch_necessary = TRUE;
-
-      _ISR_Enable( level );
-
-      if ( _Thread_Is_dispatching_enabled() )
-        _Thread_Dispatch();
-
-    } else {
-
-      _Thread_MP_Receive->Notepads[ 0 ] = 0;
-      _ISR_Enable( level );
-
-    }
-}
Index: cpukit/rtems/src/mp.c
===================================================================
--- cpukit/rtems/src/mp.c	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ cpukit/rtems/src/mp.c	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -56,5 +56,11 @@
 void rtems_multiprocessing_announce ( void )
 {
-  _Thread_MP_Ready();
+  _Thread_Disable_dispatch();
+  _Event_sets_Post(
+    RTEMS_EVENT_0,
+    &_Internal_threads_System_initialization_thread->pending_events
+  );
+  _Event_Surrender( _Internal_threads_System_initialization_thread );
+  _Thread_Enable_dispatch();
 }
 
@@ -65,4 +71,17 @@
  */
 
+typedef void (*packet_processor)( rtems_packet_prefix * );
+
+packet_processor _Multiprocessor_Packet_processors[] = {
+  _Internal_threads_MP_Process_packet, /* RTEMS_MP_PACKET_INTERNAL_THREADS */
+  _RTEMS_tasks_MP_Process_packet,      /* RTEMS_MP_PACKET_TASKS */
+  _Message_queue_MP_Process_packet,    /* RTEMS_MP_PACKET_MESSAGE_QUEUE */
+  _Semaphore_MP_Process_packet,        /* RTEMS_MP_PACKET_SEMAPHORE */
+  _Partition_MP_Process_packet,        /* RTEMS_MP_PACKET_PARTITION */
+  0,                                   /* RTEMS_MP_PACKET_REGION */
+  _Event_MP_Process_packet,            /* RTEMS_MP_PACKET_EVENT */
+  _Signal_MP_Process_packet            /* RTEMS_MP_PACKET_SIGNAL */
+};
+
 Thread _Multiprocessing_Receive_server (
   Thread_Argument ignored
@@ -71,55 +90,67 @@
 
   rtems_packet_prefix *the_packet;
-
-  _Thread_Dispatch_disable_level = 1;
+  packet_processor     the_function;
 
   for ( ; ; ) {
 
-    _Internal_threads_System_initialization_thread->Notepads[ 0 ] = 1;
+    _Thread_Disable_dispatch();
+    _Event_Seize( RTEMS_EVENT_0, RTEMS_DEFAULT_OPTIONS, RTEMS_NO_TIMEOUT );
+    _Thread_Enable_dispatch();
 
-    the_packet = _MPCI_Receive_packet();
+    for ( ; ; ) {
+      the_packet = _MPCI_Receive_packet();
 
-    if ( ! the_packet ) {
-      _Thread_MP_Block();
-      _Thread_Dispatch_disable_level = 1;
-    }
-    else {
+      if ( !the_packet ) 
+        break;
 
       _Thread_Executing->receive_packet = the_packet;
 
+      if ( !_Mp_packet_Is_valid_packet_class ( the_packet->the_class ) )
+        break;
+
+      the_function = _Multiprocessor_Packet_processors[ the_packet->the_class ];
+    
+      if ( !the_function )
+        break;
+
+      (*the_function)( the_packet );
+#if 0
       switch ( the_packet->the_class ) {
-
+ 
         case RTEMS_MP_PACKET_INTERNAL_THREADS:
           _Internal_threads_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_TASKS:
           _RTEMS_tasks_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_MESSAGE_QUEUE:
           _Message_queue_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_SEMAPHORE:
           _Semaphore_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_PARTITION:
           _Partition_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_REGION:
           /* Global regions are unsupported at this time */
           break;
-
+ 
         case RTEMS_MP_PACKET_EVENT:
           _Event_MP_Process_packet( the_packet );
           break;
-
+ 
         case RTEMS_MP_PACKET_SIGNAL:
           _Signal_MP_Process_packet( the_packet );
           break;
       }
+#endif
+
+
     }
   }
Index: cpukit/score/include/rtems/score/mppkt.h
===================================================================
--- cpukit/score/include/rtems/score/mppkt.h	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ cpukit/score/include/rtems/score/mppkt.h	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -39,5 +39,5 @@
 typedef enum {
   RTEMS_MP_PACKET_INTERNAL_THREADS = 0,
-  RTEMS_MP_PACKET_TASKS      = 1,
+  RTEMS_MP_PACKET_TASKS            = 1,
   RTEMS_MP_PACKET_MESSAGE_QUEUE    = 2,
   RTEMS_MP_PACKET_SEMAPHORE        = 3,
Index: cpukit/score/include/rtems/score/threadmp.h
===================================================================
--- cpukit/score/include/rtems/score/threadmp.h	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ cpukit/score/include/rtems/score/threadmp.h	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -91,24 +91,4 @@
 
 /*
- *  _Thread_MP_Block
- *
- *  DESCRIPTION:
- *
- *  This routine blocks the MP Receive server thread.
- */
-
-void _Thread_MP_Block( void );
-
-/*
- *  _Thread_MP_Ready
- *
- *  DESCRIPTION:
- *
- *  This routine readies the MP Receive server thread.
- */
-
-void _Thread_MP_Ready( void );
-
-/*
  *  The following is used to determine when the multiprocessing receive
  *  thread is executing so that a proxy can be allocated instead of
Index: cpukit/score/src/thread.c
===================================================================
--- cpukit/score/src/thread.c	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ cpukit/score/src/thread.c	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -317,5 +317,6 @@
       if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
         _Thread_Heir = the_thread;
-        if ( _Modes_Is_preempt( _Thread_Executing->current_modes ) )
+        if ( _Modes_Is_preempt( _Thread_Executing->current_modes ) ||
+             the_thread->current_priority == 0 )
           _Context_Switch_necessary = TRUE;
       }
Index: cpukit/score/src/threadmp.c
===================================================================
--- cpukit/score/src/threadmp.c	(revision 0ea07c0089a56327b62493189e06e21e23d976fc)
+++ cpukit/score/src/threadmp.c	(revision 3a5dbdca1b37bacc18fe61701530d28c6f1254ee)
@@ -158,72 +158,2 @@
   return NULL;
 }
-
-/*PAGE
- *
- *  _Thread_MP_Block
- *
- */
-
-void _Thread_MP_Block( void )
-{
-  ISR_Level   level;
-
-  _ISR_Disable( level );
-
-    if ( _Thread_MP_Receive->Notepads[ 0 ] != 0 ) {
-      _Priority_Remove_from_bit_map( &_Thread_MP_Receive->Priority_map );
-
-      _Thread_MP_Receive->current_state = STATES_SUSPENDED;
-
-      _ISR_Flash( level );
-
-      _Thread_Calculate_heir();
-
-      _Context_Switch_necessary = TRUE;
-
-      _ISR_Enable( level );
-
-      _Thread_Dispatch_disable_level = 0;
-
-      _Thread_Dispatch();
-
-      return;
-
-    }
-  _ISR_Enable( level );
-
-}
-
-/*PAGE
- *
- *  _Thread_MP_Ready
- *
- */
-
-void _Thread_MP_Ready( void )
-{
-  ISR_Level   level;
-
-  _ISR_Disable( level );
-
-    if ( _States_Is_suspended( _Thread_MP_Receive->current_state ) ) {
-      _Priority_Add_to_bit_map( &_Thread_MP_Receive->Priority_map );
-
-      _Thread_MP_Receive->current_state = STATES_READY;
-
-      _Thread_Heir = _Thread_MP_Receive;
-
-      _Context_Switch_necessary = TRUE;
-
-      _ISR_Enable( level );
-
-      if ( _Thread_Is_dispatching_enabled() )
-        _Thread_Dispatch();
-
-    } else {
-
-      _Thread_MP_Receive->Notepads[ 0 ] = 0;
-      _ISR_Enable( level );
-
-    }
-}
