Index: cpukit/rtems/include/rtems/rtems/ratemon.h
===================================================================
--- cpukit/rtems/include/rtems/rtems/ratemon.h	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/include/rtems/rtems/ratemon.h	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -195,4 +195,9 @@
   Objects_Control                         Object;
 
+  /**
+   * @brief Protects the rate monotonic period state.
+   */
+  ISR_LOCK_MEMBER(                        Lock )
+
   /** This is the timer used to provide the unblocking mechanism. */
   Watchdog_Control                        Timer;
Index: cpukit/rtems/include/rtems/rtems/ratemonimpl.h
===================================================================
--- cpukit/rtems/include/rtems/rtems/ratemonimpl.h	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/include/rtems/rtems/ratemonimpl.h	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -70,17 +70,17 @@
 
 RTEMS_INLINE_ROUTINE void _Rate_monotonic_Acquire_critical(
-  Thread_Control   *the_thread,
-  ISR_lock_Context *lock_context
+  Rate_monotonic_Control *the_period,
+  ISR_lock_Context       *lock_context
 )
 {
-  _Thread_Wait_acquire_default_critical( the_thread, lock_context );
+  _ISR_lock_Acquire( &the_period->Lock, lock_context );
 }
 
 RTEMS_INLINE_ROUTINE void _Rate_monotonic_Release(
-  Thread_Control   *the_thread,
-  ISR_lock_Context *lock_context
+  Rate_monotonic_Control *the_period,
+  ISR_lock_Context       *lock_context
 )
 {
-  _Thread_Wait_release_default( the_thread, lock_context );
+  _ISR_lock_Release_and_ISR_enable( &the_period->Lock, lock_context );
 }
 
Index: cpukit/rtems/src/ratemoncancel.c
===================================================================
--- cpukit/rtems/src/ratemoncancel.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/src/ratemoncancel.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -29,16 +29,15 @@
 {
   Per_CPU_Control *cpu_self;
+  Thread_Control  *update_priority;
+
+  _Rate_monotonic_Acquire_critical( the_period, lock_context );
 
   _Watchdog_Per_CPU_remove_relative( &the_period->Timer );
-
-  owner = the_period->owner;
-  _Rate_monotonic_Acquire_critical( owner, lock_context );
   the_period->state = RATE_MONOTONIC_INACTIVE;
+  update_priority = _Scheduler_Cancel_job( the_period->owner );
 
   cpu_self = _Thread_Dispatch_disable_critical( lock_context );
-  _Rate_monotonic_Release( owner, lock_context );
-
-  _Scheduler_Cancel_job( owner );
-
+  _Rate_monotonic_Release( the_period, lock_context );
+  _Thread_Update_priority( update_priority );
   _Thread_Dispatch_enable( cpu_self );
 }
Index: cpukit/rtems/src/ratemoncreate.c
===================================================================
--- cpukit/rtems/src/ratemoncreate.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/src/ratemoncreate.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -63,4 +63,6 @@
   }
 
+  _ISR_lock_Initialize( &the_period->Lock, "Rate Monotonic Period" );
+
   the_period->owner = _Thread_Get_executing();
   the_period->state = RATE_MONOTONIC_INACTIVE;
Index: cpukit/rtems/src/ratemongetstatistics.c
===================================================================
--- cpukit/rtems/src/ratemongetstatistics.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/src/ratemongetstatistics.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -29,5 +29,4 @@
   Rate_monotonic_Control          *the_period;
   ISR_lock_Context                 lock_context;
-  Thread_Control                  *owner;
   const Rate_monotonic_Statistics *src;
 
@@ -41,6 +40,5 @@
   }
 
-  owner = the_period->owner;
-  _Rate_monotonic_Acquire_critical( owner, &lock_context );
+  _Rate_monotonic_Acquire_critical( the_period, &lock_context );
 
   src = &the_period->Statistics;
@@ -54,5 +52,5 @@
   _Timestamp_To_timespec( &src->total_wall_time, &dst->total_wall_time );
 
-  _Rate_monotonic_Release( owner, &lock_context );
+  _Rate_monotonic_Release( the_period, &lock_context );
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/ratemongetstatus.c
===================================================================
--- cpukit/rtems/src/ratemongetstatus.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/src/ratemongetstatus.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -29,5 +29,4 @@
   Rate_monotonic_Control *the_period;
   ISR_lock_Context        lock_context;
-  Thread_Control         *owner;
   rtems_status_code       status;
 
@@ -41,8 +40,7 @@
   }
 
-  owner = the_period->owner;
-  _Rate_monotonic_Acquire_critical( owner, &lock_context );
+  _Rate_monotonic_Acquire_critical( the_period, &lock_context );
 
-  period_status->owner = owner->Object.id;
+  period_status->owner = the_period->owner->Object.id;
   period_status->state = the_period->state;
 
@@ -82,5 +80,5 @@
   }
 
-  _Rate_monotonic_Release( owner, &lock_context );
+  _Rate_monotonic_Release( the_period, &lock_context );
   return status;
 }
Index: cpukit/rtems/src/ratemonperiod.c
===================================================================
--- cpukit/rtems/src/ratemonperiod.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/src/ratemonperiod.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -72,10 +72,9 @@
 {
   Per_CPU_Control *cpu_self;
-  uint64_t deadline;
+  Thread_Control  *update_priority;
+  uint64_t         deadline;
 
   cpu_self = _Thread_Dispatch_disable_critical( lock_context );
-  _Rate_monotonic_Release( owner, lock_context );
-
-  _ISR_lock_ISR_disable( lock_context );
+
   deadline = _Watchdog_Per_CPU_insert_relative(
     &the_period->Timer,
@@ -83,8 +82,8 @@
     next_length
   );
-  _ISR_lock_ISR_enable( lock_context );
-
-  _Scheduler_Release_job( owner, deadline );
-
+  update_priority = _Scheduler_Release_job( owner, deadline );
+
+  _Rate_monotonic_Release( the_period, lock_context );
+  _Thread_Update_priority( update_priority );
   _Thread_Dispatch_enable( cpu_self );
 }
@@ -218,5 +217,5 @@
 
   cpu_self = _Thread_Dispatch_disable_critical( lock_context );
-  _Rate_monotonic_Release( executing, lock_context );
+  _Rate_monotonic_Release( the_period, lock_context );
 
   _Thread_Set_state( executing, STATES_WAITING_FOR_PERIOD );
@@ -279,5 +278,5 @@
   }
 
-  _Rate_monotonic_Acquire_critical( executing, &lock_context );
+  _Rate_monotonic_Acquire_critical( the_period, &lock_context );
 
   state = the_period->state;
@@ -285,5 +284,5 @@
   if ( length == RTEMS_PERIOD_STATUS ) {
     status = _Rate_monotonic_Get_status_for_state( state );
-    _Rate_monotonic_Release( executing, &lock_context );
+    _Rate_monotonic_Release( the_period, &lock_context );
   } else {
     switch ( state ) {
Index: cpukit/rtems/src/ratemonresetstatistics.c
===================================================================
--- cpukit/rtems/src/ratemonresetstatistics.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/src/ratemonresetstatistics.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -27,5 +27,4 @@
   Rate_monotonic_Control *the_period;
   ISR_lock_Context        lock_context;
-  Thread_Control         *owner;
 
   the_period = _Rate_monotonic_Get( id, &lock_context );
@@ -34,8 +33,7 @@
   }
 
-  owner = the_period->owner;
-  _Rate_monotonic_Acquire_critical( owner, &lock_context );
+  _Rate_monotonic_Acquire_critical( the_period, &lock_context );
   _Rate_monotonic_Reset_statistics( the_period );
-  _Rate_monotonic_Release( owner, &lock_context );
+  _Rate_monotonic_Release( the_period, &lock_context );
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/ratemontimeout.c
===================================================================
--- cpukit/rtems/src/ratemontimeout.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/rtems/src/ratemontimeout.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -32,5 +32,5 @@
 
   _ISR_lock_ISR_disable( &lock_context );
-  _Rate_monotonic_Acquire_critical( owner, &lock_context );
+  _Rate_monotonic_Acquire_critical( the_period, &lock_context );
   wait_flags = _Thread_Wait_flags_get( owner );
 
@@ -64,5 +64,5 @@
   } else {
     the_period->state = RATE_MONOTONIC_EXPIRED;
-    _Rate_monotonic_Release( owner, &lock_context );
+    _Rate_monotonic_Release( the_period, &lock_context );
   }
 }
Index: cpukit/score/include/rtems/score/scheduler.h
===================================================================
--- cpukit/score/include/rtems/score/scheduler.h	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/score/include/rtems/score/scheduler.h	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -140,5 +140,5 @@
 
   /** @see _Scheduler_Release_job() */
-  void ( *release_job ) (
+  Thread_Control *( *release_job ) (
     const Scheduler_Control *,
     Thread_Control *,
@@ -147,5 +147,5 @@
 
   /** @see _Scheduler_Cancel_job() */
-  void ( *cancel_job ) (
+  Thread_Control *( *cancel_job ) (
     const Scheduler_Control *,
     Thread_Control *
@@ -534,6 +534,8 @@
  * @param[in] the_thread Unused.
  * @param[in] deadline Unused.
- */
-void _Scheduler_default_Release_job(
+ *
+ * @retval NULL Always.
+ */
+Thread_Control *_Scheduler_default_Release_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
@@ -546,6 +548,8 @@
  * @param[in] scheduler Unused.
  * @param[in] the_thread Unused.
- */
-void _Scheduler_default_Cancel_job(
+ *
+ * @retval NULL Always.
+ */
+Thread_Control *_Scheduler_default_Cancel_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread
Index: cpukit/score/include/rtems/score/schedulercbs.h
===================================================================
--- cpukit/score/include/rtems/score/schedulercbs.h	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/score/include/rtems/score/schedulercbs.h	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -164,18 +164,5 @@
 );
 
-/**
- *  @brief Called when a new job of task is released.
- *
- *  This routine is called when a new job of task is released.
- *  It is called only from Rate Monotonic manager in the beginning
- *  of new period. Deadline has to be shifted and budget replenished.
- *
- *  @param[in] scheduler The scheduler instance.
- *  @param[in] the_thread is the owner of the job.
- *  @param[in] length of the new job from now. If equal to 0,
- *             the job was cancelled or deleted.
- */
-
-void _Scheduler_CBS_Release_job (
+Thread_Control *_Scheduler_CBS_Release_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
Index: cpukit/score/include/rtems/score/scheduleredf.h
===================================================================
--- cpukit/score/include/rtems/score/scheduleredf.h	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/score/include/rtems/score/scheduleredf.h	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -216,18 +216,5 @@
 );
 
-/**
- *  @brief Called when a new job of task is released.
- *
- *  This routine is called when a new job of task is released.
- *  It is called only from Rate Monotonic manager in the beginning
- *  of new period.
- *
- *  @param[in] scheduler The scheduler instance.
- *  @param[in] the_thread is the owner of the job.
- *  @param[in] deadline of the new job from now. If equal to 0,
- *             the job was cancelled or deleted, thus a running task
- *             has to be suspended.
- */
-void _Scheduler_EDF_Release_job(
+Thread_Control *_Scheduler_EDF_Release_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
@@ -235,5 +222,5 @@
 );
 
-void _Scheduler_EDF_Cancel_job(
+Thread_Control *_Scheduler_EDF_Cancel_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread
Index: cpukit/score/include/rtems/score/schedulerimpl.h
===================================================================
--- cpukit/score/include/rtems/score/schedulerimpl.h	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/score/include/rtems/score/schedulerimpl.h	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -497,6 +497,8 @@
  * @param[in] the_thread The thread.
  * @param[in] deadline The deadline in watchdog ticks since boot.
- */
-RTEMS_INLINE_ROUTINE void _Scheduler_Release_job(
+ *
+ * @return The thread to hand over to _Thread_Update_priority().
+ */
+RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Release_job(
   Thread_Control *the_thread,
   uint64_t        deadline
@@ -505,5 +507,9 @@
   const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
 
-  ( *scheduler->Operations.release_job )( scheduler, the_thread, deadline );
+  return ( *scheduler->Operations.release_job )(
+    scheduler,
+    the_thread,
+    deadline
+  );
 }
 
@@ -512,6 +518,8 @@
  *
  * @param[in] the_thread The thread.
- */
-RTEMS_INLINE_ROUTINE void _Scheduler_Cancel_job(
+ *
+ * @return The thread to hand over to _Thread_Update_priority().
+ */
+RTEMS_INLINE_ROUTINE Thread_Control *_Scheduler_Cancel_job(
   Thread_Control *the_thread
 )
@@ -519,5 +527,5 @@
   const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
 
-  ( *scheduler->Operations.cancel_job )( scheduler, the_thread );
+  return ( *scheduler->Operations.cancel_job )( scheduler, the_thread );
 }
 
Index: cpukit/score/src/schedulercbsreleasejob.c
===================================================================
--- cpukit/score/src/schedulercbsreleasejob.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/score/src/schedulercbsreleasejob.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -22,5 +22,5 @@
 #include <rtems/score/schedulercbsimpl.h>
 
-void _Scheduler_CBS_Release_job(
+Thread_Control *_Scheduler_CBS_Release_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
@@ -31,6 +31,4 @@
   Scheduler_CBS_Server *serv_info;
 
-  _Scheduler_EDF_Release_job( scheduler, the_thread, deadline );
-
   node = _Scheduler_CBS_Thread_get_node( the_thread );
   serv_info = node->cbs_server;
@@ -40,3 +38,5 @@
     the_thread->cpu_time_budget = serv_info->parameters.budget;
   }
+
+  return _Scheduler_EDF_Release_job( scheduler, the_thread, deadline );
 }
Index: cpukit/score/src/schedulerdefaultreleasejob.c
===================================================================
--- cpukit/score/src/schedulerdefaultreleasejob.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/score/src/schedulerdefaultreleasejob.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -22,5 +22,5 @@
 #include <rtems/score/scheduler.h>
 
-void _Scheduler_default_Release_job(
+Thread_Control *_Scheduler_default_Release_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
@@ -31,7 +31,9 @@
   (void) the_thread;
   (void) deadline;
+
+  return NULL;
 }
 
-void _Scheduler_default_Cancel_job(
+Thread_Control *_Scheduler_default_Cancel_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread
@@ -40,3 +42,5 @@
   (void) scheduler;
   (void) the_thread;
+
+  return NULL;
 }
Index: cpukit/score/src/scheduleredfreleasejob.c
===================================================================
--- cpukit/score/src/scheduleredfreleasejob.c	(revision ca783bbe4c38f16bf98205604b364e69dbb35ee6)
+++ cpukit/score/src/scheduleredfreleasejob.c	(revision ee0e41355d1faa5f74085effc4f57c3a7fc1f884)
@@ -43,5 +43,5 @@
 }
 
-void _Scheduler_EDF_Release_job(
+Thread_Control *_Scheduler_EDF_Release_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
@@ -49,5 +49,5 @@
 )
 {
-  _Thread_Change_priority(
+  return _Thread_Apply_priority(
     the_thread,
     deadline,
@@ -80,10 +80,10 @@
 }
 
-void _Scheduler_EDF_Cancel_job(
+Thread_Control *_Scheduler_EDF_Cancel_job(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread
 )
 {
-  _Thread_Change_priority(
+  return _Thread_Apply_priority(
     the_thread,
     0,
