diff --git a/include/rti_me/osapi/osapi_mutex.h b/include/rti_me/osapi/osapi_mutex.h
index e8ed485..9889149 100644
--- a/include/rti_me/osapi/osapi_mutex.h
+++ b/include/rti_me/osapi/osapi_mutex.h
@@ -43,16 +43,6 @@ extern "C"
  */
 struct OSAPI_Mutex;
 
-/*e \ingroup OSAPI_MutexClass
- * The Mutex base-class
- */
-struct OSAPI_MutexBase
-{
-    RTI_INT32 depth;
-    RTI_BOOL owned;
-    OSAPI_ThreadId owner;
-};
-
 /*e \ingroup OSAPI_MutexClass
  *  Abstract Mutex type
  */
diff --git a/source/unix/include/osapi/osapi_mutex.h b/source/unix/include/osapi/osapi_mutex.h
index e8ed485..9889149 100644
--- a/source/unix/include/osapi/osapi_mutex.h
+++ b/source/unix/include/osapi/osapi_mutex.h
@@ -43,16 +43,6 @@ extern "C"
  */
 struct OSAPI_Mutex;
 
-/*e \ingroup OSAPI_MutexClass
- * The Mutex base-class
- */
-struct OSAPI_MutexBase
-{
-    RTI_INT32 depth;
-    RTI_BOOL owned;
-    OSAPI_ThreadId owner;
-};
-
 /*e \ingroup OSAPI_MutexClass
  *  Abstract Mutex type
  */
diff --git a/source/unix/src/osapi/common/Mutex.c b/source/unix/src/osapi/common/Mutex.c
index 511ad95..3ad876e 100644
--- a/source/unix/src/osapi/common/Mutex.c
+++ b/source/unix/src/osapi/common/Mutex.c
@@ -15,128 +15,107 @@
  */
 #include "osapi/osapi_config.h"
 
+#include "osapi/osapi_mutex.h"
+
+#include <pthread.h>
 
-#ifndef osapi_heap_h
 #include "osapi/osapi_heap.h"
-#endif
-#ifndef osapi_mutex_h
-#include "osapi/osapi_mutex.h"
-#endif
-#ifndef osapi_string_h
-#include "osapi/osapi_string.h"
-#endif
-#ifndef osapi_log_h
-#include "osapi/osapi_log.h"
-#endif
 
-#include "Mutex.h"
+struct OSAPI_Mutex {
+    pthread_mutex_t mutex;
+};
 
-void
-OSAPI_Mutex_initialize(struct OSAPI_Mutex *self)
+#ifndef RTI_CERT
+RTI_BOOL
+OSAPI_Mutex_delete(OSAPI_Mutex_T *self)
 {
-    struct OSAPI_MutexBase *base = (struct OSAPI_MutexBase*)self;
+    if (pthread_mutex_destroy(&self->mutex))
+        return RTI_FALSE;
 
-    base->depth = 0;
-    base->owned = RTI_FALSE;
+    OSAPI_Heap_free(self);
+    return RTI_TRUE;
 }
+#endif
 
-void
-OSAPI_Mutex_finalize(struct OSAPI_Mutex *base)
+OSAPI_Mutex_T*
+OSAPI_Mutex_new()
 {
-    UNUSED_ARG(base);
-}
+    OSAPI_Mutex_T *self = NULL;
+    OSAPI_Heap_allocate_struct(&self, OSAPI_Mutex_T);
+    if (!self)
+        return NULL;
 
-RTI_PRIVATE RTI_BOOL
-OSAPI_Mutex_is_owned(struct OSAPI_Mutex *self)
-{
-    struct OSAPI_MutexBase *base = (struct OSAPI_MutexBase*)self;
-    OSAPI_ThreadId thread_self = OSAPI_Thread_self();
 
-    return base->owned && !OSAPI_Memory_compare(&base->owner,&thread_self,
-                                                sizeof(thread_self));
+    pthread_mutexattr_t attr;
+    if (pthread_mutexattr_init(&attr)) {
+        OSAPI_Heap_free_struct(self);
+        return NULL;
+    }
+
+    if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) {
+        (void)pthread_mutexattr_destroy(&attr);
+        OSAPI_Heap_free_struct(self);
+        return NULL;
+    }
+
+    if (pthread_mutex_init(&self->mutex, &attr)) {
+        (void)pthread_mutexattr_destroy(&attr);
+        OSAPI_Heap_free_struct(self);
+        return NULL;
+    }
+
+    (void)pthread_mutexattr_destroy(&attr);
+    return self;
 }
 
 RTI_BOOL
 OSAPI_Mutex_take(OSAPI_Mutex_T *self)
 {
-    struct OSAPI_MutexBase *base = (struct OSAPI_MutexBase*)self;
-
-    if (OSAPI_Mutex_is_owned(self))
-    {
-        ++base->depth;
-        return RTI_TRUE;
-    }
-
-    if (!OSAPI_Mutex_take_os(self))
-    {
+    if (!self)
         return RTI_FALSE;
-    }
 
-    base->owner = OSAPI_Thread_self();
-    base->owned = RTI_TRUE;
-    base->depth = 1;
-
-    return RTI_TRUE;
+    return pthread_mutex_lock(&self->mutex) ? RTI_FALSE : RTI_TRUE;
 }
 
 RTI_BOOL
 OSAPI_Mutex_give(OSAPI_Mutex_T *self)
 {
-    struct OSAPI_MutexBase *base = (struct OSAPI_MutexBase*)self;
-
-    OSAPI_PRECONDITION(self == NULL,return RTI_FALSE,
-                            OSAPI_Log_entry_add_pointer("self",self,RTI_TRUE);)
-
-    if (!OSAPI_Mutex_is_owned(self))
-    {
+    if (!self)
         return RTI_FALSE;
-    }
-
-    --base->depth;
-
-    if (base->depth > 0)
-    {
-        return RTI_TRUE;
-    }
-
-    base->owned = RTI_FALSE;
 
-    return OSAPI_Mutex_give_os(self);
+    return pthread_mutex_unlock(&self->mutex) ? RTI_FALSE : RTI_TRUE;
 }
 
 RTI_BOOL
-OSAPI_Mutex_resume(OSAPI_Mutex_T *self,RTI_UINT32 level)
+OSAPI_Mutex_resume(OSAPI_Mutex_T *self, RTI_UINT32 level)
 {
-    struct OSAPI_MutexBase *base = (struct OSAPI_MutexBase*)self;
+    if (!self)
+        return RTI_FALSE;
 
-    if (!OSAPI_Mutex_take_os(self))
-    {
+    if(!level)
         return RTI_FALSE;
-    }
 
-    base->owner = OSAPI_Thread_self();
-    base->owned = RTI_TRUE;
-    base->depth = level;
+    while (level--) {
+        if (pthread_mutex_lock(&self->mutex))
+            return RTI_FALSE;
+    }
 
     return RTI_TRUE;
 }
 
 RTI_BOOL
-OSAPI_Mutex_release(OSAPI_Mutex_T *self,RTI_UINT32 *level)
+OSAPI_Mutex_release(OSAPI_Mutex_T *self, RTI_UINT32 *level)
 {
-    struct OSAPI_MutexBase *base = (struct OSAPI_MutexBase*)self;
-
-    OSAPI_PRECONDITION(self == NULL,return RTI_FALSE,
-                            OSAPI_Log_entry_add_pointer("self",self,RTI_TRUE);)
-
-    if (!OSAPI_Mutex_is_owned(self))
-    {
+    if (!self)
         return RTI_FALSE;
-    }
 
-    *level = base->depth;
+    if (pthread_mutex_unlock(&self->mutex))
+        return RTI_FALSE;
 
-    base->owned = RTI_FALSE;
+    RTI_UINT32 lvl = 1;
+    while(!pthread_mutex_unlock(&self->mutex))
+        lvl++;
 
-    return OSAPI_Mutex_give_os(self);
+    *level = lvl;
+    return RTI_TRUE;
 }
diff --git a/source/unix/src/osapi/common/Mutex.h b/source/unix/src/osapi/common/Mutex.h
deleted file mode 100644
index 8638955..0000000
--- a/source/unix/src/osapi/common/Mutex.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * FILE: Mutex.h - Generic declarations of generic OSAPI mutex routines
- *
- * Copyright 2018-2018 Real-Time Innovations, Inc.
- *
- * No duplications, whole or partial, manual or electronic, may be made
- * without express written permission.  Any such copies, or
- * revisions thereof, must display this notice unaltered.
- * This code contains trade secrets of Real-Time Innovations, Inc.
- *
- */
-/*ce
- * \file
- * \brief Generic declarations of generic OSAPI mutex routines
- */
-#ifndef MUTEX_H
-#define MUTEX_H
-
-/*i
- * \brief Function to initialize Mutex base class
- *
- * \param[in]  base Base class to inititalize
- */
-extern void
-OSAPI_Mutex_initialize(struct OSAPI_Mutex *base);
-
-/*i
- * \brief Function to finalize the mutex base class
- *
- * \param[in] base Base class to finalize
- */
-extern void
-OSAPI_Mutex_finalize(struct OSAPI_Mutex *base);
-
-/*ci
- * \brief OS specic version of OSAPI_Mutex_take
- */
-extern RTI_BOOL
-OSAPI_Mutex_take_os(OSAPI_Mutex_T *self);
-
-/*ci
- * \brief OS specic version of OSAPI_Mutex_give
- */
-extern RTI_BOOL
-OSAPI_Mutex_give_os(OSAPI_Mutex_T *self);
-
-#endif
diff --git a/source/unix/src/osapi/posix/posixMutex.c b/source/unix/src/osapi/posix/posixMutex.c
deleted file mode 100644
index b2d927c..0000000
--- a/source/unix/src/osapi/posix/posixMutex.c
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * FILE: posixMutex.c - Mutex functionality
- *
- * Copyright 2012-2015 Real-Time Innovations, Inc.
- *
- * No duplications, whole or partial, manual or electronic, may be made
- * without express written permission.  Any such copies, or
- * revisions thereof, must display this notice unaltered.
- * This code contains trade secrets of Real-Time Innovations, Inc.
- *
- * Modification History
- * --------------------
- * 09mar2012,tk Written
- */
-/*ce
- * \file
- * \brief POSIX implementation of OSAPI mutex routines
- */
-#include "osapi/osapi_config.h"
-
-#if OSAPI_INCLUDE_POSIX
-
-#define RTI_INVALID_TID (-1)
-
-#ifndef osapi_heap_h
-#include "osapi/osapi_heap.h"
-#endif
-#ifndef osapi_mutex_h
-#include "osapi/osapi_mutex.h"
-#endif
-#ifndef osapi_log_h
-#include "osapi/osapi_log.h"
-#endif
-
-#include "../common/Mutex.h"
-
-struct OSAPI_Mutex
-{
-    struct OSAPI_MutexBase _base;
-    pthread_mutex_t *mutex;
-};
-#endif
-
-/*** SOURCE_BEGIN ***/
-
-#if OSAPI_INCLUDE_POSIX
-
-#ifndef RTI_CERT
-RTI_BOOL
-OSAPI_Mutex_delete(OSAPI_Mutex_T *self)
-{
-#ifndef RTI_CERT
-    int rc;
-#endif
-    PRECOND_ARG(self)
-
-    OSAPI_PRECONDITION(self == NULL,return RTI_FALSE,
-                            OSAPI_Log_entry_add_pointer("self",self,RTI_TRUE);)
-
-    OSAPI_Mutex_finalize(self);
-
-#ifndef RTI_CERT
-    rc = pthread_mutex_destroy(self->mutex);
-    if (rc != 0)
-    {
-        OSAPI_LOG_MUTEX_DELETE(OSAPI_LOGKIND_ERROR,rc)
-        return RTI_FALSE;
-    }
-
-    if (self->mutex)
-    {
-        OSAPI_Heap_free_struct(self->mutex);
-    }
-
-
-    OSAPI_Heap_free_struct(self);
-#endif
-
-    return RTI_TRUE;
-}
-#endif
-
-OSAPI_Mutex_T*
-OSAPI_Mutex_new(void)
-{
-    pthread_mutexattr_t attr;
-    int rc;
-    struct OSAPI_Mutex *mutex = NULL;
-
-    OSAPI_Heap_allocate_struct(&mutex, struct OSAPI_Mutex);
-
-    if (mutex == NULL)
-    {
-        OSAPI_LOG_MUTEX_NEW(OSAPI_LOGKIND_ERROR)
-        return NULL;
-    }
-
-    OSAPI_Mutex_initialize(mutex);
-
-    mutex->mutex = NULL;
-
-    if (!pthread_mutexattr_init(&attr))
-    {
-        OSAPI_Heap_allocate_struct(&mutex->mutex, pthread_mutex_t);
-    }
-
-    if (mutex->mutex)
-    {
-        rc = pthread_mutex_init(mutex->mutex, &attr);
-        if ( rc != 0)
-        {
-            OSAPI_LOG_MUTEX_INIT(OSAPI_LOGKIND_ERROR,rc)
-#ifndef RTI_CERT
-            (void)OSAPI_Mutex_delete(mutex);
-#endif
-            return NULL;
-        }
-    }
-    else
-    {
-        OSAPI_LOG_MUTEX_INIT(OSAPI_LOGKIND_ERROR,errno)
-        return NULL;
-    }
-
-    rc = pthread_mutexattr_destroy(&attr);
-    if (rc != 0)
-    {
-        OSAPI_LOG_MUTEX_INIT(OSAPI_LOGKIND_ERROR,rc)
-    }
-
-    return (OSAPI_Mutex_T*)mutex;
-}
-
-RTI_BOOL
-OSAPI_Mutex_take_os(OSAPI_Mutex_T *self)
-{
-    int rc = 0;
-
-    do
-    {
-        rc = pthread_mutex_lock(self->mutex);
-    }
-    while ((rc != 0) && (rc == EINTR));
-
-    if (rc == 0)
-    {
-        return RTI_TRUE;
-    }
-
-    OSAPI_LOG_MUTEX_TAKE(OSAPI_LOGKIND_ERROR,rc)
-
-    return RTI_FALSE;
-}
-
-RTI_BOOL
-OSAPI_Mutex_give_os(OSAPI_Mutex_T *self)
-{
-    int rc;
-
-    OSAPI_PRECONDITION(self == NULL,return RTI_FALSE,
-                            OSAPI_Log_entry_add_pointer("self",self,RTI_TRUE);)
-
-    do
-    {
-
-        rc = pthread_mutex_unlock(self->mutex);
-    }
-    while ((rc != 0) && (rc == EINTR));
-
-    if (rc == 0)
-    {
-        return RTI_TRUE;
-    }
-
-    OSAPI_LOG_MUTEX_GIVE(OSAPI_LOGKIND_ERROR,rc)
-
-    return RTI_FALSE;
-}
-#endif
