Index: cpukit/libcsupport/src/resource_snapshot.c
===================================================================
--- cpukit/libcsupport/src/resource_snapshot.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/libcsupport/src/resource_snapshot.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -99,16 +99,4 @@
 }
 
-static void free_all_delayed_blocks(void)
-{
-  #ifdef HEAP_PROTECTION
-    _RTEMS_Lock_allocator();
-    _Thread_Disable_dispatch();
-    _Heap_Protection_free_all_delayed_blocks( RTEMS_Malloc_Heap );
-    _Heap_Protection_free_all_delayed_blocks( &_Workspace_Area );
-    _Thread_Enable_dispatch();
-    _RTEMS_Unlock_allocator();
-  #endif
-}
-
 void rtems_resource_snapshot_take(rtems_resource_snapshot *snapshot)
 {
@@ -116,12 +104,14 @@
   size_t i;
 
-  free_all_delayed_blocks();
+  _RTEMS_Lock_allocator();
 
   _Thread_Kill_zombies();
 
-  _Protected_heap_Get_information(RTEMS_Malloc_Heap, &snapshot->heap_info);
+  #ifdef HEAP_PROTECTION
+    _Heap_Protection_free_all_delayed_blocks(RTEMS_Malloc_Heap);
+    _Heap_Protection_free_all_delayed_blocks(&_Workspace_Area);
+  #endif
 
-  _Thread_Disable_dispatch();
-
+  _Heap_Get_information(RTEMS_Malloc_Heap, &snapshot->heap_info);
   _Heap_Get_information(&_Workspace_Area, &snapshot->workspace_info);
 
@@ -130,5 +120,5 @@
   }
 
-  _Thread_Enable_dispatch();
+  _RTEMS_Unlock_allocator();
 
   #ifndef RTEMS_POSIX_API
Index: cpukit/posix/include/rtems/posix/pthreadimpl.h
===================================================================
--- cpukit/posix/include/rtems/posix/pthreadimpl.h	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/include/rtems/posix/pthreadimpl.h	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -67,14 +67,4 @@
  */
 void _POSIX_Threads_Manager_initialization(void);
-
-/**
- * @brief Allocate POSIX thread control block.
- *
- * This function allocates a pthread control block from
- * the inactive chain of free pthread control blocks.
- *
- * @return This method returns a newly allocated thread.
- */
-RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void );
 
 /**
@@ -212,13 +202,12 @@
 );
 
-/*
- *  _POSIX_Threads_Allocate
- */
-
-RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
-{
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate(void)
+{
+  _Objects_Allocator_lock();
+
   _Thread_Kill_zombies();
 
-  return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
+  return (Thread_Control *)
+    _Objects_Allocate_unprotected( &_POSIX_Threads_Information );
 }
 
Index: cpukit/posix/include/rtems/posix/semaphoreimpl.h
===================================================================
--- cpukit/posix/include/rtems/posix/semaphoreimpl.h	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/include/rtems/posix/semaphoreimpl.h	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -49,17 +49,10 @@
 void _POSIX_Semaphore_Manager_initialization(void);
 
-/**
- *  @brief POSIX Semaphore Allocate
- *
- *  This function allocates a semaphore control block from
- *  the inactive chain of free semaphore control blocks.
- */
-
-RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *
+  _POSIX_Semaphore_Allocate_unprotected( void )
 {
   return (POSIX_Semaphore_Control *)
-    _Objects_Allocate( &_POSIX_Semaphore_Information );
+    _Objects_Allocate_unprotected( &_POSIX_Semaphore_Information );
 }
-
 
 /**
Index: cpukit/posix/src/conddestroy.c
===================================================================
--- cpukit/posix/src/conddestroy.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/conddestroy.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -39,4 +39,5 @@
   Objects_Locations                  location;
 
+  _Objects_Allocator_lock();
   the_cond = _POSIX_Condition_variables_Get( cond, &location );
   switch ( location ) {
@@ -46,4 +47,5 @@
       if ( _Thread_queue_First( &the_cond->Wait_queue ) ) {
         _Objects_Put( &the_cond->Object );
+        _Objects_Allocator_unlock();
         return EBUSY;
       }
@@ -53,7 +55,7 @@
         &the_cond->Object
       );
-
+      _Objects_Put( &the_cond->Object );
       _POSIX_Condition_variables_Free( the_cond );
-      _Objects_Put( &the_cond->Object );
+      _Objects_Allocator_unlock();
       return 0;
 
@@ -65,4 +67,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return EINVAL;
 }
Index: cpukit/posix/src/condinit.c
===================================================================
--- cpukit/posix/src/condinit.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/condinit.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -52,10 +52,8 @@
     return EINVAL;
 
-  _Thread_Disable_dispatch();
-
   the_cond = _POSIX_Condition_variables_Allocate();
 
   if ( !the_cond ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return ENOMEM;
   }
@@ -80,5 +78,5 @@
   *cond = the_cond->Object.id;
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
 
   return 0;
Index: cpukit/posix/src/keycreate.c
===================================================================
--- cpukit/posix/src/keycreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/keycreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -39,10 +39,8 @@
   POSIX_Keys_Control  *the_key;
 
-  _Thread_Disable_dispatch();
-
   the_key = _POSIX_Keys_Allocate();
 
   if ( !the_key ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return EAGAIN;
   }
@@ -51,5 +49,5 @@
   _Objects_Open_u32( &_POSIX_Keys_Information, &the_key->Object, 0 );
   *key = the_key->Object.id;
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/keydelete.c
===================================================================
--- cpukit/posix/src/keydelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/keydelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -39,4 +39,5 @@
   Objects_Locations   location;
 
+  _Objects_Allocator_lock();
   the_key = _POSIX_Keys_Get( key, &location );
   switch ( location ) {
@@ -51,4 +52,5 @@
       _POSIX_Keys_Free( the_key );
       _Objects_Put(&the_key->Object);
+      _Objects_Allocator_unlock();
       return 0;
 
@@ -60,4 +62,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return EINVAL;
 }
Index: cpukit/posix/src/mqueueclose.c
===================================================================
--- cpukit/posix/src/mqueueclose.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/mqueueclose.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -58,4 +58,5 @@
   Objects_Locations               location;
 
+  _Objects_Allocator_lock();
   the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location );
   if ( location == OBJECTS_LOCAL ) {
@@ -80,6 +81,9 @@
 
       _Objects_Put( &the_mq_fd->Object );
+      _Objects_Allocator_unlock();
       return 0;
    }
+
+   _Objects_Allocator_unlock();
 
    /*
Index: cpukit/posix/src/mqueuecreatesupp.c
===================================================================
--- cpukit/posix/src/mqueuecreatesupp.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/mqueuecreatesupp.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -63,6 +63,4 @@
   /* length of name has already been validated */
 
-  _Thread_Disable_dispatch();
-
   /*
    *  There is no real basis for the default values.  They will work
@@ -76,10 +74,8 @@
   } else {
     if ( attr_ptr->mq_maxmsg <= 0 ){
-      _Thread_Enable_dispatch();
       rtems_set_errno_and_return_minus_one( EINVAL );
     }
 
     if ( attr_ptr->mq_msgsize <= 0 ){
-      _Thread_Enable_dispatch();
       rtems_set_errno_and_return_minus_one( EINVAL );
     }
@@ -90,5 +86,5 @@
   the_mq = _POSIX_Message_queue_Allocate();
   if ( !the_mq ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     rtems_set_errno_and_return_minus_one( ENFILE );
   }
@@ -101,5 +97,5 @@
   if ( !name ) {
     _POSIX_Message_queue_Free( the_mq );
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     rtems_set_errno_and_return_minus_one( ENOMEM );
   }
@@ -129,5 +125,5 @@
     _POSIX_Message_queue_Free( the_mq );
     _Workspace_Free(name);
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     rtems_set_errno_and_return_minus_one( ENOSPC );
   }
@@ -141,5 +137,5 @@
   *message_queue = the_mq;
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/mqueueopen.c
===================================================================
--- cpukit/posix/src/mqueueopen.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/mqueueopen.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -73,6 +73,4 @@
   size_t                          name_len;
 
-  _Thread_Disable_dispatch();
-
   if ( oflag & O_CREAT ) {
     va_start(arg, oflag);
@@ -84,5 +82,5 @@
   the_mq_fd = _POSIX_Message_queue_Allocate_fd();
   if ( !the_mq_fd ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     rtems_set_errno_and_return_minus_one( ENFILE );
   }
@@ -104,5 +102,5 @@
     if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
       _POSIX_Message_queue_Free_fd( the_mq_fd );
-      _Thread_Enable_dispatch();
+      _Objects_Allocator_unlock();
       rtems_set_errno_and_return_minus_one_cast( status, mqd_t );
     }
@@ -114,5 +112,5 @@
     if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
       _POSIX_Message_queue_Free_fd( the_mq_fd );
-      _Thread_Enable_dispatch();
+      _Objects_Allocator_unlock();
       rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t );
     }
@@ -131,5 +129,5 @@
     );
     _Thread_Enable_dispatch();
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return (mqd_t)the_mq_fd->Object.id;
 
@@ -153,5 +151,5 @@
   if ( status == -1 ) {
     _POSIX_Message_queue_Free_fd( the_mq_fd );
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return (mqd_t) -1;
   }
@@ -164,5 +162,5 @@
   );
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
 
   return (mqd_t) the_mq_fd->Object.id;
Index: cpukit/posix/src/mqueueunlink.c
===================================================================
--- cpukit/posix/src/mqueueunlink.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/mqueueunlink.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -47,4 +47,5 @@
   size_t                                name_len;
 
+  _Objects_Allocator_lock();
   _Thread_Disable_dispatch();
 
@@ -52,4 +53,5 @@
    if ( status != 0 ) {
     _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     rtems_set_errno_and_return_minus_one( status );
    }
@@ -65,4 +67,5 @@
 
   _Thread_Enable_dispatch();
+   _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/mutexdestroy.c
===================================================================
--- cpukit/posix/src/mutexdestroy.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/mutexdestroy.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -40,4 +40,5 @@
   Objects_Locations             location;
 
+  _Objects_Allocator_lock();
   the_mutex = _POSIX_Mutex_Get( mutex, &location );
   switch ( location ) {
@@ -51,13 +52,14 @@
       if ( _CORE_mutex_Is_locked( &the_mutex->Mutex ) ) {
         _Objects_Put( &the_mutex->Object );
+        _Objects_Allocator_unlock();
         return EBUSY;
       }
 
       _Objects_Close( &_POSIX_Mutex_Information, &the_mutex->Object );
+      _CORE_mutex_Flush( &the_mutex->Mutex, NULL, EINVAL );
+      _Objects_Put( &the_mutex->Object );
+      _POSIX_Mutex_Free( the_mutex );
+      _Objects_Allocator_unlock();
 
-      _CORE_mutex_Flush( &the_mutex->Mutex, NULL, EINVAL );
-
-      _POSIX_Mutex_Free( the_mutex );
-      _Objects_Put( &the_mutex->Object );
       return 0;
 
@@ -69,4 +71,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return EINVAL;
 }
Index: cpukit/posix/src/mutexinit.c
===================================================================
--- cpukit/posix/src/mutexinit.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/mutexinit.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -150,13 +150,8 @@
 #endif
 
-  /*
-   *  Enter a dispatching critical section and begin to do the real work.
-   */
-  _Thread_Disable_dispatch();
-
   the_mutex = _POSIX_Mutex_Allocate();
 
   if ( !the_mutex ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return EAGAIN;
   }
@@ -189,5 +184,5 @@
   *mutex = the_mutex->Object.id;
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/pbarrierdestroy.c
===================================================================
--- cpukit/posix/src/pbarrierdestroy.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/pbarrierdestroy.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -46,4 +46,5 @@
     return EINVAL;
 
+  _Objects_Allocator_lock();
   the_barrier = _POSIX_Barrier_Get( barrier, &location );
   switch ( location ) {
@@ -56,8 +57,8 @@
 
       _Objects_Close( &_POSIX_Barrier_Information, &the_barrier->Object );
+      _Objects_Put( &the_barrier->Object );
 
       _POSIX_Barrier_Free( the_barrier );
-
-      _Objects_Put( &the_barrier->Object );
+      _Objects_Allocator_unlock();
       return 0;
 
@@ -69,4 +70,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return EINVAL;
 }
Index: cpukit/posix/src/pbarrierinit.c
===================================================================
--- cpukit/posix/src/pbarrierinit.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/pbarrierinit.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -93,13 +93,8 @@
   the_attributes.maximum_count = count;
 
-  /*
-   * Enter dispatching critical section to allocate and initialize barrier
-   */
-  _Thread_Disable_dispatch();             /* prevents deletion */
-
   the_barrier = _POSIX_Barrier_Allocate();
 
   if ( !the_barrier ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return EAGAIN;
   }
@@ -113,9 +108,6 @@
   );
 
-  /*
-   * Exit the critical section and return the user an operational barrier
-   */
   *barrier = the_barrier->Object.id;
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/prwlockdestroy.c
===================================================================
--- cpukit/posix/src/prwlockdestroy.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/prwlockdestroy.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -45,4 +45,5 @@
     return EINVAL;
 
+  _Objects_Allocator_lock();
   the_rwlock = _POSIX_RWLock_Get( rwlock, &location );
   switch ( location ) {
@@ -54,4 +55,5 @@
       if ( _Thread_queue_First( &the_rwlock->RWLock.Wait_queue ) != NULL ) {
         _Objects_Put( &the_rwlock->Object );
+        _Objects_Allocator_unlock();
         return EBUSY;
       }
@@ -62,8 +64,8 @@
 
       _Objects_Close( &_POSIX_RWLock_Information, &the_rwlock->Object );
+      _Objects_Put( &the_rwlock->Object );
+      _POSIX_RWLock_Free( the_rwlock );
+      _Objects_Allocator_unlock();
 
-      _POSIX_RWLock_Free( the_rwlock );
-
-      _Objects_Put( &the_rwlock->Object );
       return 0;
 
@@ -75,4 +77,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return EINVAL;
 }
Index: cpukit/posix/src/prwlockinit.c
===================================================================
--- cpukit/posix/src/prwlockinit.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/prwlockinit.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -89,13 +89,8 @@
   _CORE_RWLock_Initialize_attributes( &the_attributes );
 
-  /*
-   * Enter dispatching critical section to allocate and initialize RWLock
-   */
-  _Thread_Disable_dispatch();             /* prevents deletion */
-
   the_rwlock = _POSIX_RWLock_Allocate();
 
   if ( !the_rwlock ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return EAGAIN;
   }
@@ -111,5 +106,5 @@
   *rwlock = the_rwlock->Object.id;
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/pspindestroy.c
===================================================================
--- cpukit/posix/src/pspindestroy.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/pspindestroy.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -46,4 +46,5 @@
     return EINVAL;
 
+  _Objects_Allocator_lock();
   the_spinlock = _POSIX_Spinlock_Get( spinlock, &location );
   switch ( location ) {
@@ -56,8 +57,8 @@
 
       _Objects_Close( &_POSIX_Spinlock_Information, &the_spinlock->Object );
+      _Objects_Put( &the_spinlock->Object );
+      _POSIX_Spinlock_Free( the_spinlock );
+      _Objects_Allocator_unlock();
 
-      _POSIX_Spinlock_Free( the_spinlock );
-
-      _Objects_Put( &the_spinlock->Object );
       return 0;
 
@@ -69,4 +70,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return EINVAL;
 }
Index: cpukit/posix/src/pspininit.c
===================================================================
--- cpukit/posix/src/pspininit.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/pspininit.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -50,5 +50,4 @@
   CORE_spinlock_Attributes  attributes;
 
-
   if ( !spinlock )
     return EINVAL;
@@ -62,10 +61,8 @@
   }
 
-  _Thread_Disable_dispatch();             /* prevents deletion */
-
   the_spinlock = _POSIX_Spinlock_Allocate();
 
   if ( !the_spinlock ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return EAGAIN;
   }
@@ -79,5 +76,5 @@
   *spinlock = the_spinlock->Object.id;
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/pthreadcreate.c
===================================================================
--- cpukit/posix/src/pthreadcreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/pthreadcreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -157,9 +157,4 @@
 
   /*
-   *  Lock the allocator mutex for protection
-   */
-  _RTEMS_Lock_allocator();
-
-  /*
    *  Allocate the thread control block.
    *
@@ -168,5 +163,5 @@
   the_thread = _POSIX_Threads_Allocate();
   if ( !the_thread ) {
-    _RTEMS_Unlock_allocator();
+    _Objects_Allocator_unlock();
     return EAGAIN;
   }
@@ -191,5 +186,5 @@
   if ( !status ) {
     _POSIX_Threads_Free( the_thread );
-    _RTEMS_Unlock_allocator();
+    _Objects_Allocator_unlock();
     return EAGAIN;
   }
@@ -236,5 +231,5 @@
       _Thread_Enable_dispatch();
       _POSIX_Threads_Free( the_thread );
-      _RTEMS_Unlock_allocator();
+      _Objects_Allocator_unlock();
       return EINVAL;
     }
@@ -255,5 +250,5 @@
   *thread = the_thread->Object.id;
 
-  _RTEMS_Unlock_allocator();
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/semaphorecreatesupp.c
===================================================================
--- cpukit/posix/src/semaphorecreatesupp.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/semaphorecreatesupp.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -57,9 +57,6 @@
     rtems_set_errno_and_return_minus_one( ENOSYS );
 
-  _Thread_Disable_dispatch();
-
-  the_semaphore = _POSIX_Semaphore_Allocate();
+  the_semaphore = _POSIX_Semaphore_Allocate_unprotected();
   if ( !the_semaphore ) {
-    _Thread_Enable_dispatch();
     rtems_set_errno_and_return_minus_one( ENOSPC );
   }
@@ -73,5 +70,4 @@
     if ( !name ) {
       _POSIX_Semaphore_Free( the_semaphore );
-      _Thread_Enable_dispatch();
       rtems_set_errno_and_return_minus_one( ENOMEM );
     }
@@ -121,5 +117,4 @@
   *the_sem = the_semaphore;
 
-  _Thread_Enable_dispatch();
   return 0;
 }
Index: cpukit/posix/src/semclose.c
===================================================================
--- cpukit/posix/src/semclose.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/semclose.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -39,4 +39,5 @@
   Objects_Locations                 location;
 
+  _Objects_Allocator_lock();
   the_semaphore = _POSIX_Semaphore_Get( sem, &location );
   switch ( location ) {
@@ -46,4 +47,5 @@
       _POSIX_Semaphore_Delete( the_semaphore );
       _Objects_Put( &the_semaphore->Object );
+      _Objects_Allocator_unlock();
       return 0;
 
@@ -55,4 +57,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   rtems_set_errno_and_return_minus_one( EINVAL );
 }
Index: cpukit/posix/src/semdestroy.c
===================================================================
--- cpukit/posix/src/semdestroy.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/semdestroy.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -39,4 +39,5 @@
   Objects_Locations                 location;
 
+  _Objects_Allocator_lock();
   the_semaphore = _POSIX_Semaphore_Get( sem, &location );
   switch ( location ) {
@@ -54,4 +55,5 @@
       _POSIX_Semaphore_Delete( the_semaphore );
       _Objects_Put( &the_semaphore->Object );
+      _Objects_Allocator_unlock();
       return 0;
 
@@ -63,4 +65,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   rtems_set_errno_and_return_minus_one( EINVAL );
 }
Index: cpukit/posix/src/seminit.c
===================================================================
--- cpukit/posix/src/seminit.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/seminit.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -48,4 +48,5 @@
     rtems_set_errno_and_return_minus_one( EINVAL );
 
+  _Objects_Allocator_lock();
   status = _POSIX_Semaphore_Create_support(
     NULL,
@@ -55,4 +56,5 @@
     &the_semaphore
   );
+  _Objects_Allocator_unlock();
 
   if ( status != -1 )
Index: cpukit/posix/src/semopen.c
===================================================================
--- cpukit/posix/src/semopen.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/semopen.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -67,6 +67,4 @@
   size_t                     name_len;
 
-  _Thread_Disable_dispatch();
-
   if ( oflag & O_CREAT ) {
     va_start(arg, oflag);
@@ -76,4 +74,5 @@
   }
 
+  _Objects_Allocator_lock();
   status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id, &name_len );
 
@@ -93,5 +92,5 @@
 
     if ( !( status == ENOENT && (oflag & O_CREAT) ) ) {
-      _Thread_Enable_dispatch();
+      _Objects_Allocator_unlock();
       rtems_set_errno_and_return_minus_one_cast( status, sem_t * );
     }
@@ -103,5 +102,5 @@
 
     if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
-      _Thread_Enable_dispatch();
+      _Objects_Allocator_unlock();
       rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * );
     }
@@ -110,5 +109,5 @@
     the_semaphore->open_count += 1;
     _Thread_Enable_dispatch();
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     goto return_id;
   }
@@ -131,5 +130,5 @@
    */
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
 
   if ( status == -1 )
Index: cpukit/posix/src/semunlink.c
===================================================================
--- cpukit/posix/src/semunlink.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/semunlink.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -36,9 +36,10 @@
 )
 {
-  int  status;
-  POSIX_Semaphore_Control          *the_semaphore;
-  Objects_Id the_semaphore_id;
-  size_t name_len;
+  int                      status;
+  POSIX_Semaphore_Control *the_semaphore;
+  Objects_Id               the_semaphore_id;
+  size_t                   name_len;
 
+  _Objects_Allocator_lock();
   _Thread_Disable_dispatch();
 
@@ -59,4 +60,6 @@
 
   _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
+
   return 0;
 }
Index: cpukit/posix/src/timercreate.c
===================================================================
--- cpukit/posix/src/timercreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/timercreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -67,6 +67,4 @@
   }
 
-  _Thread_Disable_dispatch();         /* to prevent deletion */
-
   /*
    *  Allocate a timer
@@ -74,5 +72,5 @@
   ptimer = _POSIX_Timer_Allocate();
   if ( !ptimer ) {
-    _Objects_Put( &ptimer->Object );
+    _Objects_Allocator_unlock();
     rtems_set_errno_and_return_minus_one( EAGAIN );
   }
@@ -81,5 +79,5 @@
 
   ptimer->state     = POSIX_TIMER_STATE_CREATE_NEW;
-  ptimer->thread_id = _Thread_Executing->Object.id;
+  ptimer->thread_id = _Thread_Get_executing()->Object.id;
 
   if ( evp != NULL ) {
@@ -99,5 +97,5 @@
 
   *timerid  = ptimer->Object.id;
-  _Objects_Put( &ptimer->Object );
+  _Objects_Allocator_unlock();
   return 0;
 }
Index: cpukit/posix/src/timerdelete.c
===================================================================
--- cpukit/posix/src/timerdelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/posix/src/timerdelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -48,4 +48,5 @@
   Objects_Locations    location;
 
+  _Objects_Allocator_lock();
   ptimer = _POSIX_Timer_Get( timerid, &location );
   switch ( location ) {
@@ -55,6 +56,8 @@
       ptimer->state = POSIX_TIMER_STATE_FREE;
       (void) _Watchdog_Remove( &ptimer->Timer );
+      _Objects_Put( &ptimer->Object );
       _POSIX_Timer_Free( ptimer );
-      _Objects_Put( &ptimer->Object );
+      _Objects_Allocator_unlock();
+
       return 0;
 
@@ -66,4 +69,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   rtems_set_errno_and_return_minus_one( EINVAL );
 }
Index: cpukit/rtems/Makefile.am
===================================================================
--- cpukit/rtems/Makefile.am	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/Makefile.am	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -176,5 +176,4 @@
 ## MESSAGE_QUEUE_C_FILES
 librtems_a_SOURCES += src/msg.c
-librtems_a_SOURCES += src/msgqallocate.c
 librtems_a_SOURCES += src/msgqbroadcast.c
 librtems_a_SOURCES += src/msgqcreate.c
Index: cpukit/rtems/include/rtems/rtems/messageimpl.h
===================================================================
--- cpukit/rtems/include/rtems/rtems/messageimpl.h	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/include/rtems/rtems/messageimpl.h	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -91,14 +91,4 @@
 
 /**
- * @brief Message Queue Allocate
- *
- * This function allocates a message queue control block from
- * the inactive chain of free message queue control blocks.
- *
- * @retval the_message_queue filled in if successful, NULL otherwise
- */
-Message_queue_Control *_Message_queue_Allocate (void);
-
-/**
  * @brief Message queue Translate Core Message Queue Return Code
  *
@@ -163,4 +153,10 @@
 }
 
+RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Allocate( void )
+{
+  return (Message_queue_Control *)
+    _Objects_Allocate( &_Message_queue_Information );
+}
+
 /**@}*/
 
Index: cpukit/rtems/include/rtems/rtems/tasksimpl.h
===================================================================
--- cpukit/rtems/include/rtems/rtems/tasksimpl.h	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/include/rtems/rtems/tasksimpl.h	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -78,15 +78,12 @@
 );
 
-/**
- *  @brief Allocates a task control block.
- *
- *  This function allocates a task control block from
- *  the inactive chain of free task control blocks.
- */
-RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate( void )
+RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate(void)
 {
+  _Objects_Allocator_lock();
+
   _Thread_Kill_zombies();
 
-  return (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information );
+  return (Thread_Control *)
+    _Objects_Allocate_unprotected( &_RTEMS_tasks_Information );
 }
 
Index: cpukit/rtems/src/barriercreate.c
===================================================================
--- cpukit/rtems/src/barriercreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/barriercreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -69,10 +69,8 @@
   the_attributes.maximum_count = maximum_waiters;
 
-  _Thread_Disable_dispatch();             /* prevents deletion */
-
   the_barrier = _Barrier_Allocate();
 
   if ( !the_barrier ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -90,5 +88,5 @@
   *id = the_barrier->Object.id;
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/barrierdelete.c
===================================================================
--- cpukit/rtems/src/barrierdelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/barrierdelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -29,4 +29,5 @@
   Objects_Locations  location;
 
+  _Objects_Allocator_lock();
   the_barrier = _Barrier_Get( id, &location );
   switch ( location ) {
@@ -40,8 +41,7 @@
 
       _Objects_Close( &_Barrier_Information, &the_barrier->Object );
-
+      _Objects_Put( &the_barrier->Object );
       _Barrier_Free( the_barrier );
-
-      _Objects_Put( &the_barrier->Object );
+      _Objects_Allocator_unlock();
       return RTEMS_SUCCESSFUL;
 
@@ -53,4 +53,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return RTEMS_INVALID_ID;
 }
Index: cpukit/rtems/src/dpmemcreate.c
===================================================================
--- cpukit/rtems/src/dpmemcreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/dpmemcreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -34,5 +34,5 @@
 )
 {
-  Dual_ported_memory_Control          *the_port;
+  Dual_ported_memory_Control *the_port;
 
   if ( !rtems_is_name_valid( name ) )
@@ -46,10 +46,8 @@
     return RTEMS_INVALID_ADDRESS;
 
-  _Thread_Disable_dispatch();             /* to prevent deletion */
-
   the_port = _Dual_ported_memory_Allocate();
 
   if ( !the_port ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -66,5 +64,5 @@
 
   *id = the_port->Object.id;
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/dpmemdelete.c
===================================================================
--- cpukit/rtems/src/dpmemdelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/dpmemdelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -33,4 +33,5 @@
   Objects_Locations                    location;
 
+  _Objects_Allocator_lock();
   the_port = _Dual_ported_memory_Get( id, &location );
   switch ( location ) {
@@ -38,6 +39,7 @@
     case OBJECTS_LOCAL:
       _Objects_Close( &_Dual_ported_memory_Information, &the_port->Object );
+      _Objects_Put( &the_port->Object );
       _Dual_ported_memory_Free( the_port );
-      _Objects_Put( &the_port->Object );
+      _Objects_Allocator_unlock();
       return RTEMS_SUCCESSFUL;
 
@@ -49,4 +51,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return RTEMS_INVALID_ID;
 }
Index: ukit/rtems/src/msgqallocate.c
===================================================================
--- cpukit/rtems/src/msgqallocate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ 	(revision )
@@ -1,37 +1,0 @@
-/**
- *  @file
- *
- *  @brief Message Queue Allocate
- *  @ingroup ClassicMessageQueue
- */
-
-/*
- *  COPYRIGHT (c) 1989-1999.
- *  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/system.h>
-#include <rtems/score/chain.h>
-#include <rtems/score/isr.h>
-#include <rtems/score/coremsgimpl.h>
-#include <rtems/score/thread.h>
-#include <rtems/score/wkspace.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/attrimpl.h>
-#include <rtems/rtems/messageimpl.h>
-#include <rtems/rtems/options.h>
-#include <rtems/rtems/support.h>
-
-Message_queue_Control *_Message_queue_Allocate(void)
-{
-  return (Message_queue_Control *)
-    _Objects_Allocate(&_Message_queue_Information);
-}
Index: cpukit/rtems/src/msgqcreate.c
===================================================================
--- cpukit/rtems/src/msgqcreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/msgqcreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -82,10 +82,8 @@
 #endif
 
-  _Thread_Disable_dispatch();              /* protects object pointer */
-
   the_message_queue = _Message_queue_Allocate();
 
   if ( !the_message_queue ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -96,5 +94,5 @@
                               name, the_message_queue->Object.id, false ) ) ) {
     _Message_queue_Free( the_message_queue );
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -121,5 +119,5 @@
 
     _Message_queue_Free( the_message_queue );
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_UNSATISFIED;
   }
@@ -143,5 +141,5 @@
 #endif
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/msgqdelete.c
===================================================================
--- cpukit/rtems/src/msgqdelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/msgqdelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -38,4 +38,5 @@
   Objects_Locations               location;
 
+  _Objects_Allocator_lock();
   the_message_queue = _Message_queue_Get( id, &location );
   switch ( location ) {
@@ -55,6 +56,4 @@
       );
 
-      _Message_queue_Free( the_message_queue );
-
 #if defined(RTEMS_MULTIPROCESSING)
       if ( _Attributes_Is_global( the_message_queue->attribute_set ) ) {
@@ -73,9 +72,11 @@
 #endif
       _Objects_Put( &the_message_queue->Object );
+      _Message_queue_Free( the_message_queue );
+      _Objects_Allocator_unlock();
       return RTEMS_SUCCESSFUL;
 
 #if defined(RTEMS_MULTIPROCESSING)
     case OBJECTS_REMOTE:
-      _Thread_Dispatch();
+      _Objects_Allocator_unlock();
       return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
 #endif
@@ -85,4 +86,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return RTEMS_INVALID_ID;
 }
Index: cpukit/rtems/src/partcreate.c
===================================================================
--- cpukit/rtems/src/partcreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/partcreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -54,5 +54,5 @@
 )
 {
-   Partition_Control           *the_partition;
+  Partition_Control *the_partition;
 
   if ( !rtems_is_name_valid( name ) )
@@ -78,10 +78,8 @@
 #endif
 
-  _Thread_Disable_dispatch();               /* prevents deletion */
-
   the_partition = _Partition_Allocate();
 
   if ( !the_partition ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -92,5 +90,5 @@
                             the_partition->Object.id, false ) ) ) {
     _Partition_Free( the_partition );
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -123,5 +121,5 @@
 #endif
 
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/partdelete.c
===================================================================
--- cpukit/rtems/src/partdelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/partdelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -30,4 +30,5 @@
   Objects_Locations           location;
 
+  _Objects_Allocator_lock();
   the_partition = _Partition_Get( id, &location );
   switch ( location ) {
@@ -36,5 +37,4 @@
       if ( the_partition->number_of_used_blocks == 0 ) {
         _Objects_Close( &_Partition_Information, &the_partition->Object );
-        _Partition_Free( the_partition );
 #if defined(RTEMS_MULTIPROCESSING)
         if ( _Attributes_Is_global( the_partition->attribute_set ) ) {
@@ -55,12 +55,15 @@
 
         _Objects_Put( &the_partition->Object );
+        _Partition_Free( the_partition );
+        _Objects_Allocator_unlock();
         return RTEMS_SUCCESSFUL;
       }
       _Objects_Put( &the_partition->Object );
+      _Objects_Allocator_unlock();
       return RTEMS_RESOURCE_IN_USE;
 
 #if defined(RTEMS_MULTIPROCESSING)
     case OBJECTS_REMOTE:
-      _Thread_Dispatch();
+      _Objects_Allocator_unlock();
       return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
 #endif
@@ -70,4 +73,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return RTEMS_INVALID_ID;
 }
Index: cpukit/rtems/src/ratemoncreate.c
===================================================================
--- cpukit/rtems/src/ratemoncreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/ratemoncreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -56,14 +56,12 @@
     return RTEMS_INVALID_ADDRESS;
 
-  _Thread_Disable_dispatch();            /* to prevent deletion */
-
   the_period = _Rate_monotonic_Allocate();
 
   if ( !the_period ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
 
-  the_period->owner = _Thread_Executing;
+  the_period->owner = _Thread_Get_executing();
   the_period->state = RATE_MONOTONIC_INACTIVE;
 
@@ -79,5 +77,5 @@
 
   *id = the_period->Object.id;
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/ratemondelete.c
===================================================================
--- cpukit/rtems/src/ratemondelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/ratemondelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -31,4 +31,5 @@
   Objects_Locations       location;
 
+  _Objects_Allocator_lock();
   the_period = _Rate_monotonic_Get( id, &location );
   switch ( location ) {
@@ -39,6 +40,7 @@
       (void) _Watchdog_Remove( &the_period->Timer );
       the_period->state = RATE_MONOTONIC_INACTIVE;
+      _Objects_Put( &the_period->Object );
       _Rate_monotonic_Free( the_period );
-      _Objects_Put( &the_period->Object );
+      _Objects_Allocator_unlock();
       return RTEMS_SUCCESSFUL;
 
@@ -50,4 +52,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return RTEMS_INVALID_ID;
 }
Index: cpukit/rtems/src/regioncreate.c
===================================================================
--- cpukit/rtems/src/regioncreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/regioncreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -67,7 +67,5 @@
     return RTEMS_INVALID_ADDRESS;
 
-  _RTEMS_Lock_allocator();                      /* to prevent deletion */
-
-    the_region = _Region_Allocate();
+  the_region = _Region_Allocate();
 
     if ( !the_region )
@@ -112,5 +110,6 @@
     }
 
-  _RTEMS_Unlock_allocator();
+  _Objects_Allocator_unlock();
+
   return return_status;
 }
Index: cpukit/rtems/src/regiondelete.c
===================================================================
--- cpukit/rtems/src/regiondelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/regiondelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -35,5 +35,5 @@
   Region_Control     *the_region;
 
-  _RTEMS_Lock_allocator();
+  _Objects_Allocator_lock();
 
     the_region = _Region_Get( id, &location );
@@ -62,5 +62,6 @@
     }
 
-  _RTEMS_Unlock_allocator();
+  _Objects_Allocator_unlock();
+
   return return_status;
 }
Index: cpukit/rtems/src/regionextend.c
===================================================================
--- cpukit/rtems/src/regionextend.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/regionextend.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -41,5 +41,5 @@
     return RTEMS_INVALID_ADDRESS;
 
-  _RTEMS_Lock_allocator();                      /* to prevent deletion */
+  _RTEMS_Lock_allocator(); /* to prevent deletion */
 
     the_region = _Region_Get( id, &location );
@@ -76,4 +76,5 @@
 
   _RTEMS_Unlock_allocator();
+
   return return_status;
 }
Index: cpukit/rtems/src/regiongetsegment.c
===================================================================
--- cpukit/rtems/src/regiongetsegment.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/regiongetsegment.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -48,5 +48,5 @@
   _RTEMS_Lock_allocator();
 
-    executing  = _Thread_Executing;
+    executing  = _Thread_Get_executing();
     the_region = _Region_Get( id, &location );
     switch ( location ) {
@@ -111,4 +111,5 @@
 
   _RTEMS_Unlock_allocator();
+
   return return_status;
 }
Index: cpukit/rtems/src/regionresizesegment.c
===================================================================
--- cpukit/rtems/src/regionresizesegment.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/regionresizesegment.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -65,5 +65,6 @@
 
         if ( status == HEAP_RESIZE_SUCCESSFUL )
-          _Region_Process_queue( the_region );    /* unlocks allocator */
+          /* unlocks allocator */
+          _Region_Process_queue( the_region );
         else
           _RTEMS_Unlock_allocator();
Index: cpukit/rtems/src/semcreate.c
===================================================================
--- cpukit/rtems/src/semcreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/semcreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -101,10 +101,8 @@
     return RTEMS_INVALID_NUMBER;
 
-  _Thread_Disable_dispatch();             /* prevents deletion */
-
   the_semaphore = _Semaphore_Allocate();
 
   if ( !the_semaphore ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -115,5 +113,5 @@
                             the_semaphore->Object.id, false ) ) ) {
     _Semaphore_Free( the_semaphore );
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -180,5 +178,5 @@
     mutex_status = _CORE_mutex_Initialize(
       &the_semaphore->Core_control.mutex,
-      _Thread_Executing,
+      _Thread_Get_executing(),
       &the_mutex_attr,
       (count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
@@ -187,5 +185,5 @@
     if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
       _Semaphore_Free( the_semaphore );
-      _Thread_Enable_dispatch();
+      _Objects_Allocator_unlock();
       return RTEMS_INVALID_PRIORITY;
     }
@@ -213,5 +211,5 @@
     );
 #endif
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/semdelete.c
===================================================================
--- cpukit/rtems/src/semdelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/semdelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -45,4 +45,6 @@
   Objects_Locations           location;
 
+  _Objects_Allocator_lock();
+
   the_semaphore = _Semaphore_Get( id, &location );
   switch ( location ) {
@@ -54,4 +56,5 @@
                  the_semaphore->attribute_set ) ) {
           _Objects_Put( &the_semaphore->Object );
+          _Objects_Allocator_unlock();
           return RTEMS_RESOURCE_IN_USE;
         }
@@ -71,6 +74,4 @@
       _Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
 
-      _Semaphore_Free( the_semaphore );
-
 #if defined(RTEMS_MULTIPROCESSING)
       if ( _Attributes_Is_global( the_semaphore->attribute_set ) ) {
@@ -86,10 +87,13 @@
       }
 #endif
+
       _Objects_Put( &the_semaphore->Object );
+      _Semaphore_Free( the_semaphore );
+      _Objects_Allocator_unlock();
       return RTEMS_SUCCESSFUL;
 
 #if defined(RTEMS_MULTIPROCESSING)
     case OBJECTS_REMOTE:
-      _Thread_Dispatch();
+      _Objects_Allocator_unlock();
       return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
 #endif
@@ -99,4 +103,5 @@
   }
 
+  _Objects_Allocator_unlock();
   return RTEMS_INVALID_ID;
 }
Index: cpukit/rtems/src/taskcreate.c
===================================================================
--- cpukit/rtems/src/taskcreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/taskcreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -106,9 +106,4 @@
 
   /*
-   *  Lock the allocator mutex for protection
-   */
-  _RTEMS_Lock_allocator();
-
-  /*
    *  Allocate the thread control block and -- if the task is global --
    *  allocate a global object control block.
@@ -123,5 +118,5 @@
 
   if ( !the_thread ) {
-    _RTEMS_Unlock_allocator();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -133,5 +128,5 @@
     if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
       _RTEMS_tasks_Free( the_thread );
-      _RTEMS_Unlock_allocator();
+      _Objects_Allocator_unlock();
       return RTEMS_TOO_MANY;
     }
@@ -165,5 +160,5 @@
 #endif
     _RTEMS_tasks_Free( the_thread );
-    _RTEMS_Unlock_allocator();
+    _Objects_Allocator_unlock();
     return RTEMS_UNSATISFIED;
   }
@@ -196,5 +191,5 @@
 #endif
 
-  _RTEMS_Unlock_allocator();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/timercreate.c
===================================================================
--- cpukit/rtems/src/timercreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/timercreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -39,10 +39,8 @@
     return RTEMS_INVALID_ADDRESS;
 
-  _Thread_Disable_dispatch();         /* to prevent deletion */
-
   the_timer = _Timer_Allocate();
 
   if ( !the_timer ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
@@ -58,5 +56,5 @@
 
   *id = the_timer->Object.id;
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/rtems/src/timerdelete.c
===================================================================
--- cpukit/rtems/src/timerdelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/rtems/src/timerdelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -33,4 +33,5 @@
   Objects_Locations  location;
 
+  _Objects_Allocator_lock();
   the_timer = _Timer_Get( id, &location );
   switch ( location ) {
@@ -39,6 +40,7 @@
       _Objects_Close( &_Timer_Information, &the_timer->Object );
       (void) _Watchdog_Remove( &the_timer->Ticker );
+      _Objects_Put( &the_timer->Object );
       _Timer_Free( the_timer );
-      _Objects_Put( &the_timer->Object );
+      _Objects_Allocator_unlock();
       return RTEMS_SUCCESSFUL;
 
@@ -50,4 +52,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return RTEMS_INVALID_ID;
 }
Index: cpukit/sapi/src/extensioncreate.c
===================================================================
--- cpukit/sapi/src/extensioncreate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/sapi/src/extensioncreate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -40,14 +40,14 @@
     return RTEMS_INVALID_NAME;
 
-  _Thread_Disable_dispatch();         /* to prevent deletion */
-
   the_extension = _Extension_Allocate();
 
   if ( !the_extension ) {
-    _Thread_Enable_dispatch();
+    _Objects_Allocator_unlock();
     return RTEMS_TOO_MANY;
   }
 
+  _Thread_Disable_dispatch();
   _User_extensions_Add_set_with_table( &the_extension->Extension, extension_table );
+  _Thread_Enable_dispatch();
 
   _Objects_Open(
@@ -58,5 +58,5 @@
 
   *id = the_extension->Object.id;
-  _Thread_Enable_dispatch();
+  _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
Index: cpukit/sapi/src/extensiondelete.c
===================================================================
--- cpukit/sapi/src/extensiondelete.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/sapi/src/extensiondelete.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -31,4 +31,5 @@
   Objects_Locations    location;
 
+  _Objects_Allocator_lock();
   the_extension = _Extension_Get( id, &location );
   switch ( location ) {
@@ -36,6 +37,7 @@
       _User_extensions_Remove_set( &the_extension->Extension );
       _Objects_Close( &_Extension_Information, &the_extension->Object );
+      _Objects_Put( &the_extension->Object );
       _Extension_Free( the_extension );
-      _Objects_Put( &the_extension->Object );
+      _Objects_Allocator_unlock();
       return RTEMS_SUCCESSFUL;
 
@@ -47,4 +49,6 @@
   }
 
+  _Objects_Allocator_unlock();
+
   return RTEMS_INVALID_ID;
 }
Index: cpukit/score/include/rtems/score/objectimpl.h
===================================================================
--- cpukit/score/include/rtems/score/objectimpl.h	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/include/rtems/score/objectimpl.h	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -21,4 +21,5 @@
 
 #include <rtems/score/object.h>
+#include <rtems/score/apimutex.h>
 #include <rtems/score/isrlevel.h>
 #include <rtems/score/threaddispatch.h>
@@ -265,23 +266,118 @@
 
 /**
- *  @brief Allocate an object.
- *
- *  This function allocates an object control block from
- *  the inactive chain of free object control blocks.
- *
- *  @param[in] information points to an object class information block.
- */
-Objects_Control *_Objects_Allocate(
+ * @brief Allocates an object without locking the allocator mutex.
+ *
+ * This function can be called in two contexts
+ * - the executing thread is the owner of the object allocator mutex, or
+ * - in case the system state is not up, e.g. during sequential system
+ *   initialization.
+ *
+ * @param[in] information The object information block.
+ *
+ * @retval NULL No object available.
+ * @retval object The allocated object.
+ *
+ * @see _Objects_Allocate() and _Objects_Free().
+ */
+Objects_Control *_Objects_Allocate_unprotected(
   Objects_Information *information
 );
 
 /**
- *  @brief Free an object.
- *
- *  This function frees an object control block to the
- *  inactive chain of free object control blocks.
- *
- *  @param[in] information points to an object class information block.
- *  @param[in] the_object points to the object to deallocate.
+ * @brief Allocates an object.
+ *
+ * This function locks the object allocator mutex via
+ * _Objects_Allocator_lock().  The caller must later unlock the object
+ * allocator mutex via _Objects_Allocator_unlock().  The caller must unlock the
+ * mutex in any case, even if the allocation failed due to resource shortage.
+ *
+ * A typical object allocation code looks like this:
+ * @code
+ * rtems_status_code some_create( rtems_id *id )
+ * {
+ *   rtems_status_code  sc;
+ *   Some_Control      *some;
+ *
+ *   // The object allocator mutex protects the executing thread from
+ *   // asynchronous thread restart and deletion.
+ *   some = (Some_Control *) _Objects_Allocate( &_Some_Information );
+ *
+ *   if ( some != NULL ) {
+ *     _Some_Initialize( some );
+ *     sc = RTEMS_SUCCESSFUL;
+ *   } else {
+ *     sc = RTEMS_TOO_MANY;
+ *   }
+ *
+ *   _Objects_Allocator_unlock();
+ *
+ *   return sc;
+ * }
+ * @endcode
+ *
+ * @param[in] information The object information block.
+ *
+ * @retval NULL No object available.
+ * @retval object The allocated object.
+ *
+ * @see _Objects_Free().
+ */
+Objects_Control *_Objects_Allocate( Objects_Information *information );
+
+/**
+ * @brief Frees an object.
+ *
+ * Appends the object to the chain of inactive objects.
+ *
+ * @param[in] information The object information block.
+ * @param[in] the_object The object to free.
+ *
+ * @see _Objects_Allocate().
+ *
+ * A typical object deletion code looks like this:
+ * @code
+ * rtems_status_code some_delete( rtems_id id )
+ * {
+ *   rtems_status_code  sc;
+ *   Some_Control      *some;
+ *   Objects_Locations  location;
+ *
+ *   // The object allocator mutex protects the executing thread from
+ *   // asynchronous thread restart and deletion.
+ *   _Objects_Allocator_lock();
+ *
+ *   // This will disable thread dispatching, so this starts a thread dispatch
+ *   // critical section.
+ *   some = (Semaphore_Control *)
+ *     _Objects_Get( &_Some_Information, id, &location );
+ *
+ *   switch ( location ) {
+ *     case OBJECTS_LOCAL:
+ *       // After the object close an object get with this identifier will
+ *       // fail.
+ *       _Objects_Close( &_Some_Information, &some->Object );
+ *
+ *       _Some_Delete( some );
+ *
+ *       // This enables thread dispatching, so the thread dispatch critical
+ *       // section ends here.
+ *       _Objects_Put( &some->Object );
+ *
+ *       // Thread dispatching is enabled.  The object free is only protected
+ *       // by the object allocator mutex.
+ *       _Objects_Free( &_Some_Information, &some->Object );
+ *
+ *       sc = RTEMS_SUCCESSFUL;
+ *       break;
+ *     default:
+ *       sc = RTEMS_INVALID_ID;
+ *       break;
+ *   }
+ *
+ *   _Objects_Allocator_unlock();
+ *
+ *   return sc;
+ * }
+ * @endcode
  */
 void _Objects_Free(
@@ -893,4 +989,35 @@
 }
 
+/**
+ * @brief Locks the object allocator mutex.
+ *
+ * While holding the allocator mutex the executing thread is protected from
+ * asynchronous thread restart and deletion.
+ *
+ * The usage of the object allocator mutex with the thread life protection
+ * makes it possible to allocate and free objects without thread dispatching
+ * disabled.  The usage of a unified workspace and unlimited objects may lead
+ * to heap fragmentation.  Thus the execution time of the _Objects_Allocate()
+ * function may increase during system run-time.
+ *
+ * @see _Objects_Allocator_unlock() and _Objects_Allocate().
+ */
+RTEMS_INLINE_ROUTINE void _Objects_Allocator_lock( void )
+{
+  _RTEMS_Lock_allocator();
+}
+
+/**
+ * @brief Unlocks the object allocator mutex.
+ *
+ * In case the mutex is fully unlocked, then this function restores the
+ * previous thread life protection state and thus may not return if the
+ * executing thread was restarted or deleted in the mean-time.
+ */
+RTEMS_INLINE_ROUTINE void _Objects_Allocator_unlock( void )
+{
+  _RTEMS_Unlock_allocator();
+}
+
 /** @} */
 
Index: cpukit/score/include/rtems/score/threadimpl.h
===================================================================
--- cpukit/score/include/rtems/score/threadimpl.h	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/include/rtems/score/threadimpl.h	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -591,11 +591,8 @@
 }
 
-/**
- * This routine allocates an internal thread.
- */
-
 RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void )
 {
-  return (Thread_Control *) _Objects_Allocate( &_Thread_Internal_information );
+  return (Thread_Control *)
+    _Objects_Allocate_unprotected( &_Thread_Internal_information );
 }
 
Index: cpukit/score/src/apimutex.c
===================================================================
--- cpukit/score/src/apimutex.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/src/apimutex.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -59,5 +59,6 @@
   };
 
-  mutex = (API_Mutex_Control *) _Objects_Allocate( &_API_Mutex_Information );
+  mutex = (API_Mutex_Control *)
+    _Objects_Allocate_unprotected( &_API_Mutex_Information );
 
   _CORE_mutex_Initialize( &mutex->Mutex, NULL, &attr, CORE_MUTEX_UNLOCKED );
Index: cpukit/score/src/objectactivecount.c
===================================================================
--- cpukit/score/src/objectactivecount.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/src/objectactivecount.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -18,4 +18,5 @@
 
 #include <rtems/score/objectimpl.h>
+#include <rtems/score/assert.h>
 #include <rtems/score/chainimpl.h>
 
@@ -24,6 +25,11 @@
 )
 {
-  size_t inactive = _Chain_Node_count_unprotected( &information->Inactive );
-  size_t maximum  = information->maximum;
+  size_t inactive;
+  size_t maximum;
+
+  _Assert( _Debug_Is_owner_of_allocator() );
+
+  inactive = _Chain_Node_count_unprotected( &information->Inactive );
+  maximum  = information->maximum;
 
   return (Objects_Maximum) ( maximum - inactive );
Index: cpukit/score/src/objectallocate.c
===================================================================
--- cpukit/score/src/objectallocate.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/src/objectallocate.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -20,5 +20,7 @@
 
 #include <rtems/score/objectimpl.h>
+#include <rtems/score/assert.h>
 #include <rtems/score/chainimpl.h>
+#include <rtems/score/sysstate.h>
 
 /* #define RTEMS_DEBUG_OBJECT_ALLOCATION */
@@ -28,9 +30,21 @@
 #endif
 
-Objects_Control *_Objects_Allocate(
+static Objects_Control *_Objects_Get_inactive(
+  Objects_Information *information
+)
+{
+  return (Objects_Control *) _Chain_Get_unprotected( &information->Inactive );
+}
+
+Objects_Control *_Objects_Allocate_unprotected(
   Objects_Information *information
 )
 {
   Objects_Control *the_object;
+
+  _Assert(
+    _Debug_Is_owner_of_allocator()
+      || !_System_state_Is_up( _System_state_Get() )
+  );
 
   /*
@@ -47,5 +61,5 @@
    *  With any luck, it is safe to attempt to allocate an object.
    */
-  the_object = (Objects_Control *) _Chain_Get( &information->Inactive );
+  the_object = _Objects_Get_inactive( information );
 
   if ( information->auto_extend ) {
@@ -57,5 +71,5 @@
     if ( !the_object ) {
       _Objects_Extend_information( information );
-      the_object =  (Objects_Control *) _Chain_Get( &information->Inactive );
+      the_object = _Objects_Get_inactive( information );
     }
 
@@ -84,2 +98,9 @@
   return the_object;
 }
+
+Objects_Control *_Objects_Allocate( Objects_Information *information )
+{
+  _RTEMS_Lock_allocator();
+
+  return _Objects_Allocate_unprotected( information );
+}
Index: cpukit/score/src/objectextendinformation.c
===================================================================
--- cpukit/score/src/objectextendinformation.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/src/objectextendinformation.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -21,6 +21,8 @@
 #include <rtems/score/objectimpl.h>
 #include <rtems/score/address.h>
+#include <rtems/score/assert.h>
 #include <rtems/score/chainimpl.h>
 #include <rtems/score/isrlevel.h>
+#include <rtems/score/sysstate.h>
 #include <rtems/score/wkspace.h>
 
@@ -43,8 +45,8 @@
 {
   Objects_Control  *the_object;
-  Chain_Control     Inactive;
   uint32_t          block_count;
   uint32_t          block;
   uint32_t          index_base;
+  uint32_t          index_end;
   uint32_t          minimum_index;
   uint32_t          index;
@@ -54,4 +56,9 @@
   bool              do_extend;
 
+  _Assert(
+    _Debug_Is_owner_of_allocator()
+      || !_System_state_Is_up( _System_state_Get() )
+  );
+
   /*
    *  Search for a free block of indexes. If we do NOT need to allocate or
@@ -77,4 +84,5 @@
     }
   }
+  index_end = index_base + information->allocation_size;
 
   maximum = (uint32_t) information->maximum + information->allocation_size;
@@ -214,10 +222,9 @@
     inactive_per_block[block_count] = 0;
 
-    for ( index=index_base ;
-          index < ( information->allocation_size + index_base );
-          index++ ) {
+    for ( index = index_base ; index < index_end ; ++index ) {
       local_table[ index ] = NULL;
     }
 
+    _Thread_Disable_dispatch();
     _ISR_Disable( level );
 
@@ -236,4 +243,5 @@
 
     _ISR_Enable( level );
+    _Thread_Enable_dispatch();
 
     _Workspace_Free( old_tables );
@@ -248,30 +256,19 @@
 
   /*
-   *  Initialize objects .. add to a local chain first.
-   */
-  _Chain_Initialize(
-    &Inactive,
-    information->object_blocks[ block ],
-    information->allocation_size,
-    information->size
-  );
-
-  /*
-   *  Move from the local chain, initialise, then append to the inactive chain
-   */
-  index = index_base;
-
-  while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) {
-
+   *  Append to inactive chain.
+   */
+  the_object = information->object_blocks[ block ];
+  for ( index = index_base ; index < index_end ; ++index ) {
     the_object->id = _Objects_Build_id(
-        information->the_api,
-        information->the_class,
-        _Objects_Local_node,
-        index
-      );
-
-    _Chain_Append( &information->Inactive, &the_object->Node );
-
-    index++;
+      information->the_api,
+      information->the_class,
+      _Objects_Local_node,
+      index
+    );
+
+    _Chain_Append_unprotected( &information->Inactive, &the_object->Node );
+
+    the_object = (Objects_Control *)
+      ( (char *) the_object + information->size );
   }
 
Index: cpukit/score/src/objectfree.c
===================================================================
--- cpukit/score/src/objectfree.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/src/objectfree.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -20,4 +20,5 @@
 
 #include <rtems/score/objectimpl.h>
+#include <rtems/score/assert.h>
 #include <rtems/score/chainimpl.h>
 
@@ -29,5 +30,7 @@
   uint32_t    allocation_size = information->allocation_size;
 
-  _Chain_Append( &information->Inactive, &the_object->Node );
+  _Assert( _Debug_Is_owner_of_allocator() );
+
+  _Chain_Append_unprotected( &information->Inactive, &the_object->Node );
 
   if ( information->auto_extend ) {
Index: cpukit/score/src/objectshrinkinformation.c
===================================================================
--- cpukit/score/src/objectshrinkinformation.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ cpukit/score/src/objectshrinkinformation.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -20,4 +20,5 @@
 
 #include <rtems/score/objectimpl.h>
+#include <rtems/score/assert.h>
 #include <rtems/score/chainimpl.h>
 #include <rtems/score/wkspace.h>
@@ -30,4 +31,6 @@
   uint32_t          block;
   uint32_t          index_base;
+
+  _Assert( _Debug_Is_owner_of_allocator() );
 
   /*
@@ -56,5 +59,5 @@
 
         if ( index >= index_base && index < index_end ) {
-          _Chain_Extract( &object->Node );
+          _Chain_Extract_unprotected( &object->Node );
         }
       }
Index: testsuites/sptests/spobjgetnext/init.c
===================================================================
--- testsuites/sptests/spobjgetnext/init.c	(revision 346845730cb7cdd3f2a1e9231cced7cdfd046ce1)
+++ testsuites/sptests/spobjgetnext/init.c	(revision 23fec9f0e18dc4913fab818118f836af150b98f3)
@@ -109,5 +109,7 @@
 
   puts( "Init - _Objects_Active_count" );
+  _Objects_Allocator_lock();
   active_count = _Objects_Active_count( info );
+  _Objects_Allocator_unlock();
   rtems_test_assert( active_count == 1 );
 
