Index: c/src/exec/libcsupport/src/libio.c
===================================================================
--- c/src/exec/libcsupport/src/libio.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/libcsupport/src/libio.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -112,8 +112,11 @@
     }
 
-    rc = rtems_semaphore_create(RTEMS_LIBIO_SEM,
-                                1,
-                                RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
-                                &rtems_libio_semaphore);
+    rc = rtems_semaphore_create(
+      RTEMS_LIBIO_SEM,
+      1,
+      RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+      RTEMS_NO_PRIORITY,
+      &rtems_libio_semaphore
+    );
     if (rc != RTEMS_SUCCESSFUL)
         rtems_fatal_error_occurred(rc);
@@ -200,7 +203,11 @@
              */
 
-            rc = rtems_semaphore_create(RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops),
-                                        1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
-                                        &iop->sem);
+            rc = rtems_semaphore_create(
+              RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops),
+              1, 
+              RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+              RTEMS_NO_PRIORITY,
+              &iop->sem
+            );
             if (rc != RTEMS_SUCCESSFUL)
                 goto failed;
Index: c/src/exec/rtems/headers/asr.h
===================================================================
--- c/src/exec/rtems/headers/asr.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/headers/asr.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -55,9 +55,9 @@
 
 typedef struct {
-  rtems_asr_entry            handler;          /* address of RTEMS_ASR */
-  rtems_mode          mode_set;         /* RTEMS_ASR mode */
-  rtems_signal_set signals_posted;   /* signal set */
-  rtems_signal_set signals_pending;  /* pending signal set */
-  unsigned32             nest_level;       /* nest level of RTEMS_ASR */
+  rtems_asr_entry   handler;          /* address of RTEMS_ASR */
+  Modes_Control     mode_set;         /* RTEMS_ASR mode */
+  rtems_signal_set  signals_posted;   /* signal set */
+  rtems_signal_set  signals_pending;  /* pending signal set */
+  unsigned32        nest_level;       /* nest level of RTEMS_ASR */
 }   ASR_Information;
 
Index: c/src/exec/rtems/headers/attr.h
===================================================================
--- c/src/exec/rtems/headers/attr.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/headers/attr.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -28,5 +28,5 @@
 /* constants */
 
-#define RTEMS_DEFAULT_ATTRIBUTES            0x00000000
+#define RTEMS_DEFAULT_ATTRIBUTES  0x00000000
 
 #define RTEMS_NO_FLOATING_POINT   0x00000000 /* don't use FP HW */
Index: c/src/exec/rtems/headers/modes.h
===================================================================
--- c/src/exec/rtems/headers/modes.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/headers/modes.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -29,5 +29,5 @@
  */
 
-typedef unsigned32 rtems_mode;
+typedef unsigned32 Modes_Control;
 
 /*
@@ -74,5 +74,5 @@
 
 STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -87,6 +87,6 @@
 
 STATIC INLINE boolean _Modes_Mask_changed (
-  rtems_mode mode_set,
-  rtems_mode masks
+  Modes_Control mode_set,
+  Modes_Control masks
 );
 
@@ -101,5 +101,5 @@
 
 STATIC INLINE boolean _Modes_Is_asr_disabled (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -114,5 +114,5 @@
 
 STATIC INLINE boolean _Modes_Is_preempt (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -127,5 +127,5 @@
 
 STATIC INLINE boolean _Modes_Is_timeslice (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -139,5 +139,5 @@
 
 STATIC INLINE ISR_Level _Modes_Get_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -152,5 +152,5 @@
 
 STATIC INLINE void _Modes_Set_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -167,9 +167,9 @@
 
 STATIC INLINE void _Modes_Change (
-  rtems_mode  old_mode_set,
-  rtems_mode  new_mode_set,
-  rtems_mode  mask,
-  rtems_mode *out_mode_set,
-  rtems_mode *changed
+  Modes_Control  old_mode_set,
+  Modes_Control  new_mode_set,
+  Modes_Control  mask,
+  Modes_Control *out_mode_set,
+  Modes_Control *changed
 );
 
Index: c/src/exec/rtems/headers/sem.h
===================================================================
--- c/src/exec/rtems/headers/sem.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/headers/sem.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -83,8 +83,9 @@
 
 rtems_status_code rtems_semaphore_create(
-  rtems_name          name,
-  unsigned32          count,
-  rtems_attribute  attribute_set,
-  Objects_Id         *id
+  rtems_name            name,
+  unsigned32            count,
+  rtems_attribute       attribute_set,
+  rtems_task_priority   priority_ceiling,
+  Objects_Id           *id
 );
 
Index: c/src/exec/rtems/headers/signal.h
===================================================================
--- c/src/exec/rtems/headers/signal.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/headers/signal.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -32,4 +32,5 @@
 #include <rtems/object.h>
 #include <rtems/status.h>
+#include <rtems/types.h>
 
 /*
@@ -46,5 +47,5 @@
 rtems_status_code rtems_signal_catch(
   rtems_asr_entry   asr_handler,
-  rtems_mode mode_set
+  rtems_mode        mode_set
 );
 
Index: c/src/exec/rtems/headers/tasks.h
===================================================================
--- c/src/exec/rtems/headers/tasks.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/headers/tasks.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -48,4 +48,5 @@
 #include <rtems/thread.h>
 #include <rtems/threadq.h>
+#include <rtems/types.h>
 
 /*
@@ -95,10 +96,10 @@
 
 rtems_status_code rtems_task_create(
-  rtems_name          name,
-  rtems_task_priority    initial_priority,
-  unsigned32          stack_size,
-  rtems_mode       initial_modes,
-  rtems_attribute  attribute_set,
-  Objects_Id         *id
+  rtems_name           name,
+  rtems_task_priority  initial_priority,
+  unsigned32           stack_size,
+  rtems_mode           initial_modes,
+  rtems_attribute      attribute_set,
+  Objects_Id          *id
 );
 
@@ -238,5 +239,5 @@
 
 rtems_status_code rtems_task_set_priority(
-  Objects_Id        id,
+  Objects_Id           id,
   rtems_task_priority  new_priority,
   rtems_task_priority *old_priority
@@ -325,4 +326,16 @@
 );
 
+/*
+ *  _RTEMS_Tasks_Priority_to_Core
+ *
+ *  DESCRIPTION:
+ *
+ *  This function converts an RTEMS API priority into a core priority.
+ */
+ 
+STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core(
+  rtems_task_priority   priority
+);
+
 #include <rtems/tasks.inl>
 #include <rtems/taskmp.h>
Index: c/src/exec/rtems/headers/types.h
===================================================================
--- c/src/exec/rtems/headers/types.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/headers/types.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -22,4 +22,6 @@
 
 #include <rtems/object.h>
+#include <rtems/priority.h>
+#include <rtems/modes.h>
 
 /*
@@ -49,4 +51,17 @@
 typedef CPU_Interrupt_frame        rtems_interrupt_frame;
 
+/*
+ *  Define the type for an RTEMS API task priority.
+ */
+
+typedef Priority_Control rtems_task_priority;
+
+#define RTEMS_NO_PRIORITY  RTEMS_CURRENT_PRIORITY
+/*
+ *  Define the type for an RTEMS API task mode.
+ */
+ 
+typedef Modes_Control rtems_mode;
+
 #ifdef __cplusplus
 }
Index: c/src/exec/rtems/include/rtems/rtems/asr.h
===================================================================
--- c/src/exec/rtems/include/rtems/rtems/asr.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/include/rtems/rtems/asr.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -55,9 +55,9 @@
 
 typedef struct {
-  rtems_asr_entry            handler;          /* address of RTEMS_ASR */
-  rtems_mode          mode_set;         /* RTEMS_ASR mode */
-  rtems_signal_set signals_posted;   /* signal set */
-  rtems_signal_set signals_pending;  /* pending signal set */
-  unsigned32             nest_level;       /* nest level of RTEMS_ASR */
+  rtems_asr_entry   handler;          /* address of RTEMS_ASR */
+  Modes_Control     mode_set;         /* RTEMS_ASR mode */
+  rtems_signal_set  signals_posted;   /* signal set */
+  rtems_signal_set  signals_pending;  /* pending signal set */
+  unsigned32        nest_level;       /* nest level of RTEMS_ASR */
 }   ASR_Information;
 
Index: c/src/exec/rtems/include/rtems/rtems/attr.h
===================================================================
--- c/src/exec/rtems/include/rtems/rtems/attr.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/include/rtems/rtems/attr.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -28,5 +28,5 @@
 /* constants */
 
-#define RTEMS_DEFAULT_ATTRIBUTES            0x00000000
+#define RTEMS_DEFAULT_ATTRIBUTES  0x00000000
 
 #define RTEMS_NO_FLOATING_POINT   0x00000000 /* don't use FP HW */
Index: c/src/exec/rtems/include/rtems/rtems/modes.h
===================================================================
--- c/src/exec/rtems/include/rtems/rtems/modes.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/include/rtems/rtems/modes.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -29,5 +29,5 @@
  */
 
-typedef unsigned32 rtems_mode;
+typedef unsigned32 Modes_Control;
 
 /*
@@ -74,5 +74,5 @@
 
 STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -87,6 +87,6 @@
 
 STATIC INLINE boolean _Modes_Mask_changed (
-  rtems_mode mode_set,
-  rtems_mode masks
+  Modes_Control mode_set,
+  Modes_Control masks
 );
 
@@ -101,5 +101,5 @@
 
 STATIC INLINE boolean _Modes_Is_asr_disabled (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -114,5 +114,5 @@
 
 STATIC INLINE boolean _Modes_Is_preempt (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -127,5 +127,5 @@
 
 STATIC INLINE boolean _Modes_Is_timeslice (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -139,5 +139,5 @@
 
 STATIC INLINE ISR_Level _Modes_Get_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -152,5 +152,5 @@
 
 STATIC INLINE void _Modes_Set_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 );
 
@@ -167,9 +167,9 @@
 
 STATIC INLINE void _Modes_Change (
-  rtems_mode  old_mode_set,
-  rtems_mode  new_mode_set,
-  rtems_mode  mask,
-  rtems_mode *out_mode_set,
-  rtems_mode *changed
+  Modes_Control  old_mode_set,
+  Modes_Control  new_mode_set,
+  Modes_Control  mask,
+  Modes_Control *out_mode_set,
+  Modes_Control *changed
 );
 
Index: c/src/exec/rtems/include/rtems/rtems/sem.h
===================================================================
--- c/src/exec/rtems/include/rtems/rtems/sem.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/include/rtems/rtems/sem.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -83,8 +83,9 @@
 
 rtems_status_code rtems_semaphore_create(
-  rtems_name          name,
-  unsigned32          count,
-  rtems_attribute  attribute_set,
-  Objects_Id         *id
+  rtems_name            name,
+  unsigned32            count,
+  rtems_attribute       attribute_set,
+  rtems_task_priority   priority_ceiling,
+  Objects_Id           *id
 );
 
Index: c/src/exec/rtems/include/rtems/rtems/signal.h
===================================================================
--- c/src/exec/rtems/include/rtems/rtems/signal.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/include/rtems/rtems/signal.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -32,4 +32,5 @@
 #include <rtems/object.h>
 #include <rtems/status.h>
+#include <rtems/types.h>
 
 /*
@@ -46,5 +47,5 @@
 rtems_status_code rtems_signal_catch(
   rtems_asr_entry   asr_handler,
-  rtems_mode mode_set
+  rtems_mode        mode_set
 );
 
Index: c/src/exec/rtems/include/rtems/rtems/tasks.h
===================================================================
--- c/src/exec/rtems/include/rtems/rtems/tasks.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/include/rtems/rtems/tasks.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -48,4 +48,5 @@
 #include <rtems/thread.h>
 #include <rtems/threadq.h>
+#include <rtems/types.h>
 
 /*
@@ -95,10 +96,10 @@
 
 rtems_status_code rtems_task_create(
-  rtems_name          name,
-  rtems_task_priority    initial_priority,
-  unsigned32          stack_size,
-  rtems_mode       initial_modes,
-  rtems_attribute  attribute_set,
-  Objects_Id         *id
+  rtems_name           name,
+  rtems_task_priority  initial_priority,
+  unsigned32           stack_size,
+  rtems_mode           initial_modes,
+  rtems_attribute      attribute_set,
+  Objects_Id          *id
 );
 
@@ -238,5 +239,5 @@
 
 rtems_status_code rtems_task_set_priority(
-  Objects_Id        id,
+  Objects_Id           id,
   rtems_task_priority  new_priority,
   rtems_task_priority *old_priority
@@ -325,4 +326,16 @@
 );
 
+/*
+ *  _RTEMS_Tasks_Priority_to_Core
+ *
+ *  DESCRIPTION:
+ *
+ *  This function converts an RTEMS API priority into a core priority.
+ */
+ 
+STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core(
+  rtems_task_priority   priority
+);
+
 #include <rtems/tasks.inl>
 #include <rtems/taskmp.h>
Index: c/src/exec/rtems/include/rtems/rtems/types.h
===================================================================
--- c/src/exec/rtems/include/rtems/rtems/types.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/include/rtems/rtems/types.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -22,4 +22,6 @@
 
 #include <rtems/object.h>
+#include <rtems/priority.h>
+#include <rtems/modes.h>
 
 /*
@@ -49,4 +51,17 @@
 typedef CPU_Interrupt_frame        rtems_interrupt_frame;
 
+/*
+ *  Define the type for an RTEMS API task priority.
+ */
+
+typedef Priority_Control rtems_task_priority;
+
+#define RTEMS_NO_PRIORITY  RTEMS_CURRENT_PRIORITY
+/*
+ *  Define the type for an RTEMS API task mode.
+ */
+ 
+typedef Modes_Control rtems_mode;
+
 #ifdef __cplusplus
 }
Index: c/src/exec/rtems/inline/modes.inl
===================================================================
--- c/src/exec/rtems/inline/modes.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/inline/modes.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -24,5 +24,5 @@
 
 STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -37,6 +37,6 @@
 
 STATIC INLINE boolean _Modes_Mask_changed (
-  rtems_mode mode_set,
-  rtems_mode masks
+  Modes_Control mode_set,
+  Modes_Control masks
 )
 {
@@ -51,5 +51,5 @@
 
 STATIC INLINE boolean _Modes_Is_asr_disabled (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -64,5 +64,5 @@
 
 STATIC INLINE boolean _Modes_Is_preempt (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -77,5 +77,5 @@
 
 STATIC INLINE boolean _Modes_Is_timeslice (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -91,5 +91,5 @@
 
 STATIC INLINE ISR_Level _Modes_Get_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -104,5 +104,5 @@
 
 STATIC INLINE void _Modes_Set_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -117,12 +117,12 @@
 
 STATIC INLINE void _Modes_Change (
-  rtems_mode  old_mode_set,
-  rtems_mode  new_mode_set,
-  rtems_mode  mask,
-  rtems_mode *out_mode_set,
-  rtems_mode *changed
+  Modes_Control  old_mode_set,
+  Modes_Control  new_mode_set,
+  Modes_Control  mask,
+  Modes_Control *out_mode_set,
+  Modes_Control *changed
 )
 {
-  rtems_mode _out_mode;
+  Modes_Control _out_mode;
 
   _out_mode      =  old_mode_set;
Index: c/src/exec/rtems/inline/rtems/rtems/modes.inl
===================================================================
--- c/src/exec/rtems/inline/rtems/rtems/modes.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/inline/rtems/rtems/modes.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -24,5 +24,5 @@
 
 STATIC INLINE unsigned32 RTEMS_INTERRUPT_LEVEL (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -37,6 +37,6 @@
 
 STATIC INLINE boolean _Modes_Mask_changed (
-  rtems_mode mode_set,
-  rtems_mode masks
+  Modes_Control mode_set,
+  Modes_Control masks
 )
 {
@@ -51,5 +51,5 @@
 
 STATIC INLINE boolean _Modes_Is_asr_disabled (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -64,5 +64,5 @@
 
 STATIC INLINE boolean _Modes_Is_preempt (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -77,5 +77,5 @@
 
 STATIC INLINE boolean _Modes_Is_timeslice (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -91,5 +91,5 @@
 
 STATIC INLINE ISR_Level _Modes_Get_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -104,5 +104,5 @@
 
 STATIC INLINE void _Modes_Set_interrupt_level (
-  rtems_mode mode_set
+  Modes_Control mode_set
 )
 {
@@ -117,12 +117,12 @@
 
 STATIC INLINE void _Modes_Change (
-  rtems_mode  old_mode_set,
-  rtems_mode  new_mode_set,
-  rtems_mode  mask,
-  rtems_mode *out_mode_set,
-  rtems_mode *changed
+  Modes_Control  old_mode_set,
+  Modes_Control  new_mode_set,
+  Modes_Control  mask,
+  Modes_Control *out_mode_set,
+  Modes_Control *changed
 )
 {
-  rtems_mode _out_mode;
+  Modes_Control _out_mode;
 
   _out_mode      =  old_mode_set;
Index: c/src/exec/rtems/inline/rtems/rtems/tasks.inl
===================================================================
--- c/src/exec/rtems/inline/rtems/rtems/tasks.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/inline/rtems/rtems/tasks.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -44,5 +44,8 @@
 )
 {
-  _Objects_Free( &_RTEMS_tasks_Information, &the_task->Object );
+  _Objects_Free( 
+    _Objects_Get_information( the_task->Object.id ),
+    &the_task->Object
+  );
 }
 
@@ -62,4 +65,5 @@
   state = the_thread->current_state;
 
+/* XXX do this with the object class */
   if ( _States_Is_waiting_on_thread_queue( state ) ) {
     if ( _States_Is_waiting_for_rpc_reply( state ) &&
@@ -92,4 +96,16 @@
 }
 
+/*PAGE
+ *
+ *  _RTEMS_Tasks_Priority_to_Core
+ */
+ 
+STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core(
+  rtems_task_priority   priority
+)
+{
+  return (Priority_Control) priority;
+}
+
 #endif
 /* end of include file */
Index: c/src/exec/rtems/inline/tasks.inl
===================================================================
--- c/src/exec/rtems/inline/tasks.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/inline/tasks.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -44,5 +44,8 @@
 )
 {
-  _Objects_Free( &_RTEMS_tasks_Information, &the_task->Object );
+  _Objects_Free( 
+    _Objects_Get_information( the_task->Object.id ),
+    &the_task->Object
+  );
 }
 
@@ -62,4 +65,5 @@
   state = the_thread->current_state;
 
+/* XXX do this with the object class */
   if ( _States_Is_waiting_on_thread_queue( state ) ) {
     if ( _States_Is_waiting_for_rpc_reply( state ) &&
@@ -92,4 +96,16 @@
 }
 
+/*PAGE
+ *
+ *  _RTEMS_Tasks_Priority_to_Core
+ */
+ 
+STATIC INLINE Priority_Control _RTEMS_Tasks_Priority_to_Core(
+  rtems_task_priority   priority
+)
+{
+  return (Priority_Control) priority;
+}
+
 #endif
 /* end of include file */
Index: c/src/exec/rtems/macros/modes.inl
===================================================================
--- c/src/exec/rtems/macros/modes.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/macros/modes.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -89,5 +89,5 @@
 #define _Modes_Change( _old_mode_set, _new_mode_set, \
                        _mask, _out_mode_set, _changed ) \
-  { rtems_mode _out_mode; \
+  { Modes_Control _out_mode; \
     \
     _out_mode         =  (_old_mode_set); \
Index: c/src/exec/rtems/macros/rtems/rtems/modes.inl
===================================================================
--- c/src/exec/rtems/macros/rtems/rtems/modes.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/macros/rtems/rtems/modes.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -89,5 +89,5 @@
 #define _Modes_Change( _old_mode_set, _new_mode_set, \
                        _mask, _out_mode_set, _changed ) \
-  { rtems_mode _out_mode; \
+  { Modes_Control _out_mode; \
     \
     _out_mode         =  (_old_mode_set); \
Index: c/src/exec/rtems/macros/rtems/rtems/tasks.inl
===================================================================
--- c/src/exec/rtems/macros/rtems/rtems/tasks.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/macros/rtems/rtems/tasks.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -84,4 +84,12 @@
   }
 
+/*PAGE
+ *
+ *  _RTEMS_Tasks_Priority_to_Core
+ */
+ 
+#define _RTEMS_Tasks_Priority_to_Core( _priority ) \
+  ((Priority_Control) (_priority))
+
 #endif
 /* end of include file */
Index: c/src/exec/rtems/macros/tasks.inl
===================================================================
--- c/src/exec/rtems/macros/tasks.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/macros/tasks.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -84,4 +84,12 @@
   }
 
+/*PAGE
+ *
+ *  _RTEMS_Tasks_Priority_to_Core
+ */
+ 
+#define _RTEMS_Tasks_Priority_to_Core( _priority ) \
+  ((Priority_Control) (_priority))
+
 #endif
 /* end of include file */
Index: c/src/exec/rtems/optman/no-sem.c
===================================================================
--- c/src/exec/rtems/optman/no-sem.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/optman/no-sem.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -32,8 +32,9 @@
 
 rtems_status_code rtems_semaphore_create(
-  rtems_name          name,
-  unsigned32          count,
-  rtems_attribute  attribute_set,
-  Objects_Id         *id
+  rtems_name            name,
+  unsigned32            count,
+  rtems_attribute       attribute_set,
+  rtems_task_priority   priority_ceiling,
+  Objects_Id           *id
 )
 {
Index: c/src/exec/rtems/optman/no-signal.c
===================================================================
--- c/src/exec/rtems/optman/no-signal.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/optman/no-signal.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -23,5 +23,5 @@
 rtems_status_code rtems_signal_catch(
   rtems_asr_entry   handler,
-  rtems_mode mode_set
+  rtems_mode        mode_set
 )
 {
@@ -30,5 +30,5 @@
 
 rtems_status_code rtems_signal_send(
-  Objects_Id             id,
+  rtems_id         id,
   rtems_signal_set signal_set
 )
Index: c/src/exec/rtems/src/event.c
===================================================================
--- c/src/exec/rtems/src/event.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/event.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -57,5 +57,5 @@
       );
     case OBJECTS_LOCAL:
-      _Event_sets_Post( event_in, &the_thread->pending_events );
+      _Event_sets_Post( event_in, &the_thread->RTEMS_API->pending_events );
       _Event_Surrender( the_thread );
       _Thread_Enable_dispatch();
@@ -92,5 +92,5 @@
 {
   if ( _Event_sets_Is_empty( event_in ) ) {
-    *event_out = _Thread_Executing->pending_events;
+    *event_out = _Thread_Executing->RTEMS_API->pending_events;
     return( RTEMS_SUCCESSFUL );
   }
@@ -99,5 +99,5 @@
   _Event_Seize( event_in, option_set, ticks );
   _Thread_Enable_dispatch();
-  *event_out = _Thread_Executing->events_out;
+  *event_out = _Thread_Executing->RTEMS_API->events_out;
   return( _Thread_Executing->Wait.return_code );
 }
Index: c/src/exec/rtems/src/mp.c
===================================================================
--- c/src/exec/rtems/src/mp.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/mp.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -59,5 +59,5 @@
   _Event_sets_Post(
     RTEMS_EVENT_0,
-    &_Internal_threads_System_initialization_thread->pending_events
+    &_Internal_threads_System_initialization_thread->RTEMS_API->pending_events
   );
   _Event_Surrender( _Internal_threads_System_initialization_thread );
Index: c/src/exec/rtems/src/msg.c
===================================================================
--- c/src/exec/rtems/src/msg.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/msg.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -182,5 +182,5 @@
 
   if ( _Attributes_Is_global( attribute_set ) &&
-       !( _Objects_MP_Open( &_Message_queue_Information, name,
+       !( _Objects_MP_Allocate_and_open( &_Message_queue_Information, name,
                             the_message_queue->Object.id, FALSE ) ) ) {
     _Message_queue_Free( the_message_queue );
@@ -196,6 +196,12 @@
   _Chain_Initialize_empty( &the_message_queue->Pending_messages );
 
-  _Thread_queue_Initialize( &the_message_queue->Wait_queue, attribute_set,
-                            STATES_WAITING_FOR_MESSAGE );
+  _Thread_queue_Initialize(
+    &the_message_queue->Wait_queue,
+    OBJECTS_RTEMS_MESSAGE_QUEUES,
+    _Attributes_Is_priority( attribute_set ) ? 
+       THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+    STATES_WAITING_FOR_MESSAGE,
+    _Message_queue_MP_Send_extract_proxy
+  );
 
   _Objects_Open(
Index: c/src/exec/rtems/src/msgmp.c
===================================================================
--- c/src/exec/rtems/src/msgmp.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/msgmp.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -260,5 +260,5 @@
     case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
 
-      ignored = _Objects_MP_Open(
+      ignored = _Objects_MP_Allocate_and_open(
                   &_Message_queue_Information,
                   the_packet->name,
Index: c/src/exec/rtems/src/part.c
===================================================================
--- c/src/exec/rtems/src/part.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/part.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -108,5 +108,5 @@
 
   if ( _Attributes_Is_global( attribute_set ) &&
-       !( _Objects_MP_Open( &_Partition_Information, name,
+       !( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
                             the_partition->Object.id, FALSE ) ) ) {
     _Partition_Free( the_partition );
Index: c/src/exec/rtems/src/partmp.c
===================================================================
--- c/src/exec/rtems/src/partmp.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/partmp.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -185,5 +185,5 @@
     case PARTITION_MP_ANNOUNCE_CREATE:
 
-      ignored = _Objects_MP_Open(
+      ignored = _Objects_MP_Allocate_and_open(
                   &_Partition_Information,
                   the_packet->name,
Index: c/src/exec/rtems/src/region.c
===================================================================
--- c/src/exec/rtems/src/region.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/region.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -114,5 +114,11 @@
 
   _Thread_queue_Initialize(
-     &the_region->Wait_queue, attribute_set, STATES_WAITING_FOR_SEGMENT );
+    &the_region->Wait_queue,
+    OBJECTS_RTEMS_REGIONS,
+    _Attributes_Is_priority( attribute_set ) ? 
+       THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+    STATES_WAITING_FOR_SEGMENT,
+    _Region_MP_Send_extract_proxy
+  );
 
   _Objects_Open( &_Region_Information, &the_region->Object, &name );
Index: c/src/exec/rtems/src/regionmp.c
===================================================================
--- c/src/exec/rtems/src/regionmp.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/regionmp.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -191,5 +191,5 @@
     case REGION_MP_ANNOUNCE_CREATE:
 
-      ignored = _Objects_MP_Open(
+      ignored = _Objects_MP_Allocate_and_open(
                   &_Region_Information,
                   the_packet->name,
Index: c/src/exec/rtems/src/sem.c
===================================================================
--- c/src/exec/rtems/src/sem.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/sem.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -88,8 +88,9 @@
 
 rtems_status_code rtems_semaphore_create(
-  rtems_name          name,
-  unsigned32          count,
-  rtems_attribute  attribute_set,
-  Objects_Id         *id
+  rtems_name            name,
+  unsigned32            count,
+  rtems_attribute       attribute_set,
+  rtems_task_priority   priority_ceiling,
+  Objects_Id           *id
 )
 {
@@ -128,5 +129,5 @@
 
   if ( _Attributes_Is_global( attribute_set ) &&
-       !( _Objects_MP_Open( &_Semaphore_Information, name,
+       !( _Objects_MP_Allocate_and_open( &_Semaphore_Information, name,
                             the_semaphore->Object.id, FALSE ) ) ) {
     _Semaphore_Free( the_semaphore );
@@ -149,6 +150,12 @@
   }
 
-  _Thread_queue_Initialize( &the_semaphore->Wait_queue,
-                            attribute_set, STATES_WAITING_FOR_SEMAPHORE );
+  _Thread_queue_Initialize(
+    &the_semaphore->Wait_queue,
+    OBJECTS_RTEMS_SEMAPHORES,
+    _Attributes_Is_priority( attribute_set ) ? 
+       THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+    STATES_WAITING_FOR_SEMAPHORE,
+    _Semaphore_MP_Send_extract_proxy
+  );
 
   _Objects_Open( &_Semaphore_Information, &the_semaphore->Object, &name );
Index: c/src/exec/rtems/src/semmp.c
===================================================================
--- c/src/exec/rtems/src/semmp.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/semmp.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -188,5 +188,5 @@
     case SEMAPHORE_MP_ANNOUNCE_CREATE:
 
-      ignored = _Objects_MP_Open(
+      ignored = _Objects_MP_Allocate_and_open(
                   &_Semaphore_Information,
                   the_packet->name,
Index: c/src/exec/rtems/src/signal.c
===================================================================
--- c/src/exec/rtems/src/signal.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/signal.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -38,20 +38,21 @@
 
 rtems_status_code rtems_signal_catch(
-  rtems_asr_entry   handler,
-  rtems_mode mode_set
+  rtems_asr_entry   asr_handler,
+  rtems_mode        mode_set
 )
 {
   Thread_Control *executing;
 
+/* XXX normalize mode */
   executing = _Thread_Executing;
   _Thread_Disable_dispatch(); /* cannot reschedule while */
                               /*   the thread is inconsistent */
 
-  if ( ! _ASR_Is_null_handler( handler ) ) {
-    executing->Signal.mode_set = mode_set;
-    executing->Signal.handler  = handler;
+  if ( !_ASR_Is_null_handler( asr_handler ) ) {
+    executing->RTEMS_API->Signal.mode_set = mode_set;
+    executing->RTEMS_API->Signal.handler  = asr_handler;
   }
   else
-    _ASR_Initialize( &executing->Signal );
+    _ASR_Initialize( &executing->RTEMS_API->Signal );
   _Thread_Enable_dispatch();
   return( RTEMS_SUCCESSFUL );
@@ -92,9 +93,11 @@
       );
     case OBJECTS_LOCAL:
-      if ( ! _ASR_Is_null_handler( the_thread->Signal.handler ) ) {
+      if ( ! _ASR_Is_null_handler( the_thread->RTEMS_API->Signal.handler ) ) {
         if ( _Modes_Is_asr_disabled( the_thread->current_modes ) )
-          _ASR_Post_signals( signal_set, &the_thread->Signal.signals_pending );
+          _ASR_Post_signals(
+            signal_set, &the_thread->RTEMS_API->Signal.signals_pending );
         else {
-          _ASR_Post_signals( signal_set, &the_thread->Signal.signals_posted );
+          _ASR_Post_signals(
+            signal_set, &the_thread->RTEMS_API->Signal.signals_posted );
           if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
             _ISR_Signals_to_thread_executing = TRUE;
Index: c/src/exec/rtems/src/taskmp.c
===================================================================
--- c/src/exec/rtems/src/taskmp.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/taskmp.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -194,5 +194,5 @@
     case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
 
-      ignored = _Objects_MP_Open(
+      ignored = _Objects_MP_Allocate_and_open(
                   &_RTEMS_tasks_Information,
                   the_packet->name,
Index: c/src/exec/rtems/src/tasks.c
===================================================================
--- c/src/exec/rtems/src/tasks.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/rtems/src/tasks.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -87,11 +87,18 @@
 {
   register Thread_Control *the_thread;
-  unsigned32               actual_stack_size;
-  unsigned32               memory_needed;
-  void                    *memory;
+  Objects_MP_Control      *the_global_object = NULL;
+  boolean                  is_fp;
+  boolean                  is_global;
   rtems_attribute          the_attribute_set;
+  Priority_Control         core_priority;
+ 
 
   if ( !rtems_is_name_valid( name ) )
     return ( RTEMS_INVALID_NAME );
+
+  /* 
+   *  Core Thread Initialize insures we get the minimum amount of
+   *  stack space.
+   */
 
 #if 0
@@ -100,11 +107,12 @@
 #endif
 
-  if ( !_Stack_Is_enough( stack_size ) )
-    actual_stack_size = RTEMS_MINIMUM_STACK_SIZE;
-  else
-    actual_stack_size = stack_size;
+  /*
+   *  Validate the RTEMS API priority and convert it to the core priority range.
+   */
 
   if ( !_Priority_Is_valid( initial_priority ) )
     return( RTEMS_INVALID_PRIORITY );
+
+  core_priority = _RTEMS_Tasks_Priority_to_Core( initial_priority );
 
   /*
@@ -121,9 +129,38 @@
     _Attributes_Clear( the_attribute_set, ATTRIBUTES_NOT_SUPPORTED );
 
-  if ( _Attributes_Is_global( the_attribute_set ) &&
-       !_Configuration_Is_multiprocessing() )
-    return( RTEMS_MP_NOT_CONFIGURED );
-
-  _Thread_Disable_dispatch();          /* to prevent deletion */
+  if ( _Attributes_Is_floating_point( the_attribute_set ) )
+    is_fp = TRUE;
+  else
+    is_fp = FALSE;
+
+  if ( _Attributes_Is_global( the_attribute_set ) ) {
+
+    is_global = TRUE;
+
+    if ( !_Configuration_Is_multiprocessing() )
+      return( RTEMS_MP_NOT_CONFIGURED );
+
+  } else
+    is_global = FALSE;
+
+  /*
+   *  Make sure system is MP if this task is global
+   */
+
+  /*
+   *  Disable dispatch for protection
+   */ 
+
+  _Thread_Disable_dispatch();
+
+  /*
+   *  Allocate the thread control block and -- if the task is global --
+   *  allocate a global object control block.
+   *
+   *  NOTE:  This routine does not use the combined allocate and open
+   *         global object routine because this results in a lack of
+   *         control over when memory is allocated and can be freed in
+   *         the event of an error.
+   */
 
   the_thread = _RTEMS_tasks_Allocate();
@@ -134,13 +171,43 @@
   }
 
-  actual_stack_size = _Stack_Adjust_size( actual_stack_size );
-  memory_needed = actual_stack_size;
-
-  if ( _Attributes_Is_floating_point( the_attribute_set ) )
-    memory_needed += CONTEXT_FP_SIZE;
-
-  memory = _Workspace_Allocate( memory_needed );
-
-  if ( !memory ) {
+  if ( is_global ) {
+    the_global_object = _Objects_MP_Allocate_global_object();
+
+    if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
+      _RTEMS_tasks_Free( the_thread );
+      _Thread_Enable_dispatch();
+      return( RTEMS_TOO_MANY );
+    }
+  }
+
+#if 0
+  /*
+   *  Allocate and initialize the RTEMS API specific information
+   */
+
+  the_thread->RTEMS_API = _Workspace_Allocate( sizeof( RTEMS_API_Control ) );
+
+  if ( !the_thread->RTEMS_API ) {
+    _RTEMS_tasks_Free( the_thread );
+    if ( is_global )
+    _Objects_MP_Free_global_object( the_global_object );
+    _Thread_Enable_dispatch();
+    return( RTEMS_UNSATISFIED );
+  }
+
+  the_thread->RTEMS_API->pending_events         = EVENT_SETS_NONE_PENDING;
+  _ASR_Initialize( &the_thread->RTEMS_API->Signal );
+#endif
+
+  /*
+   *  Initialize the core thread for this task.
+   */
+
+/* XXX normalize mode */
+
+  if ( !_Thread_Initialize( &_RTEMS_tasks_Information, the_thread, 
+         NULL, stack_size, is_fp, core_priority, initial_modes, &name ) ) {
+    if ( is_global )
+      _Objects_MP_Free_global_object( the_global_object );
     _RTEMS_tasks_Free( the_thread );
     _Thread_Enable_dispatch();
@@ -148,49 +215,17 @@
   }
 
-  /*
-   *  Stack is put in the lower address regions of the allocated memory.
-   *  The optional floating point context area goes into the higher part
-   *  of the allocated memory.
-   */
-
-  _Stack_Initialize(
-     &the_thread->Start.Initial_stack, memory, actual_stack_size );
-
-  if ( _Attributes_Is_floating_point( the_attribute_set ) )
-    the_thread->fp_context = _Context_Fp_start( memory, actual_stack_size );
-  else
-    the_thread->fp_context = NULL;
-
-  the_thread->Start.fp_context = the_thread->fp_context;
-
-  if ( _Attributes_Is_global( the_attribute_set ) &&
-       !( _Objects_MP_Open( &_RTEMS_tasks_Information, name,
-                            the_thread->Object.id, FALSE ) ) ) {
-    _RTEMS_tasks_Free( the_thread );
-    (void) _Workspace_Free( memory );
-    _Thread_Enable_dispatch();
-    return( RTEMS_TOO_MANY );
-  }
-
-  the_thread->attribute_set          = the_attribute_set;
-  the_thread->current_state          = STATES_DORMANT;
-  the_thread->current_modes          = initial_modes;
-  the_thread->pending_events         = EVENT_SETS_NONE_PENDING;
-  the_thread->resource_count         = 0;
-  the_thread->real_priority          = initial_priority;
-  the_thread->Start.initial_priority = initial_priority;
-  the_thread->Start.initial_modes    = initial_modes;
-
-  _Thread_Set_priority( the_thread, initial_priority );
-
-  _ASR_Initialize( &the_thread->Signal );
-
-  _Objects_Open( &_RTEMS_tasks_Information, &the_thread->Object, &name );
-
   *id = the_thread->Object.id;
 
-  _User_extensions_Task_create( the_thread );
-
-  if ( _Attributes_Is_global( the_attribute_set ) )
+  if ( is_global ) {
+
+    the_thread->RTEMS_API->is_global = TRUE;
+
+    _Objects_MP_Open(
+      &_RTEMS_tasks_Information,
+      the_global_object,
+      name,
+      the_thread->Object.id
+    );
+
     _RTEMS_tasks_MP_Send_process_packet(
       RTEMS_TASKS_MP_ANNOUNCE_CREATE,
@@ -199,4 +234,6 @@
     );
 
+   }
+
   _Thread_Enable_dispatch();
   return( RTEMS_SUCCESSFUL );
@@ -253,7 +290,7 @@
 
 rtems_status_code rtems_task_start(
-  Objects_Id   id,
+  rtems_id         id,
   rtems_task_entry entry_point,
-  unsigned32   argument
+  unsigned32       argument
 )
 {
@@ -272,15 +309,6 @@
       return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
     case OBJECTS_LOCAL:
-      if ( _States_Is_dormant( the_thread->current_state ) ) {
-
-        the_thread->Start.entry_point      = entry_point;
-        the_thread->Start.initial_argument = argument;
-
-        _Thread_Load_environment( the_thread );
-
-        _Thread_Ready( the_thread );
-
-        _User_extensions_Task_start( the_thread );
-
+      if ( _Thread_Start(
+             the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) {
         _Thread_Enable_dispatch();
         return( RTEMS_SUCCESSFUL );
@@ -317,5 +345,5 @@
 {
   register Thread_Control *the_thread;
-  Objects_Locations               location;
+  Objects_Locations        location;
 
   the_thread = _Thread_Get( id, &location );
@@ -327,30 +355,9 @@
       return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
     case OBJECTS_LOCAL:
-      if ( !_States_Is_dormant( the_thread->current_state ) ) {
-
-        _Thread_Set_transient( the_thread );
-        _ASR_Initialize( &the_thread->Signal );
-        the_thread->pending_events = EVENT_SETS_NONE_PENDING;
-        the_thread->resource_count = 0;
-        the_thread->current_modes  = the_thread->Start.initial_modes;
-        the_thread->Start.initial_argument = argument;
-
-        _RTEMS_tasks_Cancel_wait( the_thread );
-
-        if ( the_thread->current_priority !=
-                         the_thread->Start.initial_priority ) {
-          the_thread->real_priority = the_thread->Start.initial_priority;
-          _Thread_Set_priority( the_thread,
-             the_thread->Start.initial_priority );
-        }
-
-        _Thread_Load_environment( the_thread );
-
-        _Thread_Ready( the_thread );
-
-        _User_extensions_Task_restart( the_thread );
-
-        if ( _Thread_Is_executing ( the_thread ) )
-          _Thread_Restart_self();
+      if ( _Thread_Restart( the_thread, NULL, argument ) ) {
+
+        /*  XXX until these are in an API extension they are too late. */
+        _ASR_Initialize( &the_thread->RTEMS_API->Signal );
+        the_thread->RTEMS_API->pending_events = EVENT_SETS_NONE_PENDING;
 
         _Thread_Enable_dispatch();
@@ -397,23 +404,12 @@
       return( RTEMS_ILLEGAL_ON_REMOTE_OBJECT );
     case OBJECTS_LOCAL:
-      _Objects_Close( &_RTEMS_tasks_Information, &the_thread->Object );
-
-      _Thread_Set_state( the_thread, STATES_TRANSIENT );
-
-      _User_extensions_Task_delete( the_thread );
-
-#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
-      if ( _Thread_Is_allocated_fp( the_thread ) )
-        _Thread_Deallocate_fp();
-#endif
-      the_thread->fp_context = NULL;
-
-      _RTEMS_tasks_Cancel_wait( the_thread );
-
-      (void) _Workspace_Free( the_thread->Start.Initial_stack.area );
+      _Thread_Close( &_RTEMS_tasks_Information, the_thread );
+
+      /* XXX */
+      (void) _Workspace_Free( the_thread->RTEMS_API );
 
       _RTEMS_tasks_Free( the_thread );
 
-      if ( _Attributes_Is_global( the_thread->attribute_set ) ) {
+      if ( _Attributes_Is_global( the_thread->RTEMS_API->is_global ) ) {
 
         _Objects_MP_Close( &_RTEMS_tasks_Information, the_thread->Object.id );
@@ -552,5 +548,5 @@
 
 rtems_status_code rtems_task_set_priority(
-  Objects_Id        id,
+  Objects_Id           id,
   rtems_task_priority  new_priority,
   rtems_task_priority *old_priority
@@ -663,5 +659,5 @@
   if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
        _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
-      *note = _Thread_Executing->Notepads[ notepad ];
+      *note = _Thread_Executing->RTEMS_API->Notepads[ notepad ];
       return( RTEMS_SUCCESSFUL );
   }
@@ -682,5 +678,5 @@
       );
     case OBJECTS_LOCAL:
-      *note= the_thread->Notepads[ notepad ];
+      *note= the_thread->RTEMS_API->Notepads[ notepad ];
       _Thread_Enable_dispatch();
       return( RTEMS_SUCCESSFUL );
@@ -730,5 +726,5 @@
   if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
        _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
-      _Thread_Executing->Notepads[ notepad ] = note;
+      _Thread_Executing->RTEMS_API->Notepads[ notepad ] = note;
       return( RTEMS_SUCCESSFUL );
   }
@@ -748,5 +744,5 @@
 
     case OBJECTS_LOCAL:
-      the_thread->Notepads[ notepad ] = note;
+      the_thread->RTEMS_API->Notepads[ notepad ] = note;
       _Thread_Enable_dispatch();
       return( RTEMS_SUCCESSFUL );
Index: c/src/exec/score/headers/mppkt.h
===================================================================
--- c/src/exec/score/headers/mppkt.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/mppkt.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -65,5 +65,5 @@
   Objects_Id              id;
   Objects_Id              source_tid;
-  rtems_task_priority     source_priority;
+  Priority_Control        source_priority;
   rtems_status_code       return_code;
   unsigned32              length;
Index: c/src/exec/score/headers/object.h
===================================================================
--- c/src/exec/score/headers/object.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/object.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -350,4 +350,17 @@
 
 /*
+ *  _Objects_Get_information
+ *
+ *  DESCRIPTION:
+ *
+ *  Returns the information control block for the class of objects
+ *  corresponding to this id.
+ */
+
+Objects_Information *_Objects_Get_information(
+  Objects_Id  id
+);
+  
+/*
  *  _Objects_Build_id
  *
@@ -405,4 +418,17 @@
 
 /*
+ *  _Objects_Is_class_valid
+ *
+ *  DESCRIPTION:
+ *
+ *  This function returns TRUE if the class is valid.
+ *
+ */
+ 
+STATIC INLINE boolean _Objects_Is_class_valid(
+  Objects_Classes the_class
+);
+
+/*
  *  _Objects_Is_local_node
  *
Index: c/src/exec/score/headers/objectmp.h
===================================================================
--- c/src/exec/score/headers/objectmp.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/objectmp.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -82,6 +82,23 @@
 );
 
+/*PAGE
+ *
+ *  _Objects_MP_Open
+ *
+ *  DESCRIPTION:
+ *
+ *  This routine place the specified global object in the 
+ *  specified information table.  
+ */
+ 
+void _Objects_MP_Open (
+  Objects_Information *information,
+  Objects_MP_Control  *the_global_object,
+  unsigned32           the_name,      /* XXX -- wrong for variable */
+  Objects_Id           the_id
+);
+
 /*
- *  _Objects_MP_Open
+ *  _Objects_MP_Allocate_and_open
  *
  *  DESCRIPTION:
@@ -93,5 +110,5 @@
  */
 
-boolean _Objects_MP_Open (
+boolean _Objects_MP_Allocate_and_open (
   Objects_Information *information,
   unsigned32           the_name,     /* XXX -- wrong for variable length */
Index: c/src/exec/score/headers/priority.h
===================================================================
--- c/src/exec/score/headers/priority.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/priority.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -30,5 +30,5 @@
  */
 
-typedef unsigned32 rtems_task_priority;
+typedef unsigned32 Priority_Control;
 
 #define RTEMS_MINIMUM_PRIORITY      1         /* highest thread priority */
@@ -93,5 +93,5 @@
 
 STATIC INLINE boolean _Priority_Is_valid (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -105,5 +105,5 @@
 
 STATIC INLINE unsigned32 _Priority_Major (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -117,5 +117,5 @@
 
 STATIC INLINE unsigned32 _Priority_Minor (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -156,5 +156,5 @@
  */
 
-STATIC INLINE rtems_task_priority _Priority_Get_highest( void );
+STATIC INLINE Priority_Control _Priority_Get_highest( void );
 
 /*
@@ -170,5 +170,5 @@
 STATIC INLINE void _Priority_Initialize_information(
   Priority_Information *the_priority_map,
-  rtems_task_priority      new_priority
+  Priority_Control      new_priority
 );
 
@@ -183,5 +183,5 @@
 
 STATIC INLINE boolean _Priority_Is_group_empty (
-  rtems_task_priority      the_priority
+  Priority_Control      the_priority
 );
 
Index: c/src/exec/score/headers/thread.h
===================================================================
--- c/src/exec/score/headers/thread.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/thread.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -87,7 +87,5 @@
                    );
 
-typedef Thread ( *Thread_Entry )(
-                      Thread_Argument
-                   );
+typedef Thread ( *Thread_Entry )( );
 
 /*
@@ -96,11 +94,21 @@
  */
 
+typedef enum {
+  THREAD_START_NUMERIC,
+  THREAD_START_POINTER,
+  THREAD_START_BOTH_POINTER_FIRST,
+  THREAD_START_BOTH_NUMERIC_FIRST
+} Thread_Start_types;
+
 typedef struct {
   Thread_Entry         entry_point;      /* starting thread address         */
-  unsigned32           initial_argument; /* initial argument                */
-  rtems_mode           initial_modes;    /* initial mode                    */
-  rtems_task_priority  initial_priority; /* initial priority                */
+  Thread_Start_types   prototype;        /* how task is invoked             */
+  void                *pointer_argument; /* pointer argument                */
+  unsigned32           numeric_argument; /* numeric argument                */
+  Modes_Control        initial_modes;    /* initial mode                    */
+  Priority_Control     initial_priority; /* initial priority                */
+  Stack_Control        Initial_stack;    /* stack information               */
   void                *fp_context;       /* initial FP context area address */
-  Stack_Control        Initial_stack;    /* stack information               */
+  void                *stack;            /* initial FP context area address */
 }   Thread_Start_information;
 
@@ -135,6 +143,6 @@
   Objects_Control          Object;
   States_Control           current_state;
-  rtems_task_priority      current_priority;
-  rtems_task_priority      real_priority;
+  Priority_Control         current_priority;
+  Priority_Control         real_priority;
   unsigned32               resource_count;
   Thread_Wait_information  Wait;
@@ -154,9 +162,19 @@
  */
 
+/* XXX structure in wrong file .. API .. not core */
+
+typedef struct {
+  boolean                   is_global;
+  unsigned32                Notepads[ RTEMS_NUMBER_NOTEPADS ];
+  rtems_event_set           pending_events;
+  rtems_event_set           events_out;
+  ASR_Information           Signal;
+}  RTEMS_API_Control;
+
 typedef struct {
   Objects_Control           Object;
   States_Control            current_state;
-  rtems_task_priority       current_priority;
-  rtems_task_priority       real_priority;
+  Priority_Control          current_priority;
+  Priority_Control          real_priority;
   unsigned32                resource_count;
   Thread_Wait_information   Wait;
@@ -166,13 +184,9 @@
   Chain_Control            *ready;
   Priority_Information      Priority_map;
-  rtems_event_set           pending_events;
-  rtems_event_set           events_out;
   Thread_Start_information  Start;
-  ASR_Information           Signal;
-  rtems_mode                current_modes;
-  rtems_attribute           attribute_set;
+  Modes_Control             current_modes;
   Context_Control           Registers;
   void                     *fp_context;
-  unsigned32                Notepads[ RTEMS_NUMBER_NOTEPADS ];
+  RTEMS_API_Control        *RTEMS_API;
   void                     *extension;
 }   Thread_Control;
@@ -304,4 +318,69 @@
 
 void _Thread_Dispatch( void );
+
+/*
+ *  _Thread_Initialize
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+
+boolean _Thread_Initialize(
+  Objects_Information *information,
+  Thread_Control      *the_thread,
+  void                *stack_area,    /* NULL if to be allocated */
+  unsigned32           stack_size,    /* insure it is >= min */
+  boolean              is_fp,         /* TRUE if thread uses FP */
+  Priority_Control     priority,
+  Modes_Control        mode,
+  Objects_Name         name
+ 
+);
+
+/*
+ *  _Thread_Start
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+boolean _Thread_Start(
+  Thread_Control           *the_thread,
+  Thread_Start_types        the_prototype,
+  void                     *entry_point,
+  void                     *pointer_argument,
+  unsigned32                numeric_argument
+);
+
+/*
+ *  _Thread_Restart
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+/* XXX multiple task arg profiles */
+ 
+boolean _Thread_Restart(
+  Thread_Control           *the_thread,
+  void                     *pointer_argument,
+  unsigned32                numeric_argument
+);
+
+/*
+ *  _Thread_Close
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+void _Thread_Close(
+  Objects_Information  *information,
+  Thread_Control       *the_thread
+);
 
 /*
@@ -494,5 +573,5 @@
 void _Thread_Change_priority (
   Thread_Control   *the_thread,
-  rtems_task_priority  new_priority
+  Priority_Control  new_priority
 );
 
@@ -508,5 +587,5 @@
 void _Thread_Set_priority(
   Thread_Control   *the_thread,
-  rtems_task_priority  new_priority
+  Priority_Control  new_priority
 );
 
@@ -525,7 +604,7 @@
 
 boolean _Thread_Change_mode(
-  rtems_mode  new_mode_set,
-  rtems_mode  mask,
-  rtems_mode *old_mode_set
+  Modes_Control  new_mode_set,
+  Modes_Control  mask,
+  Modes_Control *old_mode_set
 );
 
Index: c/src/exec/score/headers/threadq.h
===================================================================
--- c/src/exec/score/headers/threadq.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/threadq.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -36,4 +36,17 @@
                  Thread_Control *
              );
+
+/*
+ *  The following type defines the callout used when a local task
+ *  is extracted from a remote thread queue (i.e. it's proxy must
+ *  extracted from the remote queue).
+ */
+ 
+typedef void ( *Thread_queue_Extract_callout )(
+                 Thread_Control *
+             );
+
+EXTERN Thread_queue_Extract_callout  
+  _Thread_queue_Extract_table[ OBJECTS_CLASSES_LAST + 1 ];
 
 /*
@@ -63,5 +76,5 @@
 void _Thread_queue_Enqueue(
   Thread_queue_Control *the_thread_queue,
-  rtems_interval     timeout
+  rtems_interval        timeout
 );
 
@@ -77,4 +90,18 @@
 void _Thread_queue_Extract(
   Thread_queue_Control *the_thread_queue,
+  Thread_Control       *the_thread
+);
+
+/*
+ *  _Thread_queue_Extract_with_proxy
+ *
+ *  DESCRIPTION:
+ *
+ *  This routine extracts the_thread from the_thread_queue
+ *  and insures that if there is a proxy for this task on 
+ *  another node, it is also dealt with.
+ */
+ 
+boolean _Thread_queue_Extract_with_proxy(
   Thread_Control       *the_thread
 );
@@ -119,7 +146,9 @@
 
 void _Thread_queue_Initialize(
-  Thread_queue_Control *the_thread_queue,
-  rtems_attribute    attribute_set,
-  States_Control        state
+  Thread_queue_Control         *the_thread_queue,
+  Objects_Classes               the_class,
+  Thread_queue_Disciplines      the_discipline,
+  States_Control                state,
+  Thread_queue_Extract_callout  proxy_extract_callout
 );
 
Index: c/src/exec/score/headers/tqdata.h
===================================================================
--- c/src/exec/score/headers/tqdata.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/tqdata.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -32,6 +32,6 @@
 
 typedef enum {
-  THREAD_QUEUE_DATA_FIFO_DISCIPLINE,     /* RTEMS_FIFO queue discipline */
-  THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE  /* RTEMS_PRIORITY queue discipline */
+  THREAD_QUEUE_DISCIPLINE_FIFO,     /* RTEMS_FIFO queue discipline */
+  THREAD_QUEUE_DISCIPLINE_PRIORITY  /* RTEMS_PRIORITY queue discipline */
 }   Thread_queue_Disciplines;
 
@@ -64,5 +64,5 @@
 
 STATIC INLINE unsigned32 _Thread_queue_Header_number (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -78,5 +78,5 @@
 
 STATIC INLINE boolean _Thread_queue_Is_reverse_search (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
Index: c/src/exec/score/headers/userext.h
===================================================================
--- c/src/exec/score/headers/userext.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/headers/userext.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -70,6 +70,6 @@
 
 STATIC INLINE void _User_extensions_Add_set (
-  User_extensions_Control       *the_extension,
-  rtems_extensions_table *extension_table
+  User_extensions_Control  *the_extension,
+  rtems_extensions_table   *extension_table
 );
 
Index: c/src/exec/score/include/rtems/score/mppkt.h
===================================================================
--- c/src/exec/score/include/rtems/score/mppkt.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/mppkt.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -65,5 +65,5 @@
   Objects_Id              id;
   Objects_Id              source_tid;
-  rtems_task_priority     source_priority;
+  Priority_Control        source_priority;
   rtems_status_code       return_code;
   unsigned32              length;
Index: c/src/exec/score/include/rtems/score/object.h
===================================================================
--- c/src/exec/score/include/rtems/score/object.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/object.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -350,4 +350,17 @@
 
 /*
+ *  _Objects_Get_information
+ *
+ *  DESCRIPTION:
+ *
+ *  Returns the information control block for the class of objects
+ *  corresponding to this id.
+ */
+
+Objects_Information *_Objects_Get_information(
+  Objects_Id  id
+);
+  
+/*
  *  _Objects_Build_id
  *
@@ -405,4 +418,17 @@
 
 /*
+ *  _Objects_Is_class_valid
+ *
+ *  DESCRIPTION:
+ *
+ *  This function returns TRUE if the class is valid.
+ *
+ */
+ 
+STATIC INLINE boolean _Objects_Is_class_valid(
+  Objects_Classes the_class
+);
+
+/*
  *  _Objects_Is_local_node
  *
Index: c/src/exec/score/include/rtems/score/objectmp.h
===================================================================
--- c/src/exec/score/include/rtems/score/objectmp.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/objectmp.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -82,6 +82,23 @@
 );
 
+/*PAGE
+ *
+ *  _Objects_MP_Open
+ *
+ *  DESCRIPTION:
+ *
+ *  This routine place the specified global object in the 
+ *  specified information table.  
+ */
+ 
+void _Objects_MP_Open (
+  Objects_Information *information,
+  Objects_MP_Control  *the_global_object,
+  unsigned32           the_name,      /* XXX -- wrong for variable */
+  Objects_Id           the_id
+);
+
 /*
- *  _Objects_MP_Open
+ *  _Objects_MP_Allocate_and_open
  *
  *  DESCRIPTION:
@@ -93,5 +110,5 @@
  */
 
-boolean _Objects_MP_Open (
+boolean _Objects_MP_Allocate_and_open (
   Objects_Information *information,
   unsigned32           the_name,     /* XXX -- wrong for variable length */
Index: c/src/exec/score/include/rtems/score/priority.h
===================================================================
--- c/src/exec/score/include/rtems/score/priority.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/priority.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -30,5 +30,5 @@
  */
 
-typedef unsigned32 rtems_task_priority;
+typedef unsigned32 Priority_Control;
 
 #define RTEMS_MINIMUM_PRIORITY      1         /* highest thread priority */
@@ -93,5 +93,5 @@
 
 STATIC INLINE boolean _Priority_Is_valid (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -105,5 +105,5 @@
 
 STATIC INLINE unsigned32 _Priority_Major (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -117,5 +117,5 @@
 
 STATIC INLINE unsigned32 _Priority_Minor (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -156,5 +156,5 @@
  */
 
-STATIC INLINE rtems_task_priority _Priority_Get_highest( void );
+STATIC INLINE Priority_Control _Priority_Get_highest( void );
 
 /*
@@ -170,5 +170,5 @@
 STATIC INLINE void _Priority_Initialize_information(
   Priority_Information *the_priority_map,
-  rtems_task_priority      new_priority
+  Priority_Control      new_priority
 );
 
@@ -183,5 +183,5 @@
 
 STATIC INLINE boolean _Priority_Is_group_empty (
-  rtems_task_priority      the_priority
+  Priority_Control      the_priority
 );
 
Index: c/src/exec/score/include/rtems/score/thread.h
===================================================================
--- c/src/exec/score/include/rtems/score/thread.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/thread.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -87,7 +87,5 @@
                    );
 
-typedef Thread ( *Thread_Entry )(
-                      Thread_Argument
-                   );
+typedef Thread ( *Thread_Entry )( );
 
 /*
@@ -96,11 +94,21 @@
  */
 
+typedef enum {
+  THREAD_START_NUMERIC,
+  THREAD_START_POINTER,
+  THREAD_START_BOTH_POINTER_FIRST,
+  THREAD_START_BOTH_NUMERIC_FIRST
+} Thread_Start_types;
+
 typedef struct {
   Thread_Entry         entry_point;      /* starting thread address         */
-  unsigned32           initial_argument; /* initial argument                */
-  rtems_mode           initial_modes;    /* initial mode                    */
-  rtems_task_priority  initial_priority; /* initial priority                */
+  Thread_Start_types   prototype;        /* how task is invoked             */
+  void                *pointer_argument; /* pointer argument                */
+  unsigned32           numeric_argument; /* numeric argument                */
+  Modes_Control        initial_modes;    /* initial mode                    */
+  Priority_Control     initial_priority; /* initial priority                */
+  Stack_Control        Initial_stack;    /* stack information               */
   void                *fp_context;       /* initial FP context area address */
-  Stack_Control        Initial_stack;    /* stack information               */
+  void                *stack;            /* initial FP context area address */
 }   Thread_Start_information;
 
@@ -135,6 +143,6 @@
   Objects_Control          Object;
   States_Control           current_state;
-  rtems_task_priority      current_priority;
-  rtems_task_priority      real_priority;
+  Priority_Control         current_priority;
+  Priority_Control         real_priority;
   unsigned32               resource_count;
   Thread_Wait_information  Wait;
@@ -154,9 +162,19 @@
  */
 
+/* XXX structure in wrong file .. API .. not core */
+
+typedef struct {
+  boolean                   is_global;
+  unsigned32                Notepads[ RTEMS_NUMBER_NOTEPADS ];
+  rtems_event_set           pending_events;
+  rtems_event_set           events_out;
+  ASR_Information           Signal;
+}  RTEMS_API_Control;
+
 typedef struct {
   Objects_Control           Object;
   States_Control            current_state;
-  rtems_task_priority       current_priority;
-  rtems_task_priority       real_priority;
+  Priority_Control          current_priority;
+  Priority_Control          real_priority;
   unsigned32                resource_count;
   Thread_Wait_information   Wait;
@@ -166,13 +184,9 @@
   Chain_Control            *ready;
   Priority_Information      Priority_map;
-  rtems_event_set           pending_events;
-  rtems_event_set           events_out;
   Thread_Start_information  Start;
-  ASR_Information           Signal;
-  rtems_mode                current_modes;
-  rtems_attribute           attribute_set;
+  Modes_Control             current_modes;
   Context_Control           Registers;
   void                     *fp_context;
-  unsigned32                Notepads[ RTEMS_NUMBER_NOTEPADS ];
+  RTEMS_API_Control        *RTEMS_API;
   void                     *extension;
 }   Thread_Control;
@@ -304,4 +318,69 @@
 
 void _Thread_Dispatch( void );
+
+/*
+ *  _Thread_Initialize
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+
+boolean _Thread_Initialize(
+  Objects_Information *information,
+  Thread_Control      *the_thread,
+  void                *stack_area,    /* NULL if to be allocated */
+  unsigned32           stack_size,    /* insure it is >= min */
+  boolean              is_fp,         /* TRUE if thread uses FP */
+  Priority_Control     priority,
+  Modes_Control        mode,
+  Objects_Name         name
+ 
+);
+
+/*
+ *  _Thread_Start
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+boolean _Thread_Start(
+  Thread_Control           *the_thread,
+  Thread_Start_types        the_prototype,
+  void                     *entry_point,
+  void                     *pointer_argument,
+  unsigned32                numeric_argument
+);
+
+/*
+ *  _Thread_Restart
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+/* XXX multiple task arg profiles */
+ 
+boolean _Thread_Restart(
+  Thread_Control           *the_thread,
+  void                     *pointer_argument,
+  unsigned32                numeric_argument
+);
+
+/*
+ *  _Thread_Close
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+void _Thread_Close(
+  Objects_Information  *information,
+  Thread_Control       *the_thread
+);
 
 /*
@@ -494,5 +573,5 @@
 void _Thread_Change_priority (
   Thread_Control   *the_thread,
-  rtems_task_priority  new_priority
+  Priority_Control  new_priority
 );
 
@@ -508,5 +587,5 @@
 void _Thread_Set_priority(
   Thread_Control   *the_thread,
-  rtems_task_priority  new_priority
+  Priority_Control  new_priority
 );
 
@@ -525,7 +604,7 @@
 
 boolean _Thread_Change_mode(
-  rtems_mode  new_mode_set,
-  rtems_mode  mask,
-  rtems_mode *old_mode_set
+  Modes_Control  new_mode_set,
+  Modes_Control  mask,
+  Modes_Control *old_mode_set
 );
 
Index: c/src/exec/score/include/rtems/score/threadq.h
===================================================================
--- c/src/exec/score/include/rtems/score/threadq.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/threadq.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -36,4 +36,17 @@
                  Thread_Control *
              );
+
+/*
+ *  The following type defines the callout used when a local task
+ *  is extracted from a remote thread queue (i.e. it's proxy must
+ *  extracted from the remote queue).
+ */
+ 
+typedef void ( *Thread_queue_Extract_callout )(
+                 Thread_Control *
+             );
+
+EXTERN Thread_queue_Extract_callout  
+  _Thread_queue_Extract_table[ OBJECTS_CLASSES_LAST + 1 ];
 
 /*
@@ -63,5 +76,5 @@
 void _Thread_queue_Enqueue(
   Thread_queue_Control *the_thread_queue,
-  rtems_interval     timeout
+  rtems_interval        timeout
 );
 
@@ -77,4 +90,18 @@
 void _Thread_queue_Extract(
   Thread_queue_Control *the_thread_queue,
+  Thread_Control       *the_thread
+);
+
+/*
+ *  _Thread_queue_Extract_with_proxy
+ *
+ *  DESCRIPTION:
+ *
+ *  This routine extracts the_thread from the_thread_queue
+ *  and insures that if there is a proxy for this task on 
+ *  another node, it is also dealt with.
+ */
+ 
+boolean _Thread_queue_Extract_with_proxy(
   Thread_Control       *the_thread
 );
@@ -119,7 +146,9 @@
 
 void _Thread_queue_Initialize(
-  Thread_queue_Control *the_thread_queue,
-  rtems_attribute    attribute_set,
-  States_Control        state
+  Thread_queue_Control         *the_thread_queue,
+  Objects_Classes               the_class,
+  Thread_queue_Disciplines      the_discipline,
+  States_Control                state,
+  Thread_queue_Extract_callout  proxy_extract_callout
 );
 
Index: c/src/exec/score/include/rtems/score/tqdata.h
===================================================================
--- c/src/exec/score/include/rtems/score/tqdata.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/tqdata.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -32,6 +32,6 @@
 
 typedef enum {
-  THREAD_QUEUE_DATA_FIFO_DISCIPLINE,     /* RTEMS_FIFO queue discipline */
-  THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE  /* RTEMS_PRIORITY queue discipline */
+  THREAD_QUEUE_DISCIPLINE_FIFO,     /* RTEMS_FIFO queue discipline */
+  THREAD_QUEUE_DISCIPLINE_PRIORITY  /* RTEMS_PRIORITY queue discipline */
 }   Thread_queue_Disciplines;
 
@@ -64,5 +64,5 @@
 
 STATIC INLINE unsigned32 _Thread_queue_Header_number (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
@@ -78,5 +78,5 @@
 
 STATIC INLINE boolean _Thread_queue_Is_reverse_search (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 );
 
Index: c/src/exec/score/include/rtems/score/userext.h
===================================================================
--- c/src/exec/score/include/rtems/score/userext.h	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/include/rtems/score/userext.h	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -70,6 +70,6 @@
 
 STATIC INLINE void _User_extensions_Add_set (
-  User_extensions_Control       *the_extension,
-  rtems_extensions_table *extension_table
+  User_extensions_Control  *the_extension,
+  rtems_extensions_table   *extension_table
 );
 
Index: c/src/exec/score/inline/object.inl
===================================================================
--- c/src/exec/score/inline/object.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/object.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -73,4 +73,17 @@
 {
   return (id >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS;
+}
+
+/*PAGE
+ *
+ *  _Objects_Is_class_valid
+ *
+ */
+ 
+STATIC INLINE boolean _Objects_Is_class_valid(
+  Objects_Classes the_class
+)
+{
+  return the_class <= OBJECTS_CLASSES_LAST;
 }
 
Index: c/src/exec/score/inline/priority.inl
===================================================================
--- c/src/exec/score/inline/priority.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/priority.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -42,5 +42,5 @@
 
 STATIC INLINE boolean _Priority_Is_valid (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -56,5 +56,5 @@
 
 STATIC INLINE unsigned32 _Priority_Major (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -69,5 +69,5 @@
 
 STATIC INLINE unsigned32 _Priority_Minor (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -110,5 +110,5 @@
  */
 
-STATIC INLINE rtems_task_priority _Priority_Get_highest( void )
+STATIC INLINE Priority_Control _Priority_Get_highest( void )
 {
   Priority_Bit_map_control minor;
@@ -130,5 +130,5 @@
 STATIC INLINE void _Priority_Initialize_information(
   Priority_Information *the_priority_map,
-  rtems_task_priority      new_priority
+  Priority_Control      new_priority
 )
 {
@@ -159,5 +159,5 @@
 
 STATIC INLINE boolean _Priority_Is_group_empty (
-  rtems_task_priority      the_priority
+  Priority_Control      the_priority
 )
 {
Index: c/src/exec/score/inline/rtems/score/object.inl
===================================================================
--- c/src/exec/score/inline/rtems/score/object.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/rtems/score/object.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -73,4 +73,17 @@
 {
   return (id >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS;
+}
+
+/*PAGE
+ *
+ *  _Objects_Is_class_valid
+ *
+ */
+ 
+STATIC INLINE boolean _Objects_Is_class_valid(
+  Objects_Classes the_class
+)
+{
+  return the_class <= OBJECTS_CLASSES_LAST;
 }
 
Index: c/src/exec/score/inline/rtems/score/priority.inl
===================================================================
--- c/src/exec/score/inline/rtems/score/priority.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/rtems/score/priority.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -42,5 +42,5 @@
 
 STATIC INLINE boolean _Priority_Is_valid (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -56,5 +56,5 @@
 
 STATIC INLINE unsigned32 _Priority_Major (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -69,5 +69,5 @@
 
 STATIC INLINE unsigned32 _Priority_Minor (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -110,5 +110,5 @@
  */
 
-STATIC INLINE rtems_task_priority _Priority_Get_highest( void )
+STATIC INLINE Priority_Control _Priority_Get_highest( void )
 {
   Priority_Bit_map_control minor;
@@ -130,5 +130,5 @@
 STATIC INLINE void _Priority_Initialize_information(
   Priority_Information *the_priority_map,
-  rtems_task_priority      new_priority
+  Priority_Control      new_priority
 )
 {
@@ -159,5 +159,5 @@
 
 STATIC INLINE boolean _Priority_Is_group_empty (
-  rtems_task_priority      the_priority
+  Priority_Control      the_priority
 )
 {
Index: c/src/exec/score/inline/rtems/score/tqdata.inl
===================================================================
--- c/src/exec/score/inline/rtems/score/tqdata.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/rtems/score/tqdata.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -25,5 +25,5 @@
 
 STATIC INLINE unsigned32 _Thread_queue_Header_number (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -38,5 +38,5 @@
 
 STATIC INLINE boolean _Thread_queue_Is_reverse_search (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
Index: c/src/exec/score/inline/rtems/score/userext.inl
===================================================================
--- c/src/exec/score/inline/rtems/score/userext.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/rtems/score/userext.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -42,6 +42,6 @@
 
 STATIC INLINE void _User_extensions_Add_set (
-  User_extensions_Control       *the_extension,
-  rtems_extensions_table *extension_table
+  User_extensions_Control *the_extension,
+  rtems_extensions_table  *extension_table
 )
 {
Index: c/src/exec/score/inline/tqdata.inl
===================================================================
--- c/src/exec/score/inline/tqdata.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/tqdata.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -25,5 +25,5 @@
 
 STATIC INLINE unsigned32 _Thread_queue_Header_number (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
@@ -38,5 +38,5 @@
 
 STATIC INLINE boolean _Thread_queue_Is_reverse_search (
-  rtems_task_priority the_priority
+  Priority_Control the_priority
 )
 {
Index: c/src/exec/score/inline/userext.inl
===================================================================
--- c/src/exec/score/inline/userext.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/inline/userext.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -42,6 +42,6 @@
 
 STATIC INLINE void _User_extensions_Add_set (
-  User_extensions_Control       *the_extension,
-  rtems_extensions_table *extension_table
+  User_extensions_Control *the_extension,
+  rtems_extensions_table  *extension_table
 )
 {
Index: c/src/exec/score/macros/object.inl
===================================================================
--- c/src/exec/score/macros/object.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/macros/object.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -55,4 +55,13 @@
 #define rtems_get_index( _id ) \
   (((_id) >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS)
+
+/*PAGE
+ *
+ *  _Objects_Is_class_valid
+ *
+ */
+ 
+#define _Objects_Is_class_valid( _the_class ) \
+  ( (_the_class) <= OBJECTS_CLASSES_LAST )
 
 /*PAGE
Index: c/src/exec/score/macros/rtems/score/object.inl
===================================================================
--- c/src/exec/score/macros/rtems/score/object.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/macros/rtems/score/object.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -55,4 +55,13 @@
 #define rtems_get_index( _id ) \
   (((_id) >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS)
+
+/*PAGE
+ *
+ *  _Objects_Is_class_valid
+ *
+ */
+ 
+#define _Objects_Is_class_valid( _the_class ) \
+  ( (_the_class) <= OBJECTS_CLASSES_LAST )
 
 /*PAGE
Index: c/src/exec/score/macros/rtems/score/thread.inl
===================================================================
--- c/src/exec/score/macros/rtems/score/thread.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/macros/rtems/score/thread.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -94,5 +94,5 @@
 #define _Thread_Calculate_heir() \
  { \
-   rtems_task_priority  highest; \
+   Priority_Control  highest; \
    \
    _Priority_Get_highest( highest ); \
Index: c/src/exec/score/macros/thread.inl
===================================================================
--- c/src/exec/score/macros/thread.inl	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/macros/thread.inl	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -94,5 +94,5 @@
 #define _Thread_Calculate_heir() \
  { \
-   rtems_task_priority  highest; \
+   Priority_Control  highest; \
    \
    _Priority_Get_highest( highest ); \
Index: c/src/exec/score/src/mpci.c
===================================================================
--- c/src/exec/score/src/mpci.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/src/mpci.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -37,6 +37,8 @@
   _Thread_queue_Initialize(
     &_MPCI_Remote_blocked_threads,
-    RTEMS_FIFO,
-    STATES_WAITING_FOR_RPC_REPLY
+    OBJECTS_NO_CLASS,
+    THREAD_QUEUE_DISCIPLINE_FIFO,
+    STATES_WAITING_FOR_RPC_REPLY,
+    NULL
   );
 }
Index: c/src/exec/score/src/object.c
===================================================================
--- c/src/exec/score/src/object.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/src/object.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -477,2 +477,24 @@
     return 0;
 }
+
+/*PAGE
+ *
+ *  _Objects_Get_information
+ *
+ *  XXX
+ */
+ 
+Objects_Information *_Objects_Get_information(
+  Objects_Id  id
+)
+{
+  Objects_Classes  the_class;
+
+  the_class = rtems_get_class( id );
+
+  if ( !_Objects_Is_class_valid( the_class ) )
+    return NULL;
+
+  return _Objects_Information_table[ the_class ];
+}
+
Index: c/src/exec/score/src/objectmp.c
===================================================================
--- c/src/exec/score/src/objectmp.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/src/objectmp.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -51,31 +51,48 @@
  *
  */
-
-boolean _Objects_MP_Open (
-  Objects_Information *information,
+ 
+void _Objects_MP_Open (
+  Objects_Information *information,
+  Objects_MP_Control  *the_global_object,
   unsigned32           the_name,      /* XXX -- wrong for variable */
-  Objects_Id           the_id,
-  boolean              is_fatal_error
-)
-{
-  Objects_MP_Control  *the_global_object;
-
-  the_global_object = _Objects_MP_Allocate_global_object();
-  if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
-
-    if ( is_fatal_error == FALSE )
-      return FALSE;
-
-    rtems_fatal_error_occurred( RTEMS_TOO_MANY );
-
-  }
-
+  Objects_Id           the_id
+)
+{
   the_global_object->Object.id = the_id;
   the_global_object->name      = the_name;
-
+ 
   _Chain_Prepend(
     &information->global_table[ rtems_get_node( the_id ) ],
     &the_global_object->Object.Node
   );
+
+}
+
+/*PAGE
+ *
+ *  _Objects_MP_Allocate_and_open
+ *
+ */
+
+boolean _Objects_MP_Allocate_and_open (
+  Objects_Information *information,
+  unsigned32           the_name,      /* XXX -- wrong for variable */
+  Objects_Id           the_id,
+  boolean              is_fatal_error
+)
+{
+  Objects_MP_Control  *the_global_object;
+
+  the_global_object = _Objects_MP_Allocate_global_object();
+  if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
+
+    if ( is_fatal_error == FALSE )
+      return FALSE;
+
+    rtems_fatal_error_occurred( RTEMS_TOO_MANY );
+
+  }
+
+  _Objects_MP_Open( information, the_global_object, the_name, the_id );
 
   return TRUE;
Index: c/src/exec/score/src/thread.c
===================================================================
--- c/src/exec/score/src/thread.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/src/thread.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -143,9 +143,9 @@
 void _Thread_Dispatch( void )
 {
-  Thread_Control  *executing;
-  Thread_Control  *heir;
-  ISR_Level               level;
+  Thread_Control   *executing;
+  Thread_Control   *heir;
+  ISR_Level         level;
   rtems_signal_set  signal_set;
-  rtems_mode           previous_mode;
+  Modes_Control     previous_mode;
 
   executing   = _Thread_Executing;
@@ -200,17 +200,17 @@
   _Thread_Dispatch_disable_level = 0;
 
-  if ( _ASR_Are_signals_pending( &executing->Signal ) ) {
-    signal_set                       = executing->Signal.signals_posted;
-    executing->Signal.signals_posted = 0;
+  if ( _ASR_Are_signals_pending( &executing->RTEMS_API->Signal ) ) {
+    signal_set = executing->RTEMS_API->Signal.signals_posted;
+    executing->RTEMS_API->Signal.signals_posted = 0;
     _ISR_Enable( level );
 
-    executing->Signal.nest_level += 1;
-    if (_Thread_Change_mode( executing->Signal.mode_set,
+    executing->RTEMS_API->Signal.nest_level += 1;
+    if (_Thread_Change_mode( executing->RTEMS_API->Signal.mode_set,
                                 RTEMS_ALL_MODE_MASKS, &previous_mode ))
         _Thread_Dispatch();
 
-    (*executing->Signal.handler)( signal_set );
-
-    executing->Signal.nest_level -= 1;
+    (*executing->RTEMS_API->Signal.handler)( signal_set );
+
+    executing->RTEMS_API->Signal.nest_level -= 1;
     if (_Thread_Change_mode( previous_mode,
                                 RTEMS_ALL_MODE_MASKS, &previous_mode ))
@@ -219,4 +219,255 @@
   else
     _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ *  _Thread_Initialize
+ *
+ *  XXX
+ */
+
+boolean _Thread_Initialize(
+  Objects_Information *information,
+  Thread_Control      *the_thread,
+  void                *stack_area,    /* NULL if to be allocated */
+  unsigned32           stack_size,    /* insure it is >= min */
+  boolean              is_fp,         /* TRUE if thread uses FP */
+  Priority_Control     priority,
+  Modes_Control        mode,
+  Objects_Name         name
+  
+)
+{
+  unsigned32           actual_stack_size;
+  void                *stack;
+  void                *fp_area;
+
+  /*
+   *  Allocate and Initialize the stack for this thread.
+   */
+
+  if ( !_Stack_Is_enough( stack_size ) )
+    actual_stack_size = RTEMS_MINIMUM_STACK_SIZE;
+  else
+    actual_stack_size = stack_size;
+
+  actual_stack_size = _Stack_Adjust_size( actual_stack_size );
+  stack             = stack_area;
+
+  if ( !stack ) {
+    stack = _Workspace_Allocate( actual_stack_size );
+ 
+    if ( !stack ) 
+      return FALSE;
+
+    the_thread->Start.stack = stack;
+  } else
+    the_thread->Start.stack = NULL;
+
+  _Stack_Initialize(
+     &the_thread->Start.Initial_stack,
+     stack,
+     actual_stack_size
+  );
+
+  /*
+   *  Allocate the floating point area for this thread
+   */
+  
+  if ( is_fp ) {
+
+    fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
+    if ( !fp_area ) {
+      (void) _Workspace_Free( stack );
+      return FALSE;
+    }
+    fp_area = _Context_Fp_start( fp_area, 0 );
+
+  } else
+    fp_area = NULL;
+
+  the_thread->fp_context       = fp_area;
+  the_thread->Start.fp_context = fp_area;
+  
+/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
+  /*
+   *  Allocate and initialize the RTEMS API specific information
+   */
+ 
+  the_thread->RTEMS_API = _Workspace_Allocate( sizeof( RTEMS_API_Control ) );
+ 
+  if ( !the_thread->RTEMS_API ) {
+/* XXX when in task_create 
+    _RTEMS_tasks_Free( the_thread );
+    _Objects_MP_Free_global_object( the_global_object );
+
+    _Thread_Enable_dispatch();
+    return( RTEMS_UNSATISFIED );
+*/
+      (void) _Workspace_Free( stack );
+      (void) _Workspace_Free( fp_area );
+      return FALSE;
+ 
+  }
+ 
+  the_thread->RTEMS_API->is_global              = FALSE;
+  the_thread->RTEMS_API->pending_events         = EVENT_SETS_NONE_PENDING;
+  _ASR_Initialize( &the_thread->RTEMS_API->Signal );
+
+  /* XXX should not be here .... */
+ 
+/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
+
+  /*
+   *  General initialization
+   */
+
+  the_thread->current_state          = STATES_DORMANT;
+  the_thread->current_modes          = mode;
+  the_thread->resource_count         = 0;
+  the_thread->real_priority          = priority;
+  the_thread->Start.initial_priority = priority;
+  the_thread->Start.initial_modes    = mode;
+ 
+  _Thread_Set_priority( the_thread, priority );
+
+  /*
+   *  Open the object
+   */
+
+  _Objects_Open( information, &the_thread->Object, name );
+
+  /*
+   *  Invoke create extensions
+   */
+
+  _User_extensions_Task_create( the_thread );
+  /* XXX if this fails ... */
+
+  return TRUE;
+}
+
+/*
+ *  _Thread_Start
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+boolean _Thread_Start(
+  Thread_Control       *the_thread,
+  Thread_Start_types    the_prototype,
+  void                 *entry_point,
+  void                 *pointer_argument,
+  unsigned32            numeric_argument
+)
+{
+  if ( _States_Is_dormant( the_thread->current_state ) ) {
+ 
+    the_thread->Start.entry_point      = entry_point;
+   
+    the_thread->Start.prototype        = the_prototype;
+    the_thread->Start.pointer_argument = pointer_argument;
+    the_thread->Start.numeric_argument = numeric_argument;
+ 
+    _Thread_Load_environment( the_thread );
+ 
+    _Thread_Ready( the_thread );
+ 
+    _User_extensions_Task_start( the_thread );
+ 
+    return TRUE;
+  }
+ 
+  return FALSE;
+ 
+}
+
+/*
+ *  _Thread_Restart
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+boolean _Thread_Restart(
+  Thread_Control      *the_thread,
+  void                *pointer_argument,
+  unsigned32           numeric_argument
+)
+{
+  if ( !_States_Is_dormant( the_thread->current_state ) ) {
+ 
+    _Thread_Set_transient( the_thread );
+    the_thread->resource_count = 0;
+    the_thread->current_modes  = the_thread->Start.initial_modes;
+
+    the_thread->Start.pointer_argument = pointer_argument;
+    the_thread->Start.numeric_argument = numeric_argument;
+ 
+    if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
+ 
+      if ( _Watchdog_Is_active( &the_thread->Timer ) )
+        (void) _Watchdog_Remove( &the_thread->Timer );
+    }
+
+    if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
+      the_thread->real_priority = the_thread->Start.initial_priority;
+      _Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
+    }
+ 
+    _Thread_Load_environment( the_thread );
+ 
+    _Thread_Ready( the_thread );
+ 
+    _User_extensions_Task_restart( the_thread );
+ 
+    if ( _Thread_Is_executing ( the_thread ) )
+      _Thread_Restart_self();
+ 
+    return TRUE;
+  }
+ 
+  return FALSE;
+}
+
+/*
+ *  _Thread_Close
+ *
+ *  DESCRIPTION:
+ *
+ *  XXX
+ */
+ 
+void _Thread_Close(
+  Objects_Information  *information,
+  Thread_Control       *the_thread
+)
+{
+  _Objects_Close( information, &the_thread->Object );
+ 
+  _Thread_Set_state( the_thread, STATES_TRANSIENT );
+ 
+  if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
+ 
+    if ( _Watchdog_Is_active( &the_thread->Timer ) )
+      (void) _Watchdog_Remove( &the_thread->Timer );
+  }
+
+  _User_extensions_Task_delete( the_thread );
+ 
+#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
+  if ( _Thread_Is_allocated_fp( the_thread ) )
+    _Thread_Deallocate_fp();
+#endif
+  the_thread->fp_context = NULL;
+
+  (void) _Workspace_Free( the_thread->Start.fp_context );
+
+  if ( the_thread->Start.stack )
+    (void) _Workspace_Free( the_thread->Start.stack );
 }
 
@@ -596,5 +847,24 @@
   _Thread_Enable_dispatch();
  
-  (*executing->Start.entry_point)( executing->Start.initial_argument );
+  switch (  executing->Start.prototype ) {
+    case THREAD_START_NUMERIC:
+      (*executing->Start.entry_point)( executing->Start.numeric_argument );
+      break;
+    case THREAD_START_POINTER:
+      (*executing->Start.entry_point)( executing->Start.pointer_argument );
+      break;
+    case THREAD_START_BOTH_POINTER_FIRST:
+      (*executing->Start.entry_point)( 
+        executing->Start.pointer_argument,
+        executing->Start.numeric_argument
+      );
+      break;
+    case THREAD_START_BOTH_NUMERIC_FIRST:
+      (*executing->Start.entry_point)( 
+        executing->Start.numeric_argument,
+        executing->Start.pointer_argument
+      );
+      break;
+  }
 
   _User_extensions_Task_exitted( executing );
@@ -655,6 +925,6 @@
 
 void _Thread_Change_priority(
-  Thread_Control *the_thread,
-  rtems_task_priority       new_priority
+  Thread_Control   *the_thread,
+  Priority_Control  new_priority
 )
 {
@@ -705,6 +975,6 @@
 
 void _Thread_Set_priority(
-  Thread_Control *the_thread,
-  rtems_task_priority       new_priority
+  Thread_Control   *the_thread,
+  Priority_Control  new_priority
 )
 {
@@ -736,11 +1006,11 @@
 
 boolean _Thread_Change_mode(
-  unsigned32  new_mode_set,
-  unsigned32  mask,
-  unsigned32 *old_mode_set
-)
-{
-  rtems_mode   changed;
-  rtems_mode   threads_new_mode_set;
+  Modes_Control  new_mode_set,
+  Modes_Control  mask,
+  Modes_Control *old_mode_set
+)
+{
+  Modes_Control   changed;
+  Modes_Control   threads_new_mode_set;
   Thread_Control *executing;
   boolean         need_dispatch;
@@ -755,5 +1025,5 @@
 
   if ( _Modes_Mask_changed( changed, RTEMS_ASR_MASK ) )
-    _ASR_Swap_signals( &executing->Signal );
+    _ASR_Swap_signals( &executing->RTEMS_API->Signal );
 
   executing->current_modes = threads_new_mode_set;
@@ -766,5 +1036,5 @@
      _Context_Switch_necessary = TRUE;
 
-  else if ( !_ASR_Are_signals_pending( &executing->Signal ) )
+  else if ( !_ASR_Are_signals_pending( &executing->RTEMS_API->Signal ) )
 
     need_dispatch = FALSE;
Index: c/src/exec/score/src/threadq.c
===================================================================
--- c/src/exec/score/src/threadq.c	(revision 5250ff39f042c09503b61eb81a2c705e9b06b917)
+++ c/src/exec/score/src/threadq.c	(revision 7f6a24abdd1793e394e4d5d49de1f4ca0e00297a)
@@ -31,5 +31,6 @@
  *  Input parameters:
  *    the_thread_queue - pointer to a threadq header
- *    attribute_set    - used to determine queueing discipline
+ *    the_class        - class of the object to which this belongs
+ *    discipline       - queueing discipline
  *    state            - state of waiting threads
  *
@@ -38,24 +39,29 @@
 
 void _Thread_queue_Initialize(
-  Thread_queue_Control *the_thread_queue,
-  rtems_attribute           attribute_set,
-  States_Control               state
+  Thread_queue_Control         *the_thread_queue,
+  Objects_Classes               the_class,
+  Thread_queue_Disciplines      the_discipline,
+  States_Control                state,
+  Thread_queue_Extract_callout  proxy_extract_callout
 )
 {
   unsigned32 index;
 
-  if ( _Attributes_Is_priority( attribute_set ) ) {
-    the_thread_queue->discipline = THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE;
-    for( index=0 ;
-         index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
-         index++)
-      _Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
-  }
-  else {
-    the_thread_queue->discipline = THREAD_QUEUE_DATA_FIFO_DISCIPLINE;
-    _Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
-  }
-
-  the_thread_queue->state = state;
+  _Thread_queue_Extract_table[ the_class ] = proxy_extract_callout;
+
+  the_thread_queue->state      = state;
+  the_thread_queue->discipline = the_discipline;
+
+  switch ( the_discipline ) {
+    case THREAD_QUEUE_DISCIPLINE_FIFO:
+      _Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
+      break;
+    case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+      for( index=0 ;
+           index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+           index++)
+        _Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
+      break;
+  }
 
 }
@@ -108,8 +114,8 @@
 
   switch( the_thread_queue->discipline ) {
-    case THREAD_QUEUE_DATA_FIFO_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_FIFO:
       _Thread_queue_Enqueue_fifo( the_thread_queue, the_thread, timeout );
       break;
-    case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_PRIORITY:
       _Thread_queue_Enqueue_priority(
          the_thread_queue, the_thread, timeout );
@@ -145,8 +151,8 @@
 
   switch ( the_thread_queue->discipline ) {
-    case THREAD_QUEUE_DATA_FIFO_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_FIFO:
       the_thread = _Thread_queue_Dequeue_fifo( the_thread_queue );
       break;
-    case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_PRIORITY:
       the_thread = _Thread_queue_Dequeue_priority( the_thread_queue );
       break;
@@ -172,4 +178,43 @@
 /*PAGE
  *
+ *  _Thread_queue_Extract_with_proxy
+ *
+ *  This routine extracts the_thread from the_thread_queue
+ *  and insures that if there is a proxy for this task on 
+ *  another node, it is also dealt with.
+ *
+ *  XXX
+ */
+ 
+boolean _Thread_queue_Extract_with_proxy(
+  Thread_Control       *the_thread
+)
+{
+  States_Control                state;
+  Objects_Classes               the_class;
+  Thread_queue_Extract_callout  proxy_extract_callout;
+
+  state = the_thread->current_state;
+
+  if ( _States_Is_waiting_on_thread_queue( state ) ) {
+    if ( _States_Is_waiting_for_rpc_reply( state ) &&
+         _States_Is_locally_blocked( state ) ) {
+
+      the_class = rtems_get_class( the_thread->Wait.id );
+
+      proxy_extract_callout = _Thread_queue_Extract_table[ the_class ];
+
+      if ( proxy_extract_callout )
+        (*proxy_extract_callout)( the_thread );
+    }
+    _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/*PAGE
+ *
  *  _Thread_queue_Extract
  *
@@ -192,8 +237,8 @@
 {
   switch ( the_thread_queue->discipline ) {
-    case THREAD_QUEUE_DATA_FIFO_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_FIFO:
       _Thread_queue_Extract_fifo( the_thread_queue, the_thread );
       break;
-    case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_PRIORITY:
       _Thread_queue_Extract_priority( the_thread_queue, the_thread );
       break;
@@ -249,8 +294,8 @@
 
   switch ( the_thread_queue->discipline ) {
-    case THREAD_QUEUE_DATA_FIFO_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_FIFO:
       the_thread = _Thread_queue_First_fifo( the_thread_queue );
       break;
-    case THREAD_QUEUE_DATA_PRIORITY_DISCIPLINE:
+    case THREAD_QUEUE_DISCIPLINE_PRIORITY:
       the_thread = _Thread_queue_First_priority( the_thread_queue );
       break;
@@ -438,14 +483,15 @@
   if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
     _ISR_Enable( level );
-    _Thread_Unblock( the_thread );
   } else {
     _Watchdog_Deactivate( &the_thread->Timer );
     _ISR_Enable( level );
     (void) _Watchdog_Remove( &the_thread->Timer );
-    _Thread_Unblock( the_thread );
-  }
+  }
+
+  _Thread_Unblock( the_thread );
 
   if ( !_Objects_Is_local_id( the_thread->Object.id ) )
     _Thread_MP_Free_proxy( the_thread );
+ 
 }
 
@@ -499,15 +545,15 @@
 )
 {
-  rtems_task_priority       search_priority;
-  Thread_Control *search_thread;
-  ISR_Level              level;
-  Chain_Control  *header;
-  unsigned32             header_index;
-  Chain_Node     *the_node;
-  Chain_Node     *next_node;
-  Chain_Node     *previous_node;
-  Chain_Node     *search_node;
-  rtems_task_priority       priority;
-  States_Control         block_state;
+  Priority_Control  search_priority;
+  Thread_Control   *search_thread;
+  ISR_Level         level;
+  Chain_Control    *header;
+  unsigned32        header_index;
+  Chain_Node       *the_node;
+  Chain_Node       *next_node;
+  Chain_Node       *previous_node;
+  Chain_Node       *search_node;
+  Priority_Control  priority;
+  States_Control    block_state;
 
   _Chain_Initialize_empty( &the_thread->Wait.Block2n );
