Index: cpukit/posix/include/rtems/posix/priorityimpl.h
===================================================================
--- cpukit/posix/include/rtems/posix/priorityimpl.h	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/include/rtems/posix/priorityimpl.h	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -31,27 +31,8 @@
  * @ingroup POSIXAPI
  *
- * @brief Interface to the POSIX Priority Implementation
- * 
+ * @brief Interface to the POSIX Priority Implementation.
+ *
+ * @{
  */
-/**@{**/
-
-/**
- * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
- *
- * "Numerically higher values represent higher priorities."
- *
- * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
- *
- * There are only 254 posix priority levels since a task at priority level
- * 255 would never run because of the RTEMS idle task.  This is necessary
- * because GNAT maps the lowest Ada task priority to the lowest thread
- * priority.  The lowest priority Ada task should get to run, so there is
- * a fundamental conflict with having 255 priorities.
- *
- * But since RTEMS can be configured with fewer than 256 priorities,
- * we use the internal constant.
- */
-#define POSIX_SCHEDULER_MAXIMUM_PRIORITY (PRIORITY_MAXIMUM - 1)
-
 
 /**
@@ -73,51 +54,41 @@
  * @brief Check if POSIX priority is valid.
  * 
- * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
+ * According to POSIX, numerically higher values represent higher priorities.
+ * Thus, SuperCore has priorities run in the opposite sense of the POSIX API.
  *
- * "Numerically higher values represent higher priorities."
+ * Let N be the maximum priority of this scheduler instance.   The SuperCore
+ * priority zero is system reserved (PRIORITY_PSEUDO_ISR).  There are only
+ * N - 1 POSIX API priority levels since a thread at SuperCore priority N would
+ * never run because of the idle threads.  This is necessary because GNAT maps
+ * the lowest Ada task priority to the lowest thread priority.  The lowest
+ * priority Ada task should get to run, so there is a fundamental conflict with
+ * having N priorities.
  *
- * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
+ * @param[in] scheduler The scheduler instance.
+ * @param[in] priority The POSIX API priority to test.
  *
- * @param[in] priority is the priority to test
- *
- * @retval TRUE The priority is valid.
- * @retval FALSE The priority is invalid.
+ * @retval true The priority is valid.
+ * @retval false Otherwise.
  */
 bool _POSIX_Priority_Is_valid(
-  int priority
+  const Scheduler_Control *scheduler,
+  int                      priority
 );
 
 /**
- * @brief Convert POSIX priority to SuperCore priority.
+ * @brief Converts the SuperCore priority to the corresponding POSIX API
+ * priority.
  *
- * This method converts a POSIX API priority into onto the corresponding
- * SuperCore value.
+ * @param[in] scheduler The scheduler instance.
+ * @param[in] priority The SuperCore priority to convert.
  *
- * @param[in] priority is the POSIX API priority.
- *
- * @return This method returns the corresponding SuperCore priority.
+ * @return The corresponding POSIX API priority.
  */
-RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
-  int priority
+RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
+  const Scheduler_Control *scheduler,
+  Priority_Control         priority
 )
 {
-  return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
-}
-
-/**
- * @brief Convert SuperCore priority To POSIX priority.
- *
- * This method converts a SuperCore priority into onto the corresponding
- * POSIX API value.
- *
- * @param[in] priority is the POSIX API priority.
- *
- * @return This method returns the corresponding POSIX priority.
- */
-RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
-  Priority_Control priority
-)
-{
-  return (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1);
+  return (int) ( scheduler->maximum_priority - priority );
 }
 
Index: cpukit/posix/src/mutexgetprioceiling.c
===================================================================
--- cpukit/posix/src/mutexgetprioceiling.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/mutexgetprioceiling.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -47,4 +47,5 @@
 
   *prioceiling = _POSIX_Priority_From_core(
+    &_Scheduler_Table[ 0 ],
     the_mutex->Mutex.priority_ceiling
   );
Index: cpukit/posix/src/mutexinit.c
===================================================================
--- cpukit/posix/src/mutexinit.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/mutexinit.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -21,4 +21,5 @@
 #include <rtems/posix/muteximpl.h>
 #include <rtems/posix/priorityimpl.h>
+#include <rtems/score/schedulerimpl.h>
 
 /**
@@ -116,9 +117,9 @@
     }
 
-    if ( !_POSIX_Priority_Is_valid( prio_ceiling ) ) {
+    if ( !_POSIX_Priority_Is_valid( scheduler, prio_ceiling ) ) {
       return EINVAL;
     }
 
-    priority = _POSIX_Priority_To_core( prio_ceiling );
+    priority = _POSIX_Priority_To_core( scheduler, prio_ceiling );
   }
 
Index: cpukit/posix/src/mutexsetprioceiling.c
===================================================================
--- cpukit/posix/src/mutexsetprioceiling.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/mutexsetprioceiling.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -32,15 +32,11 @@
 )
 {
-  register POSIX_Mutex_Control *the_mutex;
-  Priority_Control              the_priority;
-  int                           error;
+  POSIX_Mutex_Control     *the_mutex;
+  const Scheduler_Control *scheduler;
+  int                      error;
+  int                      unlock_error;
 
   if ( !old_ceiling )
     return EINVAL;
-
-  if ( !_POSIX_Priority_Is_valid( prioceiling ) )
-    return EINVAL;
-
-  the_priority = _POSIX_Priority_To_core( prioceiling );
 
   /*
@@ -57,12 +53,25 @@
   _Assert( the_mutex != NULL );
 
+  scheduler = &_Scheduler_Table[ 0 ];
+
   *old_ceiling = _POSIX_Priority_From_core(
+    scheduler,
     the_mutex->Mutex.priority_ceiling
   );
-  the_mutex->Mutex.priority_ceiling = the_priority;
 
-  error = pthread_mutex_unlock( mutex );
-  _Assert( error == 0 );
-  (void) error;
-  return 0;
+  if ( _POSIX_Priority_Is_valid( scheduler, prioceiling ) ) {
+    Priority_Control priority;
+
+    priority = _POSIX_Priority_To_core( scheduler, prioceiling );
+    the_mutex->Mutex.priority_ceiling = priority;
+
+    error = 0;
+  } else {
+    error = EINVAL;
+  }
+
+  unlock_error = pthread_mutex_unlock( mutex );
+  _Assert( unlock_error == 0 );
+  (void) unlock_error;
+  return error;
 }
Index: cpukit/posix/src/psxpriorityisvalid.c
===================================================================
--- cpukit/posix/src/psxpriorityisvalid.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/psxpriorityisvalid.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -31,10 +31,10 @@
 
 bool _POSIX_Priority_Is_valid(
-  int priority
+  const Scheduler_Control *scheduler,
+  int                      priority
 )
 {
-  return ((priority >= POSIX_SCHEDULER_MINIMUM_PRIORITY) &&
-          (priority <= POSIX_SCHEDULER_MAXIMUM_PRIORITY));
-
+  return priority >= POSIX_SCHEDULER_MINIMUM_PRIORITY
+    && (Priority_Control) priority < scheduler->maximum_priority;
 }
 
Index: cpukit/posix/src/pthread.c
===================================================================
--- cpukit/posix/src/pthread.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/pthread.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -38,6 +38,7 @@
 #include <rtems/posix/config.h>
 #include <rtems/posix/keyimpl.h>
+#include <rtems/score/assert.h>
 #include <rtems/score/cpusetimpl.h>
-#include <rtems/score/assert.h>
+#include <rtems/score/schedulerimpl.h>
 
 Thread_Information _POSIX_Threads_Information;
@@ -183,4 +184,5 @@
   _POSIX_Threads_Initialize_attributes( &api->Attributes );
   api->Attributes.schedparam.sched_priority = _POSIX_Priority_From_core(
+    _Scheduler_Get_own( created ),
     created->current_priority
   );
Index: cpukit/posix/src/pthreadcreate.c
===================================================================
--- cpukit/posix/src/pthreadcreate.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/pthreadcreate.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -71,4 +71,5 @@
   Thread_Control                     *the_thread;
   Thread_Control                     *executing;
+  const Scheduler_Control            *scheduler;
   POSIX_API_Control                  *api;
   int                                 schedpolicy = SCHED_RR;
@@ -152,14 +153,16 @@
   }
 
-  if ( !_POSIX_Priority_Is_valid( low_prio ) ) {
-    return EINVAL;
-  }
-
-  if ( !_POSIX_Priority_Is_valid( high_prio ) ) {
-    return EINVAL;
-  }
-
-  core_low_prio = _POSIX_Priority_To_core( low_prio );
-  core_high_prio = _POSIX_Priority_To_core( high_prio );
+  scheduler = _Scheduler_Get_own( executing );
+
+  if ( !_POSIX_Priority_Is_valid( scheduler, low_prio ) ) {
+    return EINVAL;
+  }
+
+  if ( !_POSIX_Priority_Is_valid( scheduler, high_prio ) ) {
+    return EINVAL;
+  }
+
+  core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio );
+  core_high_prio = _POSIX_Priority_To_core( scheduler, high_prio );
 
 #if defined(RTEMS_SMP)
Index: cpukit/posix/src/pthreadgetschedparam.c
===================================================================
--- cpukit/posix/src/pthreadgetschedparam.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/pthreadgetschedparam.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -27,4 +27,5 @@
 #include <rtems/posix/pthreadimpl.h>
 #include <rtems/posix/priorityimpl.h>
+#include <rtems/score/schedulerimpl.h>
 #include <rtems/score/threadimpl.h>
 
@@ -35,7 +36,9 @@
 )
 {
-  Thread_Control    *the_thread;
-  ISR_lock_Context   lock_context;
-  POSIX_API_Control *api;
+  Thread_Control          *the_thread;
+  ISR_lock_Context         lock_context;
+  POSIX_API_Control       *api;
+  const Scheduler_Control *scheduler;
+  Priority_Control         priority;
 
   if ( policy == NULL || param == NULL ) {
@@ -55,9 +58,11 @@
   *policy = api->Attributes.schedpolicy;
   *param  = api->Attributes.schedparam;
-  param->sched_priority = _POSIX_Priority_From_core(
-    the_thread->real_priority
-  );
+
+  scheduler = _Scheduler_Get_own( the_thread );
+  priority = the_thread->real_priority;
 
   _Thread_Lock_release_default( the_thread, &lock_context );
+
+  param->sched_priority = _POSIX_Priority_From_core( scheduler, priority );
   return 0;
 }
Index: cpukit/posix/src/pthreadsetschedparam.c
===================================================================
--- cpukit/posix/src/pthreadsetschedparam.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/pthreadsetschedparam.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -29,4 +29,5 @@
 #include <rtems/posix/priorityimpl.h>
 #include <rtems/score/threadimpl.h>
+#include <rtems/score/schedulerimpl.h>
 
 typedef struct {
@@ -46,4 +47,5 @@
   POSIX_Set_sched_param_context *context;
   const struct sched_param      *param;
+  const Scheduler_Control       *scheduler;
   POSIX_API_Control             *api;
   int                            low_prio;
@@ -55,4 +57,5 @@
   context = arg;
   param = context->param;
+  scheduler = _Scheduler_Get_own( the_thread );
 
   if ( context->policy == SCHED_SPORADIC ) {
@@ -64,16 +67,16 @@
   }
 
-  if ( !_POSIX_Priority_Is_valid( low_prio ) ) {
+  if ( !_POSIX_Priority_Is_valid( scheduler, low_prio ) ) {
     context->error = EINVAL;
     return false;
   }
 
-  if ( !_POSIX_Priority_Is_valid( high_prio ) ) {
+  if ( !_POSIX_Priority_Is_valid( scheduler, high_prio ) ) {
     context->error = EINVAL;
     return false;
   }
 
-  core_low_prio = _POSIX_Priority_To_core( low_prio );
-  core_high_prio = _POSIX_Priority_To_core( high_prio );
+  core_low_prio = _POSIX_Priority_To_core( scheduler, low_prio );
+  core_high_prio = _POSIX_Priority_To_core( scheduler, high_prio );
 
   *new_priority_p = core_high_prio;
Index: cpukit/posix/src/pthreadsetschedprio.c
===================================================================
--- cpukit/posix/src/pthreadsetschedprio.c	(revision eec08efc9048111f47f42142c30a92683bf6756c)
+++ cpukit/posix/src/pthreadsetschedprio.c	(revision 5a32c486f9b7bd8687af253931b47d7abb091bc3)
@@ -17,4 +17,5 @@
 #include <rtems/posix/threadsup.h>
 #include <rtems/score/threadimpl.h>
+#include <rtems/score/schedulerimpl.h>
 
 typedef struct {
@@ -31,4 +32,5 @@
   POSIX_Set_sched_prio_context *context;
   int                           prio;
+  const Scheduler_Control      *scheduler;
   POSIX_API_Control            *api;
   Priority_Control              current_priority;
@@ -37,11 +39,12 @@
   context = arg;
   prio = context->prio;
+  scheduler = _Scheduler_Get_own( the_thread );
 
-  if ( !_POSIX_Priority_Is_valid( prio ) ) {
+  if ( !_POSIX_Priority_Is_valid( scheduler, prio ) ) {
     context->error = EINVAL;
     return false;
   }
 
-  new_priority = _POSIX_Priority_To_core( prio );
+  new_priority = _POSIX_Priority_To_core( scheduler, prio );
   *new_priority_p = new_priority;
 
