Index: cpukit/rtems/include/rtems/rtems/semimpl.h
===================================================================
--- cpukit/rtems/include/rtems/rtems/semimpl.h	(revision 2581a563f9182dc2debdba97f33feee6d797e53a)
+++ cpukit/rtems/include/rtems/rtems/semimpl.h	(revision 09c5ca4cb4f30ba9e0c3c3915a70af7ff3916ec0)
@@ -29,4 +29,5 @@
 typedef enum {
   SEMAPHORE_VARIANT_MUTEX,
+  SEMAPHORE_VARIANT_SIMPLE_BINARY,
   SEMAPHORE_VARIANT_COUNTING
 #if defined(RTEMS_SMP)
Index: cpukit/rtems/src/semcreate.c
===================================================================
--- cpukit/rtems/src/semcreate.c	(revision 2581a563f9182dc2debdba97f33feee6d797e53a)
+++ cpukit/rtems/src/semcreate.c	(revision 09c5ca4cb4f30ba9e0c3c3915a70af7ff3916ec0)
@@ -144,7 +144,4 @@
   }
 
-  /*
-   *  Initialize it as a counting semaphore.
-   */
   if ( _Attributes_Is_counting_semaphore( attribute_set ) ) {
     the_semaphore->variant = SEMAPHORE_VARIANT_COUNTING;
@@ -152,4 +149,11 @@
       &the_semaphore->Core_control.semaphore,
       count
+    );
+    status = STATUS_SUCCESSFUL;
+  } else if ( _Attributes_Is_simple_binary_semaphore( attribute_set ) ) {
+    the_semaphore->variant = SEMAPHORE_VARIANT_SIMPLE_BINARY;
+    _CORE_semaphore_Initialize(
+      &the_semaphore->Core_control.semaphore,
+      count != 0
     );
     status = STATUS_SUCCESSFUL;
@@ -167,4 +171,6 @@
     the_semaphore->variant = SEMAPHORE_VARIANT_MUTEX;
 
+    _Assert( _Attributes_Is_binary_semaphore( attribute_set ) );
+
     /*
      *  It is either simple binary semaphore or a more powerful mutex
@@ -176,23 +182,18 @@
       the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_FIFO;
 
-    if ( _Attributes_Is_binary_semaphore( attribute_set ) ) {
-      the_mutex_attr.priority_ceiling      = _RTEMS_tasks_Priority_to_Core(
-                                               priority_ceiling
-                                             );
-      the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
-      the_mutex_attr.only_owner_release    = false;
-
-      if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
-        if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
-          the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
-          the_mutex_attr.only_owner_release = true;
-        } else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
-          the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
-          the_mutex_attr.only_owner_release = true;
-        }
+    the_mutex_attr.priority_ceiling      = _RTEMS_tasks_Priority_to_Core(
+                                             priority_ceiling
+                                           );
+    the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES;
+    the_mutex_attr.only_owner_release    = false;
+
+    if ( the_mutex_attr.discipline == CORE_MUTEX_DISCIPLINES_PRIORITY ) {
+      if ( _Attributes_Is_inherit_priority( attribute_set ) ) {
+        the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
+        the_mutex_attr.only_owner_release = true;
+      } else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) {
+        the_mutex_attr.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
+        the_mutex_attr.only_owner_release = true;
       }
-    } else /* must be simple binary semaphore */ {
-      the_mutex_attr.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS;
-      the_mutex_attr.only_owner_release = false;
     }
 
Index: cpukit/rtems/src/semdelete.c
===================================================================
--- cpukit/rtems/src/semdelete.c	(revision 2581a563f9182dc2debdba97f33feee6d797e53a)
+++ cpukit/rtems/src/semdelete.c	(revision 09c5ca4cb4f30ba9e0c3c3915a70af7ff3916ec0)
@@ -20,5 +20,4 @@
 
 #include <rtems/rtems/semimpl.h>
-#include <rtems/rtems/attrimpl.h>
 #include <rtems/rtems/statusimpl.h>
 
@@ -29,5 +28,4 @@
   Semaphore_Control    *the_semaphore;
   Thread_queue_Context  queue_context;
-  rtems_attribute       attribute_set;
   Status_Control        status;
 
@@ -47,6 +45,4 @@
   }
 
-  attribute_set = the_semaphore->attribute_set;
-
   _Thread_queue_Acquire_critical(
     &the_semaphore->Core_control.Wait_queue,
@@ -56,8 +52,5 @@
   switch ( the_semaphore->variant ) {
     case SEMAPHORE_VARIANT_MUTEX:
-      if (
-        _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex )
-          && !_Attributes_Is_simple_binary_semaphore( attribute_set )
-      ) {
+      if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) ) {
         status = STATUS_RESOURCE_IN_USE;
       } else {
@@ -72,5 +65,8 @@
 #endif
     default:
-      _Assert( the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING );
+      _Assert(
+        the_semaphore->variant == SEMAPHORE_VARIANT_SIMPLE_BINARY
+          || the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING
+      );
       status = STATUS_SUCCESSFUL;
       break;
@@ -103,5 +99,8 @@
 #endif
     default:
-      _Assert( the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING );
+      _Assert(
+        the_semaphore->variant == SEMAPHORE_VARIANT_SIMPLE_BINARY
+          || the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING
+      );
       _CORE_semaphore_Destroy(
         &the_semaphore->Core_control.semaphore,
Index: cpukit/rtems/src/semflush.c
===================================================================
--- cpukit/rtems/src/semflush.c	(revision 2581a563f9182dc2debdba97f33feee6d797e53a)
+++ cpukit/rtems/src/semflush.c	(revision 09c5ca4cb4f30ba9e0c3c3915a70af7ff3916ec0)
@@ -64,5 +64,8 @@
       break;
     default:
-      _Assert( the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING );
+      _Assert(
+        the_semaphore->variant == SEMAPHORE_VARIANT_SIMPLE_BINARY
+          || the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING
+      );
       _CORE_semaphore_Flush(
         &the_semaphore->Core_control.semaphore,
Index: cpukit/rtems/src/semobtain.c
===================================================================
--- cpukit/rtems/src/semobtain.c	(revision 2581a563f9182dc2debdba97f33feee6d797e53a)
+++ cpukit/rtems/src/semobtain.c	(revision 09c5ca4cb4f30ba9e0c3c3915a70af7ff3916ec0)
@@ -92,5 +92,8 @@
       break;
     default:
-      _Assert( the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING );
+      _Assert(
+        the_semaphore->variant == SEMAPHORE_VARIANT_SIMPLE_BINARY
+          || the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING
+      );
       status = _CORE_semaphore_Seize(
         &the_semaphore->Core_control.semaphore,
Index: cpukit/rtems/src/semrelease.c
===================================================================
--- cpukit/rtems/src/semrelease.c	(revision 2581a563f9182dc2debdba97f33feee6d797e53a)
+++ cpukit/rtems/src/semrelease.c	(revision 09c5ca4cb4f30ba9e0c3c3915a70af7ff3916ec0)
@@ -62,4 +62,17 @@
       );
       break;
+    case SEMAPHORE_VARIANT_SIMPLE_BINARY:
+      status = _CORE_semaphore_Surrender(
+        &the_semaphore->Core_control.semaphore,
+        _Semaphore_Get_operations( the_semaphore ),
+        1,
+        &queue_context
+      );
+      _Assert(
+        status == STATUS_SUCCESSFUL
+          || status == STATUS_MAXIMUM_COUNT_EXCEEDED
+      );
+      status = STATUS_SUCCESSFUL;
+      break;
     default:
       _Assert( the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING );
