Index: cpukit/rtems/src/semrelease.c
===================================================================
--- cpukit/rtems/src/semrelease.c	(revision a2f91f6cb87a5c53d1bb6f3dcb4ad9153078918f)
+++ cpukit/rtems/src/semrelease.c	(revision 3ad5f86cf6803204b98760cdce0c56ef6d79bccd)
@@ -65,7 +65,8 @@
       break;
     case SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL:
-      _CORE_recursive_mutex_Surrender_no_protocol_classic(
+      _CORE_recursive_mutex_Surrender_no_protocol(
         &the_semaphore->Core_control.Mutex.Recursive,
         _Semaphore_Get_operations( the_semaphore ),
+        executing,
         &queue_context
       );
Index: cpukit/score/include/rtems/score/coremuteximpl.h
===================================================================
--- cpukit/score/include/rtems/score/coremuteximpl.h	(revision a2f91f6cb87a5c53d1bb6f3dcb4ad9153078918f)
+++ cpukit/score/include/rtems/score/coremuteximpl.h	(revision 3ad5f86cf6803204b98760cdce0c56ef6d79bccd)
@@ -312,8 +312,8 @@
 }
 
-RTEMS_INLINE_ROUTINE void
-_CORE_recursive_mutex_Surrender_no_protocol_finalize(
+RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Surrender_no_protocol(
   CORE_recursive_mutex_Control  *the_mutex,
   const Thread_queue_Operations *operations,
+  Thread_Control                *executing,
   Thread_queue_Context          *queue_context
 )
@@ -322,4 +322,11 @@
   Thread_Control *new_owner;
 
+  _CORE_mutex_Acquire_critical( &the_mutex->Mutex, queue_context );
+
+  if ( !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) ) {
+    _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
+    return STATUS_NOT_OWNER;
+  }
+
   nest_level = the_mutex->nest_level;
 
@@ -327,5 +334,5 @@
     the_mutex->nest_level = nest_level - 1;
     _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
-    return;
+    return STATUS_SUCCESSFUL;
   }
 
@@ -338,5 +345,5 @@
   if ( new_owner == NULL ) {
     _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
-    return;
+    return STATUS_SUCCESSFUL;
   }
 
@@ -347,44 +354,5 @@
     queue_context
   );
-}
-
-RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Surrender_no_protocol(
-  CORE_recursive_mutex_Control  *the_mutex,
-  const Thread_queue_Operations *operations,
-  Thread_Control                *executing,
-  Thread_queue_Context          *queue_context
-)
-{
-  _CORE_mutex_Acquire_critical( &the_mutex->Mutex, queue_context );
-
-  if ( !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) ) {
-    _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
-    return STATUS_NOT_OWNER;
-  }
-
-  _CORE_recursive_mutex_Surrender_no_protocol_finalize(
-    the_mutex,
-    operations,
-    queue_context
-  );
   return STATUS_SUCCESSFUL;
-}
-
-/*
- * The Classic no protocol recursive mutex has the nice property that everyone
- * can release it.
- */
-RTEMS_INLINE_ROUTINE void _CORE_recursive_mutex_Surrender_no_protocol_classic(
-  CORE_recursive_mutex_Control  *the_mutex,
-  const Thread_queue_Operations *operations,
-  Thread_queue_Context          *queue_context
-)
-{
-  _CORE_mutex_Acquire_critical( &the_mutex->Mutex, queue_context );
-  _CORE_recursive_mutex_Surrender_no_protocol_finalize(
-    the_mutex,
-    operations,
-    queue_context
-  );
 }
 
Index: testsuites/sptests/sp42/init.c
===================================================================
--- testsuites/sptests/sp42/init.c	(revision a2f91f6cb87a5c53d1bb6f3dcb4ad9153078918f)
+++ testsuites/sptests/sp42/init.c	(revision 3ad5f86cf6803204b98760cdce0c56ef6d79bccd)
@@ -25,11 +25,4 @@
 #define MAX_TASKS 20
 
-rtems_task Init(rtems_task_argument argument);
-rtems_task Locker_task(rtems_task_argument unused);
-void do_test(
-  rtems_attribute attr,
-  bool            extract  /* TRUE if extract, not release */
-);
-
 /*
  * Carefully chosen to exercise threadq enqueue/dequeue priority logic.
@@ -37,5 +30,5 @@
  * behavior won't be the same when released.
  */
-rtems_task_priority Priorities_High[MAX_TASKS] = {
+static const rtems_task_priority Priorities_High[MAX_TASKS] = {
   37, 37, 37, 37,       /* backward - more 2-n */
   2, 2, 2, 2,           /* forward - multiple are on 2-n chain */
@@ -46,5 +39,5 @@
 };
 
-rtems_task_priority Priorities_Low[MAX_TASKS] = {
+static const rtems_task_priority Priorities_Low[MAX_TASKS] = {
   13, 13, 13, 13,       /* backward - more 2-n */
   2, 2, 2, 2,           /* forward - multiple are on 2-n chain */
@@ -55,22 +48,35 @@
 };
 
-rtems_task_priority *Priorities;
-
-rtems_id   Semaphore;
-rtems_id   Task_id[ MAX_TASKS ];
-rtems_name Task_name[ MAX_TASKS ];
-
-rtems_task Locker_task(
-  rtems_task_argument unused
+static const int Obtain_order[2][MAX_TASKS] = {
+  { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 },
+  { 4, 5, 6, 7, 9, 10, 11, 12, 13, 8, 16, 17, 18, 19, 0, 1, 2, 3, 15, 14 }
+};
+
+static const rtems_task_priority *Priorities;
+
+static rtems_id   Semaphore;
+static rtems_id   Master;
+static rtems_id   Task_id[ MAX_TASKS ];
+static rtems_name Task_name[ MAX_TASKS ];
+
+static rtems_task_argument Obtain_counter;
+
+static enum {
+ FIFO,
+ PRIORITY
+} Variant;
+
+static rtems_task Locker_task(
+  rtems_task_argument task_index
 )
 {
-  rtems_id          tid;
-  uint32_t          task_index;
-  rtems_status_code status;
+  rtems_id            tid;
+  rtems_status_code   status;
+  rtems_task_argument my_obtain_counter;
 
   status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
   directive_failed( status, "rtems_task_ident" );
 
-  task_index = task_number( tid ) - 1;
+  rtems_test_assert( task_index == task_number( tid ) - 1 );
 
   status = rtems_semaphore_obtain( Semaphore, RTEMS_DEFAULT_OPTIONS, 0 );
@@ -80,18 +86,36 @@
   puts( " - unblocked - OK" );
 
+  status = rtems_task_wake_after( 10 );
+  directive_failed( status, "rtems_task_wake_after" );
+
+  my_obtain_counter = Obtain_counter;
+  rtems_test_assert( task_index == Obtain_order[ Variant ][ Obtain_counter ] );
+  ++Obtain_counter;
+
+  status = rtems_semaphore_release( Semaphore );
+  directive_failed( status, "rtems_semaphore_release" );
+
+  if ( my_obtain_counter == MAX_TASKS - 1 ) {
+    status = rtems_event_transient_send( Master );
+    directive_failed( status, "rtems_event_transient_send" );
+  }
+
   (void) rtems_task_delete( RTEMS_SELF );
 }
 
-void do_test(
+static void do_test(
   rtems_attribute attr,
   bool            extract  /* TRUE if extract, not release */
 )
 {
-  rtems_status_code status;
-  int               i;
+  rtems_status_code   status;
+  rtems_task_argument i;
+
+  Variant = ( ( attr & RTEMS_PRIORITY ) != 0 ? PRIORITY : FIFO );
+  Obtain_counter = 0;
 
   status = rtems_semaphore_create(
     rtems_build_name( 'S', 'E', 'M', '0' ),  /* name = SEM0 */
-    0,                                       /* unlocked */
+    0,                                       /* locked */
     RTEMS_BINARY_SEMAPHORE | attr,           /* mutex w/desired discipline */
     0,                                       /* IGNORED */
@@ -100,6 +124,5 @@
   directive_failed( status, "rtems_semaphore_create" );
 
-  for (i=0 ; i< MAX_TASKS ; i++ ) {
-
+  for (i = 0 ; i < MAX_TASKS ; i++ ) {
     Task_name[ i ] = rtems_build_name(
        'T',
@@ -119,20 +142,10 @@
     directive_failed( status, "rtems_task_create" );
 
-    status = rtems_task_start(
-      Task_id[ i ], Locker_task, (rtems_task_argument)i );
+    status = rtems_task_start( Task_id[ i ], Locker_task, i );
     directive_failed( status, "rtems_task_start" );
-
-    status = rtems_task_wake_after( 10 );
-    directive_failed( status, "rtems_task_wake_after" );
-  }
-
-  for (i=0 ; i< MAX_TASKS ; i++ ) {
-    if ( extract == FALSE ) {
-      status = rtems_semaphore_release( Semaphore );
-      directive_failed( status, "rtems_semaphore_release" );
-
-      status = rtems_task_wake_after( 100 );
-      directive_failed( status, "rtems_task_wake_after" );
-    } else {
+  }
+
+  if ( extract ) {
+    for (i = 0 ; i< MAX_TASKS ; i++ ) {
       status = rtems_task_delete( Task_id[ i ]  );
       directive_failed( status, "rtems_task_delete" );
@@ -140,7 +153,12 @@
   }
 
-  /* one extra release for the initial state */
+  /* do the initial release */
   status = rtems_semaphore_release( Semaphore );
   directive_failed( status, "rtems_semaphore_release" );
+
+  if ( !extract ) {
+    status = rtems_event_transient_receive( RTEMS_WAIT, RTEMS_NO_TIMEOUT );
+    directive_failed( status, "rtems_event_transient_receive" );
+  }
 
   /* now delete the semaphore since no one is waiting and it is unlocked */
@@ -149,9 +167,14 @@
 }
 
-rtems_task Init(
+static rtems_task Init(
   rtems_task_argument argument
 )
 {
+  rtems_task_priority prio;
+  rtems_status_code status;
+
   TEST_BEGIN();
+
+  Master = rtems_task_self();
 
   if (RTEMS_MAXIMUM_PRIORITY == 255)
@@ -164,4 +187,8 @@
   }
 
+  prio = RTEMS_MAXIMUM_PRIORITY - 1;
+  status = rtems_task_set_priority(RTEMS_SELF, prio, &prio);
+  directive_failed( status, "rtems_task_set_priority" );
+
   if ( sizeof(Priorities_Low) / sizeof(rtems_task_priority) != MAX_TASKS ) {
     puts( "Priorities_Low table does not have right number of entries" );
@@ -202,4 +229,6 @@
 #define CONFIGURE_MAXIMUM_SEMAPHORES        1
 
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+
 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
 
Index: testsuites/sptests/sp42/sp42.scn
===================================================================
--- testsuites/sptests/sp42/sp42.scn	(revision a2f91f6cb87a5c53d1bb6f3dcb4ad9153078918f)
+++ testsuites/sptests/sp42/sp42.scn	(revision 3ad5f86cf6803204b98760cdce0c56ef6d79bccd)
@@ -1,3 +1,3 @@
-*** START OF TEST 42 ***
+*** BEGIN OF TEST SP 42 ***
 Exercising blocking discipline w/extract in FIFO order 
 Exercising blocking discipline w/unblock in FIFO order
@@ -45,3 +45,3 @@
 TA15 - unblocked - OK
 TA14 - unblocked - OK
-*** END OF TEST 42 ***
+*** END OF TEST SP 42 ***
