Index: cpukit/score/Makefile.am
===================================================================
--- cpukit/score/Makefile.am	(revision 03c1038edbe9b01a72d4775dcb6ffc1a03193a0c)
+++ cpukit/score/Makefile.am	(revision fef3ea9e87c01f7720a54d966f7c10fb85deea23)
@@ -184,5 +184,4 @@
 ## CORE_MUTEX_C_FILES
 libscore_a_SOURCES += src/coremutexseize.c
-libscore_a_SOURCES += src/coremutexsurrender.c
 
 ## CORE_PERCPU_C_FILES
Index: cpukit/score/include/rtems/score/coremuteximpl.h
===================================================================
--- cpukit/score/include/rtems/score/coremuteximpl.h	(revision 03c1038edbe9b01a72d4775dcb6ffc1a03193a0c)
+++ cpukit/score/include/rtems/score/coremuteximpl.h	(revision fef3ea9e87c01f7720a54d966f7c10fb85deea23)
@@ -115,12 +115,4 @@
 );
 
-Status_Control _CORE_mutex_Surrender_slow(
-  CORE_mutex_Control   *the_mutex,
-  Thread_Control       *executing,
-  Thread_queue_Heads   *heads,
-  bool                  keep_priority,
-  Thread_queue_Context *queue_context
-);
-
 RTEMS_INLINE_ROUTINE void _CORE_mutex_Set_owner(
   CORE_mutex_Control *the_mutex,
@@ -263,11 +255,13 @@
   }
 
-  return _CORE_mutex_Surrender_slow(
-    &the_mutex->Mutex,
+  _Thread_queue_Surrender(
+    &the_mutex->Mutex.Wait_queue.Queue,
+    CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
+    heads,
     executing,
-    heads,
     keep_priority,
     queue_context
   );
+  return STATUS_SUCCESSFUL;
 }
 
Index: cpukit/score/include/rtems/score/threadqimpl.h
===================================================================
--- cpukit/score/include/rtems/score/threadqimpl.h	(revision 03c1038edbe9b01a72d4775dcb6ffc1a03193a0c)
+++ cpukit/score/include/rtems/score/threadqimpl.h	(revision fef3ea9e87c01f7720a54d966f7c10fb85deea23)
@@ -710,4 +710,31 @@
 void _Thread_queue_Extract_with_proxy(
   Thread_Control       *the_thread
+);
+
+/**
+ * @brief Surrenders the thread queue previously owned by the thread to the
+ * first enqueued thread if it exists.
+ *
+ * The owner of the thread queue must be set to NULL by the caller.
+ *
+ * This function releases the thread queue lock.  In addition it performs a
+ * thread dispatch if necessary.
+ *
+ * @param[in] queue The actual thread queue.
+ * @param[in] operations The thread queue operations.
+ * @param[in] heads The thread queue heads.
+ * @param[in] previous_owner The previous owner thread surrendering the thread
+ *   queue.
+ * @param[in] keep_priority Indicates if the previous owner thread should keep
+ *   its current priority.
+ * @param[in] queue_context The thread queue context of the lock acquire.
+ */
+void _Thread_queue_Surrender(
+  Thread_queue_Queue            *queue,
+  const Thread_queue_Operations *operations,
+  Thread_queue_Heads            *heads,
+  Thread_Control                *previous_owner,
+  bool                           keep_priority,
+  Thread_queue_Context          *queue_context
 );
 
Index: ukit/score/src/coremutexsurrender.c
===================================================================
--- cpukit/score/src/coremutexsurrender.c	(revision 03c1038edbe9b01a72d4775dcb6ffc1a03193a0c)
+++ 	(revision )
@@ -1,75 +1,0 @@
-/**
- * @file
- *
- * @brief Surrender the Mutex
- * @ingroup ScoreMutex
- */
-
-/*
- *  COPYRIGHT (c) 1989-2006.
- *  On-Line Applications Research Corporation (OAR).
- *
- *  The license and distribution terms for this file may be
- *  found in the file LICENSE in this distribution or at
- *  http://www.rtems.org/license/LICENSE.
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <rtems/score/coremuteximpl.h>
-
-Status_Control _CORE_mutex_Surrender_slow(
-  CORE_mutex_Control   *the_mutex,
-  Thread_Control       *executing,
-  Thread_queue_Heads   *heads,
-  bool                  keep_priority,
-  Thread_queue_Context *queue_context
-)
-{
-  if ( heads != NULL ) {
-    const Thread_queue_Operations *operations;
-    Thread_Control                *new_owner;
-    bool                           unblock;
-
-    operations = CORE_MUTEX_TQ_OPERATIONS;
-    new_owner = ( *operations->first )( heads );
-
-    _CORE_mutex_Set_owner( the_mutex, new_owner );
-
-#if defined(RTEMS_MULTIPROCESSING)
-    if ( _Objects_Is_local_id( new_owner->Object.id ) )
-#endif
-    {
-      ++new_owner->resource_count;
-      _Thread_queue_Boost_priority( &the_mutex->Wait_queue.Queue, new_owner );
-    }
-
-    unblock = _Thread_queue_Extract_locked(
-      &the_mutex->Wait_queue.Queue,
-      operations,
-      new_owner,
-      queue_context
-    );
-
-    _Thread_queue_Unblock_critical(
-      unblock,
-      &the_mutex->Wait_queue.Queue,
-      new_owner,
-      &queue_context->Lock_context
-    );
-  } else {
-    _CORE_mutex_Release( the_mutex, queue_context );
-  }
-
-  if ( !keep_priority ) {
-    Per_CPU_Control *cpu_self;
-
-    cpu_self = _Thread_Dispatch_disable();
-    _Thread_Restore_priority( executing );
-    _Thread_Dispatch_enable( cpu_self );
-  }
-
-  return STATUS_SUCCESSFUL;
-}
Index: cpukit/score/src/mutex.c
===================================================================
--- cpukit/score/src/mutex.c	(revision 03c1038edbe9b01a72d4775dcb6ffc1a03193a0c)
+++ cpukit/score/src/mutex.c	(revision fef3ea9e87c01f7720a54d966f7c10fb85deea23)
@@ -122,48 +122,4 @@
 }
 
-static void _Mutex_Release_slow(
-  Mutex_Control        *mutex,
-  Thread_Control       *executing,
-  Thread_queue_Heads   *heads,
-  bool                  keep_priority,
-  Thread_queue_Context *queue_context
-)
-{
-  if (heads != NULL) {
-    const Thread_queue_Operations *operations;
-    Thread_Control                *first;
-    bool                           unblock;
-
-    operations = MUTEX_TQ_OPERATIONS;
-    first = ( *operations->first )( heads );
-
-    mutex->Queue.Queue.owner = first;
-    ++first->resource_count;
-    _Thread_queue_Boost_priority( &mutex->Queue.Queue, first );
-    unblock = _Thread_queue_Extract_locked(
-      &mutex->Queue.Queue,
-      operations,
-      first,
-      queue_context
-    );
-    _Thread_queue_Unblock_critical(
-      unblock,
-      &mutex->Queue.Queue,
-      first,
-      &queue_context->Lock_context
-    );
-  } else {
-    _Mutex_Queue_release( mutex, queue_context );
-  }
-
-  if ( !keep_priority ) {
-    Per_CPU_Control *cpu_self;
-
-    cpu_self = _Thread_Dispatch_disable();
-    _Thread_Restore_priority( executing );
-    _Thread_Dispatch_enable( cpu_self );
-  }
-}
-
 static void _Mutex_Release_critical(
   Mutex_Control        *mutex,
@@ -193,8 +149,9 @@
     _Mutex_Queue_release( mutex, queue_context );
   } else {
-    _Mutex_Release_slow(
-      mutex,
+    _Thread_queue_Surrender(
+      &mutex->Queue.Queue,
+      MUTEX_TQ_OPERATIONS,
+      heads,
       executing,
-      heads,
       keep_priority,
       queue_context
Index: cpukit/score/src/threadqenqueue.c
===================================================================
--- cpukit/score/src/threadqenqueue.c	(revision 03c1038edbe9b01a72d4775dcb6ffc1a03193a0c)
+++ cpukit/score/src/threadqenqueue.c	(revision fef3ea9e87c01f7720a54d966f7c10fb85deea23)
@@ -569,4 +569,54 @@
 }
 
+void _Thread_queue_Surrender(
+  Thread_queue_Queue            *queue,
+  const Thread_queue_Operations *operations,
+  Thread_queue_Heads            *heads,
+  Thread_Control                *previous_owner,
+  bool                           keep_priority,
+  Thread_queue_Context          *queue_context
+)
+{
+  if ( heads != NULL ) {
+    Thread_Control *new_owner;
+    bool            unblock;
+
+    new_owner = ( *operations->first )( heads );
+    queue->owner = new_owner;
+
+#if defined(RTEMS_MULTIPROCESSING)
+    if ( _Objects_Is_local_id( new_owner->Object.id ) )
+#endif
+    {
+      ++new_owner->resource_count;
+      _Thread_queue_Boost_priority( queue, new_owner );
+    }
+
+    unblock = _Thread_queue_Extract_locked(
+      queue,
+      operations,
+      new_owner,
+      queue_context
+    );
+
+    _Thread_queue_Unblock_critical(
+      unblock,
+      queue,
+      new_owner,
+      &queue_context->Lock_context
+    );
+  } else {
+    _Thread_queue_Queue_release( queue, &queue_context->Lock_context );
+  }
+
+  if ( !keep_priority ) {
+    Per_CPU_Control *cpu_self;
+
+    cpu_self = _Thread_Dispatch_disable();
+    _Thread_Restore_priority( previous_owner );
+    _Thread_Dispatch_enable( cpu_self );
+  }
+}
+
 Thread_Control *_Thread_queue_Do_dequeue(
   Thread_queue_Control          *the_thread_queue,
