[PATCH 3/3] score: Static Objects_Information initialization

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Dec 11 15:41:10 UTC 2018


Statically allocate the objects information together with the initial
set of objects either via <rtems/confdefs.h>.  Provide default object
informations with zero objects via librtemscpu.a.  This greatly
simplifies the workspace size estimate.  RTEMS applications which do not
use the unlimited objects option are easier to debug since all objects
reside now in statically allocated objects of the right types.

Update #3621.
---
 cpukit/Makefile.am                             |   1 +
 cpukit/include/rtems/confdefs.h                | 450 +++++++++----------------
 cpukit/include/rtems/config.h                  |  12 -
 cpukit/include/rtems/extensiondata.h           |  25 ++
 cpukit/include/rtems/extensionimpl.h           |   2 -
 cpukit/include/rtems/posix/key.h               |  42 +++
 cpukit/include/rtems/posix/keyimpl.h           |   5 -
 cpukit/include/rtems/posix/mqueue.h            |  31 +-
 cpukit/include/rtems/posix/mqueueimpl.h        |   6 -
 cpukit/include/rtems/posix/pthread.h           |   8 +-
 cpukit/include/rtems/posix/pthreadimpl.h       |   6 -
 cpukit/include/rtems/posix/semaphore.h         |  29 +-
 cpukit/include/rtems/posix/semaphoreimpl.h     |   6 -
 cpukit/include/rtems/posix/shm.h               |  25 +-
 cpukit/include/rtems/posix/shmimpl.h           |   2 -
 cpukit/include/rtems/posix/sigset.h            |   3 +-
 cpukit/include/rtems/posix/timer.h             |  24 +-
 cpukit/include/rtems/posix/timerimpl.h         |   6 -
 cpukit/include/rtems/rtems/barrierdata.h       |  25 ++
 cpukit/include/rtems/rtems/barrierimpl.h       |   6 -
 cpukit/include/rtems/rtems/config.h            |  55 ---
 cpukit/include/rtems/rtems/dpmemdata.h         |  25 ++
 cpukit/include/rtems/rtems/dpmemimpl.h         |   6 -
 cpukit/include/rtems/rtems/messagedata.h       |  39 +++
 cpukit/include/rtems/rtems/messageimpl.h       |   6 -
 cpukit/include/rtems/rtems/msgmp.h             |  12 -
 cpukit/include/rtems/rtems/partdata.h          |  39 +++
 cpukit/include/rtems/rtems/partimpl.h          |   6 -
 cpukit/include/rtems/rtems/partmp.h            |  12 -
 cpukit/include/rtems/rtems/ratemondata.h       |  25 ++
 cpukit/include/rtems/rtems/ratemonimpl.h       |   8 -
 cpukit/include/rtems/rtems/regiondata.h        |  25 ++
 cpukit/include/rtems/rtems/regionimpl.h        |   6 -
 cpukit/include/rtems/rtems/semdata.h           |  39 +++
 cpukit/include/rtems/rtems/semimpl.h           |   6 -
 cpukit/include/rtems/rtems/semmp.h             |  12 -
 cpukit/include/rtems/rtems/tasksdata.h         |   6 +
 cpukit/include/rtems/rtems/tasksimpl.h         |   6 -
 cpukit/include/rtems/rtems/timerdata.h         |  25 ++
 cpukit/include/rtems/rtems/timerimpl.h         |   6 -
 cpukit/include/rtems/score/freechain.h         |  18 +-
 cpukit/include/rtems/score/interr.h            |   2 +-
 cpukit/include/rtems/score/object.h            |  23 +-
 cpukit/include/rtems/score/objectdata.h        | 181 +++++++++-
 cpukit/include/rtems/score/objectimpl.h        | 186 +---------
 cpukit/include/rtems/score/thread.h            |  76 ++++-
 cpukit/include/rtems/score/threadimpl.h        |  22 +-
 cpukit/include/rtems/score/threadq.h           |   9 -
 cpukit/posix/src/key.c                         | 175 ++--------
 cpukit/posix/src/keycreate.c                   | 119 +++++++
 cpukit/posix/src/keyzerokvp.c                  |  36 ++
 cpukit/posix/src/mqueue.c                      |  81 ++---
 cpukit/posix/src/mqueueopen.c                  |  12 +
 cpukit/posix/src/psxsemaphore.c                |  72 ++--
 cpukit/posix/src/psxtimercreate.c              |  17 +-
 cpukit/posix/src/pthread.c                     | 191 +----------
 cpukit/posix/src/pthreadcreate.c               | 138 ++++++++
 cpukit/posix/src/ptimer.c                      |  94 ++----
 cpukit/posix/src/semopen.c                     |  12 +
 cpukit/posix/src/shm.c                         |  66 ++--
 cpukit/posix/src/shmopen.c                     |  12 +
 cpukit/rtems/src/barrier.c                     |  68 ++--
 cpukit/rtems/src/barriercreate.c               |  33 +-
 cpukit/rtems/src/dpmem.c                       |  68 ++--
 cpukit/rtems/src/dpmemcreate.c                 |  15 +-
 cpukit/rtems/src/msg.c                         |  83 ++---
 cpukit/rtems/src/msgqcreate.c                  |  35 +-
 cpukit/rtems/src/part.c                        |  79 ++---
 cpukit/rtems/src/partcreate.c                  |  43 +--
 cpukit/rtems/src/ratemon.c                     |  67 ++--
 cpukit/rtems/src/ratemoncreate.c               |  31 +-
 cpukit/rtems/src/region.c                      |  76 ++---
 cpukit/rtems/src/regioncreate.c                |  32 +-
 cpukit/rtems/src/rtemstimer.c                  |  69 ++--
 cpukit/rtems/src/sem.c                         |  76 ++---
 cpukit/rtems/src/semcreate.c                   |  19 ++
 cpukit/rtems/src/taskcreate.c                  |  62 ++++
 cpukit/rtems/src/tasks.c                       |  86 +----
 cpukit/rtems/src/timercreate.c                 |  14 +
 cpukit/sapi/src/extension.c                    |  60 ++--
 cpukit/sapi/src/extensioncreate.c              |  16 +-
 cpukit/score/src/freechain.c                   |  25 --
 cpukit/score/src/mpci.c                        |   2 +-
 cpukit/score/src/objectallocate.c              |  11 +-
 cpukit/score/src/objectextendinformation.c     |  57 ++--
 cpukit/score/src/objectfree.c                  |  25 +-
 cpukit/score/src/objectinitializeinformation.c |  99 ++----
 cpukit/score/src/objectshrinkinformation.c     |   5 +-
 cpukit/score/src/thread.c                      |  34 +-
 cpukit/score/src/threadcreateidle.c            |   2 +-
 cpukit/score/src/threadinitialize.c            |   2 +-
 cpukit/score/src/wkspace.c                     |  20 +-
 testsuites/psxtests/psxobj01/init.c            |  35 +-
 testsuites/sptests/Makefile.am                 |  10 -
 testsuites/sptests/configure.ac                |   1 -
 testsuites/sptests/spfatal13/spfatal13.doc     |  19 --
 testsuites/sptests/spfatal13/spfatal13.scn     |   3 -
 testsuites/sptests/spfatal13/testcase.h        |  26 --
 testsuites/sptests/spfreechain01/init.c        |   9 +-
 testsuites/sptests/spsimplesched02/init.c      |   2 +-
 testsuites/sptests/spsize/size.c               |   2 +-
 testsuites/sptests/spsysinit01/init.c          | 357 +++++++++++++++++---
 102 files changed, 2312 insertions(+), 2086 deletions(-)
 create mode 100644 cpukit/posix/src/keyzerokvp.c
 delete mode 100644 testsuites/sptests/spfatal13/spfatal13.doc
 delete mode 100644 testsuites/sptests/spfatal13/spfatal13.scn
 delete mode 100644 testsuites/sptests/spfatal13/testcase.h

diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
index b7a2d2bb11..7b23963149 100644
--- a/cpukit/Makefile.am
+++ b/cpukit/Makefile.am
@@ -512,6 +512,7 @@ librtemscpu_a_SOURCES += posix/src/keycreate.c
 librtemscpu_a_SOURCES += posix/src/keydelete.c
 librtemscpu_a_SOURCES += posix/src/keygetspecific.c
 librtemscpu_a_SOURCES += posix/src/keysetspecific.c
+librtemscpu_a_SOURCES += posix/src/keyzerokvp.c
 librtemscpu_a_SOURCES += posix/src/lio_listio.c
 librtemscpu_a_SOURCES += posix/src/mlockall.c
 librtemscpu_a_SOURCES += posix/src/mlock.c
diff --git a/cpukit/include/rtems/confdefs.h b/cpukit/include/rtems/confdefs.h
index 1c6c2c2b90..632600766f 100644
--- a/cpukit/include/rtems/confdefs.h
+++ b/cpukit/include/rtems/confdefs.h
@@ -1387,24 +1387,6 @@ RTEMS_SYSINIT_ITEM(
  */
 #define _Configure_Max_Objects(_max) \
   (_Configure_Zero_or_One(_max) * rtems_resource_maximum_per_allocation(_max))
-
-/**
- * This macro accounts for how memory for a set of configured objects is
- * allocated from the Executive Workspace.
- *
- * NOTE: It does NOT attempt to address the more complex case of unlimited
- *       objects.
- */
-#define _Configure_Object_RAM(_number, _size) ( \
-    _Configure_From_workspace(_Configure_Max_Objects(_number) * (_size)) + \
-    _Configure_From_workspace( \
-      _Configure_Zero_or_One(_number) * ( \
-        (_Configure_Max_Objects(_number) + 1) * sizeof(Objects_Control *) + \
-        _Configure_Align_up(sizeof(void *), CPU_ALIGNMENT) + \
-        _Configure_Align_up(sizeof(uint32_t), CPU_ALIGNMENT) \
-      ) \
-    ) \
-  )
 /**@}*/
 
 /**
@@ -2004,12 +1986,6 @@ RTEMS_SYSINIT_ITEM(
       #define CONFIGURE_MAXIMUM_POSIX_TIMERS \
         rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
     #endif
-/*
-    #if !defined(CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS)
-      #define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS \
-        rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
-    #endif
-*/
   #endif /* RTEMS_POSIX_API */
 #endif /* CONFIGURE_UNLIMITED_OBJECTS */
 
@@ -2039,16 +2015,11 @@ RTEMS_SYSINIT_ITEM(
 #ifndef CONFIGURE_MAXIMUM_TIMERS
   /** This specifies the maximum number of Classic API timers. */
   #define CONFIGURE_MAXIMUM_TIMERS             0
-  /*
-   * This macro is calculated to specify the memory required for
-   * Classic API timers.
-   */
-  #define _CONFIGURE_MEMORY_FOR_TIMERS(_timers) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_TIMERS(_timers) \
-    _Configure_Object_RAM(_timers, sizeof(Timer_Control) )
 #endif
 
+#define _CONFIGURE_TIMERS \
+  (CONFIGURE_MAXIMUM_TIMERS + _CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER)
+
 #ifndef CONFIGURE_MAXIMUM_SEMAPHORES
   /** This specifies the maximum number of Classic API semaphores. */
   #define CONFIGURE_MAXIMUM_SEMAPHORES                 0
@@ -2070,35 +2041,12 @@ RTEMS_SYSINIT_ITEM(
       )
 #endif
 
-/*
- * This macro is calculated to specify the memory required for
- * Classic API Semaphores.
- *
- * If there are no user or support semaphores defined, then we can assume
- * that no memory need be allocated at all for semaphores.
- */
-#if CONFIGURE_MAXIMUM_SEMAPHORES == 0
-  #define _CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) \
-    _Configure_Object_RAM(_semaphores, sizeof(Semaphore_Control) ) + \
-      _CONFIGURE_MEMORY_FOR_MRSP_SEMAPHORES
-#endif
-
 #ifndef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
   /**
    * This configuration parameter specifies the maximum number of
    * Classic API Message Queues.
    */
   #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES             0
-  /*
-   * This macro is calculated to specify the RTEMS Workspace required for
-   * the Classic API Message Queues.
-   */
-  #define _CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) \
-    _Configure_Object_RAM(_queues, sizeof(Message_queue_Control) )
 #endif
 
 #ifndef CONFIGURE_MAXIMUM_PARTITIONS
@@ -2107,14 +2055,6 @@ RTEMS_SYSINIT_ITEM(
    * Classic API Partitions.
    */
   #define CONFIGURE_MAXIMUM_PARTITIONS                 0
-  /*
-   * This macro is calculated to specify the memory required for
-   * Classic API
-   */
-  #define _CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) \
-    _Configure_Object_RAM(_partitions, sizeof(Partition_Control) )
 #endif
 
 #ifndef CONFIGURE_MAXIMUM_REGIONS
@@ -2123,14 +2063,6 @@ RTEMS_SYSINIT_ITEM(
    * Classic API Regions.
    */
   #define CONFIGURE_MAXIMUM_REGIONS              0
-  /*
-   * This macro is calculated to specify the memory required for
-   * Classic API Regions.
-   */
-  #define _CONFIGURE_MEMORY_FOR_REGIONS(_regions) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_REGIONS(_regions) \
-    _Configure_Object_RAM(_regions, sizeof(Region_Control) )
 #endif
 
 #ifndef CONFIGURE_MAXIMUM_PORTS
@@ -2139,14 +2071,6 @@ RTEMS_SYSINIT_ITEM(
    * Classic API Dual-Ported Memory Ports.
    */
   #define CONFIGURE_MAXIMUM_PORTS            0
-  /**
-   * This macro is calculated to specify the memory required for
-   * Classic API Dual-Ported Memory Ports.
-   */
-  #define _CONFIGURE_MEMORY_FOR_PORTS(_ports) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_PORTS(_ports) \
-    _Configure_Object_RAM(_ports, sizeof(Dual_ported_memory_Control) )
 #endif
 
 #ifndef CONFIGURE_MAXIMUM_PERIODS
@@ -2155,14 +2079,6 @@ RTEMS_SYSINIT_ITEM(
    * Classic API Rate Monotonic Periods.
    */
   #define CONFIGURE_MAXIMUM_PERIODS              0
-  /*
-   * This macro is calculated to specify the memory required for
-   * Classic API Rate Monotonic Periods.
-   */
-  #define _CONFIGURE_MEMORY_FOR_PERIODS(_periods) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_PERIODS(_periods) \
-    _Configure_Object_RAM(_periods, sizeof(Rate_monotonic_Control) )
 #endif
 
 /**
@@ -2178,18 +2094,7 @@ RTEMS_SYSINIT_ITEM(
  * Barriers required by the application and configured capabilities.
  */
 #define _CONFIGURE_BARRIERS \
-   (CONFIGURE_MAXIMUM_BARRIERS + _CONFIGURE_BARRIERS_FOR_FIFOS)
-
-/*
- * This macro is calculated to specify the memory required for
- * Classic API Barriers.
- */
-#if _CONFIGURE_BARRIERS == 0
-  #define _CONFIGURE_MEMORY_FOR_BARRIERS(_barriers) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_BARRIERS(_barriers) \
-    _Configure_Object_RAM(_barriers, sizeof(Barrier_Control) )
-#endif
+  (CONFIGURE_MAXIMUM_BARRIERS + _CONFIGURE_BARRIERS_FOR_FIFOS)
 
 #ifndef CONFIGURE_MAXIMUM_USER_EXTENSIONS
   /**
@@ -2197,14 +2102,6 @@ RTEMS_SYSINIT_ITEM(
    * Classic API User Extensions.
    */
   #define CONFIGURE_MAXIMUM_USER_EXTENSIONS                 0
-  /*
-   * This macro is calculated to specify the memory required for
-   * Classic API User Extensions.
-   */
-  #define _CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) 0
-#else
-  #define _CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) \
-    _Configure_Object_RAM(_extensions, sizeof(Extension_Control) )
 #endif
 
 /**@}*/ /* end of Classic API Configuration */
@@ -2333,16 +2230,6 @@ struct _reent *__getreent(void)
 #define _CONFIGURE_POSIX_KEYS \
   (CONFIGURE_MAXIMUM_POSIX_KEYS + _CONFIGURE_LIBIO_POSIX_KEYS)
 
-/*
- * This macro is calculated to specify the memory required for
- * POSIX API keys.
- */
-#define _CONFIGURE_MEMORY_FOR_POSIX_KEYS(_keys, _key_value_pairs) \
-   (_Configure_Object_RAM(_keys, sizeof(POSIX_Keys_Control) ) \
-    + _Configure_From_workspace( \
-      _Configure_Max_Objects(_key_value_pairs) \
-        * sizeof(POSIX_Keys_Key_value_pair)))
-
 /**
  * This configuration parameter specifies the maximum number of
  * POSIX API threads.
@@ -2356,9 +2243,8 @@ struct _reent *__getreent(void)
  * of the object to be duplicated.
  */
 #define _Configure_POSIX_Named_Object_RAM(_number, _size) \
-  (_Configure_Object_RAM(_number, _size) \
-    + _Configure_Max_Objects(_number) \
-      * _Configure_From_workspace(_POSIX_PATH_MAX + 1))
+  (_Configure_Max_Objects(_number) \
+    * _Configure_From_workspace(_POSIX_PATH_MAX + 1))
 
 /**
  * This configuration parameter specifies the maximum number of
@@ -2406,17 +2292,7 @@ struct _reent *__getreent(void)
 #define _CONFIGURE_MEMORY_FOR_POSIX_SHMS(_shms) \
   _Configure_POSIX_Named_Object_RAM(_shms, sizeof(POSIX_Shm_Control) )
 
-/*
- *  The rest of the POSIX threads API features are only available when
- *  POSIX is enabled.
- */
 #ifdef RTEMS_POSIX_API
-  #include <sys/types.h>
-  #include <signal.h>
-  #include <rtems/posix/psignal.h>
-  #include <rtems/posix/threadsup.h>
-  #include <rtems/posix/timer.h>
-
   /**
    * This configuration parameter specifies the maximum number of
    * POSIX API timers.
@@ -2424,13 +2300,14 @@ struct _reent *__getreent(void)
   #ifndef CONFIGURE_MAXIMUM_POSIX_TIMERS
     #define CONFIGURE_MAXIMUM_POSIX_TIMERS 0
   #endif
+#else
+  #if CONFIGURE_MAXIMUM_POSIX_TIMERS != 0
+    #error "CONFIGURE_MAXIMUM_POSIX_TIMERS must be zero if POSIX API is disabled"
+  #endif
+#endif
 
-  /*
-   * This macro is calculated to specify the memory required for
-   * POSIX API timers.
-   */
-  #define _CONFIGURE_MEMORY_FOR_POSIX_TIMERS(_timers) \
-    _Configure_Object_RAM(_timers, sizeof(POSIX_Timer_Control) )
+#ifdef RTEMS_POSIX_API
+  #include <rtems/posix/psignal.h>
 
   /**
    * This configuration parameter specifies the maximum number of
@@ -2439,15 +2316,34 @@ struct _reent *__getreent(void)
   #ifndef CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
     #define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 0
   #endif
+#else
+  #if CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0
+    #error "CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS must be zero if POSIX API is disabled"
+  #endif
+#endif
 
-  /*
-   * This macro is calculated to specify the memory required for
-   * POSIX API queued signals.
-   */
-  #define _CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(_queued_signals) \
-    _Configure_From_workspace( \
-      (_queued_signals) * (sizeof(POSIX_signals_Siginfo_node)) )
-#endif /* RTEMS_POSIX_API */
+#if CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS > 0
+  #define _CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS \
+    _Configure_From_workspace( (CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS) * \
+      sizeof( POSIX_signals_Siginfo_node ) )
+#else
+  #define _CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS 0
+#endif
+
+/*
+ *  If an attempt was made to configure POSIX objects and
+ *  the POSIX API was not configured into RTEMS, error out.
+ *
+ *  @note POSIX Keys are always available so the parameters
+ *        CONFIGURE_MAXIMUM_POSIX_KEYS and
+ *        CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS  are not in this list.
+ */
+#if !defined(RTEMS_POSIX_API)
+  #if ((CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
+       (CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0))
+  #error "CONFIGURATION ERROR: POSIX API support not configured!!"
+  #endif
+#endif
 
 #ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE
   #ifndef CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
@@ -2572,23 +2468,6 @@ struct _reent *__getreent(void)
      CONFIGURE_MAXIMUM_ADA_TASKS + \
      CONFIGURE_MAXIMUM_GOROUTINES)
 
-#ifdef RTEMS_POSIX_API
-  /*
-   * This macro is calculated to specify the memory required for
-   * the POSIX API in its entirety.
-   */
-  #define _CONFIGURE_MEMORY_FOR_POSIX \
-    (_CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS( \
-        CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS) + \
-      _CONFIGURE_MEMORY_FOR_POSIX_TIMERS(CONFIGURE_MAXIMUM_POSIX_TIMERS))
-#else
-  /*
-   * This macro is calculated to specify the memory required for
-   * the POSIX API in its entirety.
-   */
-  #define _CONFIGURE_MEMORY_FOR_POSIX 0
-#endif
-
 /*
  * We must be able to split the free block used for the second last allocation
  * into two parts so that we have a free block for the last allocation.  See
@@ -2597,6 +2476,12 @@ struct _reent *__getreent(void)
 #define _CONFIGURE_HEAP_HANDLER_OVERHEAD \
   _Configure_Align_up( HEAP_BLOCK_HEADER_SIZE, CPU_HEAP_ALIGNMENT )
 
+/**
+ * This calculates the amount of memory reserved for the IDLE tasks.
+ * In an SMP system, each CPU core has its own idle task.
+ */
+#define _CONFIGURE_IDLE_TASKS_COUNT _CONFIGURE_MAXIMUM_PROCESSORS
+
 /*
  *  Calculate the RAM size based on the maximum number of objects configured.
  */
@@ -2609,13 +2494,8 @@ struct _reent *__getreent(void)
  *     entry in the local pointer table.
  */
 #define _CONFIGURE_MEMORY_FOR_TASKS(_tasks, _number_FP_tasks) \
-  ( \
-    _Configure_Object_RAM(_tasks, sizeof(Configuration_Thread_control)) \
-      + _Configure_From_workspace(_Configure_Max_Objects(_tasks) \
-        * THREAD_QUEUE_HEADS_SIZE(_CONFIGURE_SCHEDULER_COUNT)) \
-      + _Configure_Max_Objects(_number_FP_tasks) \
-        * _Configure_From_workspace(CONTEXT_FP_SIZE) \
-  )
+  (_Configure_Max_Objects(_number_FP_tasks) \
+    * _Configure_From_workspace(CONTEXT_FP_SIZE))
 
 /*
  * This defines the amount of memory configured for the multiprocessing
@@ -2664,12 +2544,6 @@ struct _reent *__getreent(void)
   #define CONFIGURE_MEMORY_OVERHEAD 0
 #endif
 
-/**
- * This calculates the amount of memory reserved for the IDLE tasks.
- * In an SMP system, each CPU core has its own idle task.
- */
-#define _CONFIGURE_IDLE_TASKS_COUNT _CONFIGURE_MAXIMUM_PROCESSORS
-
 /**
  * This defines the formula used to compute the amount of memory
  * reserved for internal task control structures.
@@ -2705,23 +2579,6 @@ struct _reent *__getreent(void)
         * sizeof(User_extensions_Switch_control) \
     ))
 
-/**
- * This macro provides a summation of the memory required by the
- * Classic API as configured.
- */
-#define _CONFIGURE_MEMORY_FOR_CLASSIC \
-   (_CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS + \
-    _CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER ) + \
-   _CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_MAXIMUM_SEMAPHORES) + \
-   _CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES) + \
-   _CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS) + \
-   _CONFIGURE_MEMORY_FOR_REGIONS( CONFIGURE_MAXIMUM_REGIONS ) + \
-   _CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS) + \
-   _CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS) + \
-   _CONFIGURE_MEMORY_FOR_BARRIERS(_CONFIGURE_BARRIERS) + \
-   _CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) \
-  )
-
 /**
  * This calculates the memory required for the executive workspace.
  *
@@ -2734,17 +2591,14 @@ struct _reent *__getreent(void)
      _CONFIGURE_TASKS, _CONFIGURE_TASKS) + \
    _CONFIGURE_MEMORY_FOR_TASKS( \
      _CONFIGURE_POSIX_THREADS, _CONFIGURE_POSIX_THREADS) + \
-   _CONFIGURE_MEMORY_FOR_CLASSIC + \
-   _CONFIGURE_MEMORY_FOR_POSIX_KEYS( \
-      _CONFIGURE_POSIX_KEYS, \
-      CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ) + \
+   _CONFIGURE_MEMORY_FOR_MRSP_SEMAPHORES + \
    _CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \
      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES) + \
    _CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( \
      CONFIGURE_MAXIMUM_POSIX_SEMAPHORES) + \
    _CONFIGURE_MEMORY_FOR_POSIX_SHMS( \
      CONFIGURE_MAXIMUM_POSIX_SHMS) + \
-   _CONFIGURE_MEMORY_FOR_POSIX + \
+   _CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS + \
    _CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS + \
    _CONFIGURE_MEMORY_FOR_MP + \
    CONFIGURE_MESSAGE_BUFFER_MEMORY + \
@@ -2918,7 +2772,7 @@ struct _reent *__getreent(void)
 
   const size_t _Thread_Maximum_name_size = CONFIGURE_MAXIMUM_THREAD_NAME_SIZE;
 
-  typedef struct {
+  struct Thread_Configured_control {
     Thread_Control Control;
     #if CONFIGURE_MAXIMUM_USER_EXTENSIONS > 0
       void *extensions[ CONFIGURE_MAXIMUM_USER_EXTENSIONS + 1 ];
@@ -2938,43 +2792,41 @@ struct _reent *__getreent(void)
     #else
       struct { /* Empty */ } Newlib;
     #endif
-  } Configuration_Thread_control;
-
-  const size_t _Thread_Control_size = sizeof( Configuration_Thread_control );
+  };
 
   const Thread_Control_add_on _Thread_Control_add_ons[] = {
     {
-      offsetof( Configuration_Thread_control, Control.Scheduler.nodes ),
-      offsetof( Configuration_Thread_control, Scheduler_nodes )
+      offsetof( Thread_Configured_control, Control.Scheduler.nodes ),
+      offsetof( Thread_Configured_control, Scheduler_nodes )
     }, {
       offsetof(
-        Configuration_Thread_control,
+        Thread_Configured_control,
         Control.API_Extensions[ THREAD_API_RTEMS ]
       ),
-      offsetof( Configuration_Thread_control, API_RTEMS )
+      offsetof( Thread_Configured_control, API_RTEMS )
     }, {
       offsetof(
-        Configuration_Thread_control,
+        Thread_Configured_control,
         Control.libc_reent
       ),
-      offsetof( Configuration_Thread_control, Newlib )
+      offsetof( Thread_Configured_control, Newlib )
     }
     #if CONFIGURE_MAXIMUM_THREAD_NAME_SIZE > 1
       , {
         offsetof(
-          Configuration_Thread_control,
+          Thread_Configured_control,
           Control.Join_queue.Queue.name
         ),
-        offsetof( Configuration_Thread_control, name )
+        offsetof( Thread_Configured_control, name )
       }
     #endif
     #ifdef RTEMS_POSIX_API
       , {
         offsetof(
-          Configuration_Thread_control,
+          Thread_Configured_control,
           Control.API_Extensions[ THREAD_API_POSIX ]
         ),
-        offsetof( Configuration_Thread_control, API_POSIX )
+        offsetof( Thread_Configured_control, API_POSIX )
       }
     #endif
   };
@@ -2982,46 +2834,121 @@ struct _reent *__getreent(void)
   const size_t _Thread_Control_add_on_count =
     RTEMS_ARRAY_SIZE( _Thread_Control_add_ons );
 
+  struct Thread_queue_Configured_heads {
+    Thread_queue_Heads Heads;
+    #if defined(RTEMS_SMP)
+      Thread_queue_Priority_queue Priority[ _CONFIGURE_SCHEDULER_COUNT ];
+    #endif
+  };
+
+  const size_t _Thread_queue_Heads_size =
+    sizeof( Thread_queue_Configured_heads );
+
   const uint32_t _Watchdog_Nanoseconds_per_tick =
     1000 * CONFIGURE_MICROSECONDS_PER_TICK;
 
   const uint32_t _Watchdog_Ticks_per_second = _CONFIGURE_TICKS_PER_SECOND;
 
+  const size_t _Thread_Initial_thread_count = _CONFIGURE_IDLE_TASKS_COUNT +
+    _CONFIGURE_MPCI_RECEIVE_SERVER_COUNT + _CONFIGURE_TASKS +
+    _CONFIGURE_POSIX_THREADS;
+
+  THREAD_INFORMATION_DEFINE(
+    _Thread,
+    OBJECTS_INTERNAL_API,
+    OBJECTS_INTERNAL_THREADS,
+    _CONFIGURE_IDLE_TASKS_COUNT + _CONFIGURE_MPCI_RECEIVE_SERVER_COUNT
+  );
+
+  #if _CONFIGURE_BARRIERS > 0
+    BARRIER_INFORMATION_DEFINE( _CONFIGURE_BARRIERS );
+  #endif
+
+  #if CONFIGURE_MAXIMUM_MESSAGE_QUEUES > 0
+    MESSAGE_QUEUE_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_MESSAGE_QUEUES );
+  #endif
+
+  #if CONFIGURE_MAXIMUM_PARTITIONS > 0
+    PARTITION_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_PARTITIONS );
+  #endif
+
+  #if CONFIGURE_MAXIMUM_PERIODS > 0
+    RATE_MONOTONIC_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_PERIODS );
+  #endif
+
+  #if CONFIGURE_MAXIMUM_PORTS > 0
+    DUAL_PORTED_MEMORY_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_PORTS );
+  #endif
+
+  #if CONFIGURE_MAXIMUM_REGIONS > 0
+    REGION_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_REGIONS );
+  #endif
+
+  #if CONFIGURE_MAXIMUM_SEMAPHORES > 0
+    SEMAPHORE_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_SEMAPHORES );
+  #endif
+
+  #if _CONFIGURE_TIMERS > 0
+    TIMER_INFORMATION_DEFINE( _CONFIGURE_TIMERS );
+  #endif
+
+  #if _CONFIGURE_TASKS > 0
+    THREAD_INFORMATION_DEFINE(
+      _RTEMS_tasks,
+      OBJECTS_CLASSIC_API,
+      OBJECTS_RTEMS_TASKS,
+      _CONFIGURE_TASKS
+    );
+  #endif
+
+  #if CONFIGURE_MAXIMUM_USER_EXTENSIONS > 0
+    EXTENSION_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_USER_EXTENSIONS );
+  #endif
+
   /**
    * This is the Classic API Configuration Table.
    */
   rtems_api_configuration_table Configuration_RTEMS_API = {
-    _CONFIGURE_TASKS,
-    CONFIGURE_MAXIMUM_TIMERS + _CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER,
-    CONFIGURE_MAXIMUM_SEMAPHORES,
-    CONFIGURE_MAXIMUM_MESSAGE_QUEUES,
-    CONFIGURE_MAXIMUM_PARTITIONS,
-    CONFIGURE_MAXIMUM_REGIONS,
-    CONFIGURE_MAXIMUM_PORTS,
-    CONFIGURE_MAXIMUM_PERIODS,
-    _CONFIGURE_BARRIERS,
     CONFIGURE_INIT_TASK_TABLE_SIZE,
     CONFIGURE_INIT_TASK_TABLE
   };
 
+  #if CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS > 0
+    POSIX_Keys_Key_value_pair _POSIX_Keys_Key_value_pairs[
+      rtems_resource_maximum_per_allocation(
+        CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS
+      )
+    ];
+
+    const uint32_t _POSIX_Keys_Key_value_pair_maximum =
+      CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS;
+  #endif
+
+  #if _CONFIGURE_POSIX_KEYS > 0
+    POSIX_KEYS_INFORMATION_DEFINE( _CONFIGURE_POSIX_KEYS );
+  #endif
+
   #if CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES > 0
-    const uint32_t _Configuration_POSIX_Maximum_message_queues =
-      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES;
+    POSIX_MESSAGE_QUEUE_INFORMATION_DEFINE(
+      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
+    );
   #endif
 
   #if CONFIGURE_MAXIMUM_POSIX_SEMAPHORES > 0
-    const uint32_t _Configuration_POSIX_Maximum_named_semaphores =
-      CONFIGURE_MAXIMUM_POSIX_SEMAPHORES;
+    POSIX_SEMAPHORE_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_POSIX_SEMAPHORES );
   #endif
 
   #if CONFIGURE_MAXIMUM_POSIX_SHMS > 0
-    const uint32_t _Configuration_POSIX_Maximum_shms =
-      CONFIGURE_MAXIMUM_POSIX_SHMS;
+    POSIX_SHM_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_POSIX_SHMS );
   #endif
 
   #if _CONFIGURE_POSIX_THREADS > 0
-    const uint32_t _Configuration_POSIX_Maximum_threads =
-      _CONFIGURE_POSIX_THREADS;
+    THREAD_INFORMATION_DEFINE(
+      _POSIX_Threads,
+      OBJECTS_POSIX_API,
+      OBJECTS_POSIX_THREADS,
+      CONFIGURE_MAXIMUM_POSIX_THREADS
+    );
   #endif
 
   #ifdef RTEMS_POSIX_API
@@ -3031,8 +2958,7 @@ struct _reent *__getreent(void)
     #endif
 
     #if CONFIGURE_MAXIMUM_POSIX_TIMERS > 0
-      const uint32_t _Configuration_POSIX_Maximum_timers =
-        CONFIGURE_MAXIMUM_POSIX_TIMERS;
+      POSIX_TIMER_INFORMATION_DEFINE( CONFIGURE_MAXIMUM_POSIX_TIMERS );
     #endif
   #endif
 
@@ -3057,8 +2983,6 @@ struct _reent *__getreent(void)
     CONFIGURE_EXECUTIVE_RAM_SIZE,             /* required RTEMS workspace */
     _CONFIGURE_STACK_SPACE_SIZE,               /* required stack space */
     CONFIGURE_MAXIMUM_USER_EXTENSIONS,        /* maximum dynamic extensions */
-    _CONFIGURE_POSIX_KEYS,                     /* POSIX keys are always */
-    CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS,  /*   enabled */
     CONFIGURE_MICROSECONDS_PER_TICK,          /* microseconds per clock tick */
     CONFIGURE_TICKS_PER_TIMESLICE,            /* ticks per timeslice quantum */
     CONFIGURE_IDLE_TASK_BODY,                 /* user's IDLE task */
@@ -3218,35 +3142,12 @@ struct _reent *__getreent(void)
 
     uint32_t PER_INTEGER_TASK;
     uint32_t FP_OVERHEAD;
-    uint32_t CLASSIC;
-    uint32_t POSIX;
 
     /* System overhead pieces */
     uint32_t MEMORY_FOR_IDLE_TASK;
 
-    /* Classic API Pieces */
-    uint32_t CLASSIC_TASKS;
-    uint32_t TIMERS;
-    uint32_t SEMAPHORES;
-    uint32_t MESSAGE_QUEUES;
-    uint32_t PARTITIONS;
-    uint32_t REGIONS;
-    uint32_t PORTS;
-    uint32_t PERIODS;
-    uint32_t BARRIERS;
-    uint32_t USER_EXTENSIONS;
-
-    /* POSIX API managers that are always enabled */
-    uint32_t POSIX_KEYS;
-
     /* POSIX API Pieces */
-#ifdef RTEMS_POSIX_API
-    uint32_t POSIX_TIMERS;
     uint32_t POSIX_QUEUED_SIGNALS;
-#endif
-    uint32_t POSIX_MESSAGE_QUEUES;
-    uint32_t POSIX_SEMAPHORES;
-    uint32_t POSIX_SHMS;
 
     /* Stack space sizes */
     uint32_t IDLE_TASKS_STACK;
@@ -3266,36 +3167,12 @@ struct _reent *__getreent(void)
     _CONFIGURE_INITIALIZATION_THREADS_EXTRA_STACKS,
     _CONFIGURE_MEMORY_FOR_TASKS(1, 0),
     _CONFIGURE_MEMORY_FOR_TASKS(0, 1),
-    _CONFIGURE_MEMORY_FOR_CLASSIC,
-    _CONFIGURE_MEMORY_FOR_POSIX,
 
     /* System overhead pieces */
     _CONFIGURE_MEMORY_FOR_INTERNAL_TASKS,
 
-    /* Classic API Pieces */
-    _CONFIGURE_MEMORY_FOR_TASKS(CONFIGURE_MAXIMUM_TASKS, 0),
-    _CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS),
-    _CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_MAXIMUM_SEMAPHORES),
-    _CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES),
-    _CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS),
-    _CONFIGURE_MEMORY_FOR_REGIONS( CONFIGURE_MAXIMUM_REGIONS ),
-    _CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS),
-    _CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS),
-    _CONFIGURE_MEMORY_FOR_BARRIERS(_CONFIGURE_BARRIERS),
-    _CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS),
-    _CONFIGURE_MEMORY_FOR_POSIX_KEYS( _CONFIGURE_POSIX_KEYS, \
-                                     CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ),
-
     /* POSIX API Pieces */
-#ifdef RTEMS_POSIX_API
-    _CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ),
-    _CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(
-      CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ),
-#endif
-    _CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(
-      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES ),
-    _CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( CONFIGURE_MAXIMUM_POSIX_SEMAPHORES ),
-    _CONFIGURE_MEMORY_FOR_POSIX_SHMS( CONFIGURE_MAXIMUM_POSIX_SHMS ),
+    _CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS,
 
     /* Stack space sizes */
     _CONFIGURE_IDLE_TASKS_STACK,
@@ -3347,21 +3224,6 @@ struct _reent *__getreent(void)
 #error "CONFIGURATION ERROR: RTEMS not configured for multiprocessing!!"
 #endif
 
-/*
- *  If an attempt was made to configure POSIX objects and
- *  the POSIX API was not configured into RTEMS, error out.
- *
- *  @note POSIX Keys are always available so the parameters
- *        CONFIGURE_MAXIMUM_POSIX_KEYS and
- *        CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS  are not in this list.
- */
-#if !defined(RTEMS_POSIX_API)
-  #if ((CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
-       (CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0))
-  #error "CONFIGURATION ERROR: POSIX API support not configured!!"
-  #endif
-#endif
-
 #if !defined(RTEMS_SCHEDSIM)
   #if !defined(CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE)
     /*
diff --git a/cpukit/include/rtems/config.h b/cpukit/include/rtems/config.h
index 36b20dba09..ae11fd9df8 100644
--- a/cpukit/include/rtems/config.h
+++ b/cpukit/include/rtems/config.h
@@ -127,18 +127,6 @@ typedef struct {
    */
   uintptr_t                      stack_space_size;
 
-  /** 
-   * This field specifies the maximum number of dynamically installed
-   * used extensions.
-   */
-  uint32_t                       maximum_extensions;
-
-  /**
-   * This field contains the maximum number of POSIX API
-   * keys which are configured for this application.
-   */
-  uint32_t                       maximum_keys;
-
   /**
    * This field contains the maximum number of POSIX API
    * key value pairs which are configured for this application.
diff --git a/cpukit/include/rtems/extensiondata.h b/cpukit/include/rtems/extensiondata.h
index e665fda04f..61319d5668 100644
--- a/cpukit/include/rtems/extensiondata.h
+++ b/cpukit/include/rtems/extensiondata.h
@@ -37,6 +37,31 @@ typedef struct {
   User_extensions_Control  Extension;
 }   Extension_Control;
 
+/**
+ * @brief The Classic Extensions objects information.
+ */
+extern Objects_Information _Extension_Information;
+
+/**
+ * @brief Macro to define the objects information for the Classic Extensions
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define EXTENSION_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Extension, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_EXTENSIONS, \
+    Extension_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/extensionimpl.h b/cpukit/include/rtems/extensionimpl.h
index fd71d530ae..6ad4956b3a 100644
--- a/cpukit/include/rtems/extensionimpl.h
+++ b/cpukit/include/rtems/extensionimpl.h
@@ -33,8 +33,6 @@ extern "C" {
  * @{
  */
 
-extern Objects_Information  _Extension_Information;
-
 RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void )
 {
   return (Extension_Control *) _Objects_Allocate( &_Extension_Information );
diff --git a/cpukit/include/rtems/posix/key.h b/cpukit/include/rtems/posix/key.h
index 1f09916f06..a710855b93 100644
--- a/cpukit/include/rtems/posix/key.h
+++ b/cpukit/include/rtems/posix/key.h
@@ -70,6 +70,24 @@ typedef struct {
   void *value;
 } POSIX_Keys_Key_value_pair;
 
+/**
+ * @brief The initial set of POSIX key and value pairs.
+ *
+ * This array is provided via <rtems/confdefs.h> in case POSIX key and value
+ * pairs are configured.  The POSIX key and value pair count in this array must
+ * be equal to
+ * _Objects_Maximum_per_allocation( _POSIX_Keys_Key_value_pair_maximum ).
+ */
+extern POSIX_Keys_Key_value_pair _POSIX_Keys_Key_value_pairs[];
+
+/**
+ * @brief The POSIX key and value pairs maximum.
+ *
+ * This value is provided via <rtems/confdefs.h> in case POSIX key and value
+ * pairs are configured.  The OBJECTS_UNLIMITED_OBJECTS flag may be set.
+ */
+extern const uint32_t _POSIX_Keys_Key_value_pair_maximum;
+
 /**
  * @brief The data structure used to manage a POSIX key.
  */
@@ -85,6 +103,30 @@ typedef struct {
    Chain_Control Key_value_pairs;
  }  POSIX_Keys_Control;
 
+/**
+ * @brief The POSIX Key objects information.
+ */
+extern Objects_Information _POSIX_Keys_Information;
+
+/**
+ * @brief Macro to define the objects information for the POSIX Key objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define POSIX_KEYS_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _POSIX_Keys, \
+    OBJECTS_POSIX_API, \
+    OBJECTS_POSIX_KEYS, \
+    POSIX_Keys_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/posix/keyimpl.h b/cpukit/include/rtems/posix/keyimpl.h
index 1148123638..d27244fe81 100644
--- a/cpukit/include/rtems/posix/keyimpl.h
+++ b/cpukit/include/rtems/posix/keyimpl.h
@@ -36,11 +36,6 @@ extern "C" {
  * @{
  */
 
-/**
- * @brief The information control block used to manage this class of objects.
- */
-extern Objects_Information _POSIX_Keys_Information;
-
 /**
  * @brief This freechain is used as a memory pool for POSIX_Keys_Key_value_pair.
  */
diff --git a/cpukit/include/rtems/posix/mqueue.h b/cpukit/include/rtems/posix/mqueue.h
index bec82ee3d9..84010e7d4f 100644
--- a/cpukit/include/rtems/posix/mqueue.h
+++ b/cpukit/include/rtems/posix/mqueue.h
@@ -31,11 +31,13 @@
 #ifndef _RTEMS_POSIX_MQUEUE_H
 #define _RTEMS_POSIX_MQUEUE_H
 
-#include <signal.h>
-#include <mqueue.h> /* struct mq_attr */
 #include <rtems/score/coremsg.h>
 #include <rtems/score/objectdata.h>
 
+#include <limits.h>
+#include <mqueue.h>
+#include <signal.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -61,7 +63,30 @@ typedef struct {
    int                         oflag;
 }  POSIX_Message_queue_Control;
 
-extern const uint32_t _Configuration_POSIX_Maximum_message_queues;
+/**
+ * @brief The POSIX Message Queue objects information.
+ */
+extern Objects_Information _POSIX_Message_queue_Information;
+
+/**
+ * @brief Macro to define the objects information for the POSIX Message Queue
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define POSIX_MESSAGE_QUEUE_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _POSIX_Message_queue, \
+    OBJECTS_POSIX_API, \
+    OBJECTS_POSIX_MESSAGE_QUEUES, \
+    POSIX_Message_queue_Control, \
+    max, \
+    _POSIX_PATH_MAX, \
+    NULL \
+  )
 
 /** @} */
 
diff --git a/cpukit/include/rtems/posix/mqueueimpl.h b/cpukit/include/rtems/posix/mqueueimpl.h
index 28381ad54b..14573287ad 100644
--- a/cpukit/include/rtems/posix/mqueueimpl.h
+++ b/cpukit/include/rtems/posix/mqueueimpl.h
@@ -30,12 +30,6 @@
 extern "C" {
 #endif
 
-/**
- *  This defines the information control block used to manage
- *  this class of objects.
- */
-extern Objects_Information _POSIX_Message_queue_Information;
-
 /**
  * @brief Delete a POSIX Message Queue
  *
diff --git a/cpukit/include/rtems/posix/pthread.h b/cpukit/include/rtems/posix/pthread.h
index 25bf40ef27..9b59fd922d 100644
--- a/cpukit/include/rtems/posix/pthread.h
+++ b/cpukit/include/rtems/posix/pthread.h
@@ -38,8 +38,6 @@ extern "C" {
 
 extern const size_t _Configuration_POSIX_Minimum_stack_size;
 
-extern const uint32_t _Configuration_POSIX_Maximum_threads;
-
 /**
  * @brief POSIX threads initialize user threads body.
  *
@@ -48,6 +46,12 @@ extern const uint32_t _Configuration_POSIX_Maximum_threads;
  */
 extern void _POSIX_Threads_Initialize_user_threads_body(void);
 
+/**
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+extern Thread_Information _POSIX_Threads_Information;
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/posix/pthreadimpl.h b/cpukit/include/rtems/posix/pthreadimpl.h
index be44716983..abb4d0f942 100644
--- a/cpukit/include/rtems/posix/pthreadimpl.h
+++ b/cpukit/include/rtems/posix/pthreadimpl.h
@@ -42,12 +42,6 @@ extern "C" {
  */
 #define PTHREAD_MINIMUM_STACK_SIZE _Configuration_POSIX_Minimum_stack_size
 
-/**
- * The following defines the information control block used to manage
- * this class of objects.
- */
-extern Thread_Information _POSIX_Threads_Information;
-
 #if defined(RTEMS_POSIX_API)
 RTEMS_INLINE_ROUTINE void _POSIX_Threads_Sporadic_timer_insert(
   Thread_Control    *the_thread,
diff --git a/cpukit/include/rtems/posix/semaphore.h b/cpukit/include/rtems/posix/semaphore.h
index 16b6d711cc..db36b39c9d 100644
--- a/cpukit/include/rtems/posix/semaphore.h
+++ b/cpukit/include/rtems/posix/semaphore.h
@@ -19,9 +19,11 @@
 #ifndef _RTEMS_POSIX_SEMAPHORE_H
 #define _RTEMS_POSIX_SEMAPHORE_H
 
-#include <semaphore.h>
 #include <rtems/score/objectdata.h>
 
+#include <limits.h>
+#include <semaphore.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -46,7 +48,30 @@ typedef struct {
    uint32_t        open_count;
 }  POSIX_Semaphore_Control;
 
-extern const uint32_t _Configuration_POSIX_Maximum_named_semaphores;
+/**
+ * @brief The POSIX Semaphore objects information.
+ */
+extern Objects_Information _POSIX_Semaphore_Information;
+
+/**
+ * @brief Macro to define the objects information for the POSIX Semaphore
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define POSIX_SEMAPHORE_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _POSIX_Semaphore, \
+    OBJECTS_POSIX_API, \
+    OBJECTS_POSIX_SEMAPHORES, \
+    POSIX_Semaphore_Control, \
+    max, \
+    _POSIX_PATH_MAX, \
+    NULL \
+  )
 
 /** @} */
 
diff --git a/cpukit/include/rtems/posix/semaphoreimpl.h b/cpukit/include/rtems/posix/semaphoreimpl.h
index 5ae6a300fa..b662d001cb 100644
--- a/cpukit/include/rtems/posix/semaphoreimpl.h
+++ b/cpukit/include/rtems/posix/semaphoreimpl.h
@@ -34,12 +34,6 @@ extern "C" {
  */
 #define POSIX_SEMAPHORE_MAGIC 0x5d367fe7UL
 
-/**
- *  This defines the information control block used to manage
- *  this class of objects.
- */
-extern Objects_Information _POSIX_Semaphore_Information;
-
 RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *
   _POSIX_Semaphore_Allocate_unprotected( void )
 {
diff --git a/cpukit/include/rtems/posix/shm.h b/cpukit/include/rtems/posix/shm.h
index ae0416e1fe..3d10e65fea 100644
--- a/cpukit/include/rtems/posix/shm.h
+++ b/cpukit/include/rtems/posix/shm.h
@@ -126,7 +126,30 @@ typedef struct {
    time_t               ctime;
 } POSIX_Shm_Control;
 
-extern const uint32_t _Configuration_POSIX_Maximum_shms;
+/**
+ * @brief The POSIX Shared Memory objects information.
+ */
+extern Objects_Information _POSIX_Shm_Information;
+
+/**
+ * @brief Macro to define the objects information for the POSIX Shared Memory
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define POSIX_SHM_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _POSIX_Shm, \
+    OBJECTS_POSIX_API, \
+    OBJECTS_POSIX_SHMS, \
+    POSIX_Shm_Control, \
+    max, \
+    _POSIX_PATH_MAX, \
+    NULL \
+  )
 
 /**
  * @brief object_create operation for shm objects stored in RTEMS Workspace.
diff --git a/cpukit/include/rtems/posix/shmimpl.h b/cpukit/include/rtems/posix/shmimpl.h
index f16af8123d..6882119a83 100644
--- a/cpukit/include/rtems/posix/shmimpl.h
+++ b/cpukit/include/rtems/posix/shmimpl.h
@@ -31,8 +31,6 @@ extern "C" {
  * @{
  */
 
-extern Objects_Information _POSIX_Shm_Information;
-
 RTEMS_INLINE_ROUTINE POSIX_Shm_Control *_POSIX_Shm_Allocate_unprotected( void )
 {
   return (POSIX_Shm_Control *)
diff --git a/cpukit/include/rtems/posix/sigset.h b/cpukit/include/rtems/posix/sigset.h
index 96bcc086ba..6f46f61104 100644
--- a/cpukit/include/rtems/posix/sigset.h
+++ b/cpukit/include/rtems/posix/sigset.h
@@ -19,7 +19,8 @@
 #ifndef _RTEMS_POSIX_SIGSET_H
 #define _RTEMS_POSIX_SIGSET_H
 
-#include <signal.h> // sigset_t
+#include <stdbool.h>
+#include <signal.h>
 
 /*
  *  Currently 32 signals numbered 1-32 are defined
diff --git a/cpukit/include/rtems/posix/timer.h b/cpukit/include/rtems/posix/timer.h
index 2cbc56e873..0b7a91e256 100644
--- a/cpukit/include/rtems/posix/timer.h
+++ b/cpukit/include/rtems/posix/timer.h
@@ -50,7 +50,29 @@ typedef struct {
   struct timespec   time;       /* Time at which the timer was started   */
 } POSIX_Timer_Control;
 
-extern const uint32_t _Configuration_POSIX_Maximum_timers;
+/**
+ * @brief The POSIX Timer objects information.
+ */
+extern Objects_Information _POSIX_Timer_Information;
+
+/**
+ * @brief Macro to define the objects information for the POSIX Timer objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define POSIX_TIMER_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _POSIX_Timer, \
+    OBJECTS_POSIX_API, \
+    OBJECTS_POSIX_TIMERS, \
+    POSIX_Timer_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
 
 /** @} */
 
diff --git a/cpukit/include/rtems/posix/timerimpl.h b/cpukit/include/rtems/posix/timerimpl.h
index 42a814c992..2b4eec1e24 100644
--- a/cpukit/include/rtems/posix/timerimpl.h
+++ b/cpukit/include/rtems/posix/timerimpl.h
@@ -51,12 +51,6 @@ extern "C" {
 #error "POSIX_TIMER_RELATIVE == TIMER_ABSTIME"
 #endif
 
-/**
- *  The following defines the information control block used to manage
- *  this class of objects.
- */
-extern Objects_Information _POSIX_Timer_Information;
-
 /**
  *  @brief POSIX Timer Allocate
  *
diff --git a/cpukit/include/rtems/rtems/barrierdata.h b/cpukit/include/rtems/rtems/barrierdata.h
index 12b2eab2d8..1598bbf6db 100644
--- a/cpukit/include/rtems/rtems/barrierdata.h
+++ b/cpukit/include/rtems/rtems/barrierdata.h
@@ -44,6 +44,31 @@ typedef struct {
   rtems_attribute          attribute_set;
 }   Barrier_Control;
 
+/**
+ * @brief The Classic Barrier objects information.
+ */
+extern Objects_Information _Barrier_Information;
+
+/**
+ * @brief Macro to define the objects information for the Classic Barrier
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define BARRIER_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Barrier, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_BARRIERS, \
+    Barrier_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/barrierimpl.h b/cpukit/include/rtems/rtems/barrierimpl.h
index 0acef05af3..5494191610 100644
--- a/cpukit/include/rtems/rtems/barrierimpl.h
+++ b/cpukit/include/rtems/rtems/barrierimpl.h
@@ -34,12 +34,6 @@ extern "C" {
  *  @{
  */
 
-/**
- *  The following defines the information control block used to manage
- *  this class of objects.
- */
-extern Objects_Information _Barrier_Information;
-
 /**
  *  @brief _Barrier_Allocate
  *
diff --git a/cpukit/include/rtems/rtems/config.h b/cpukit/include/rtems/rtems/config.h
index 51b3dbe30f..a3e3988cd6 100644
--- a/cpukit/include/rtems/rtems/config.h
+++ b/cpukit/include/rtems/rtems/config.h
@@ -47,61 +47,6 @@ extern "C" {
  *     + required number of each object type
  */
 typedef struct {
-  /**
-   * This field contains the maximum number of Classic API
-   * Tasks which are configured for this application.
-   */
-  uint32_t                    maximum_tasks;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Timers which are configured for this application.
-   */
-  uint32_t                    maximum_timers;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Semaphores which are configured for this application.
-   */
-  uint32_t                    maximum_semaphores;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Message Queues which are configured for this application.
-   */
-  uint32_t                    maximum_message_queues;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Partitions which are configured for this application.
-   */
-  uint32_t                    maximum_partitions;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Regions which are configured for this application.
-   */
-  uint32_t                    maximum_regions;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Dual Ported Memory Areas which are configured for this
-   * application.
-   */
-  uint32_t                    maximum_ports;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Rate Monotonic Periods which are configured for this
-   * application.
-   */
-  uint32_t                    maximum_periods;
-
-  /**
-   * This field contains the maximum number of Classic API
-   * Barriers which are configured for this application.
-   */
-  uint32_t                    maximum_barriers;
 
   /**
    * This field contains the number of Classic API Initialization
diff --git a/cpukit/include/rtems/rtems/dpmemdata.h b/cpukit/include/rtems/rtems/dpmemdata.h
index 86302f9089..3727297482 100644
--- a/cpukit/include/rtems/rtems/dpmemdata.h
+++ b/cpukit/include/rtems/rtems/dpmemdata.h
@@ -46,6 +46,31 @@ typedef struct {
   uint32_t         length;
 }   Dual_ported_memory_Control;
 
+/**
+ * @brief The Classic Dual Ported Memory objects information.
+ */
+extern Objects_Information _Dual_ported_memory_Information;
+
+/**
+ * @brief Macro to define the objects information for the Classic Dual Ported
+ * Memory objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define DUAL_PORTED_MEMORY_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Dual_ported_memory, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_PORTS, \
+    Dual_ported_memory_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/dpmemimpl.h b/cpukit/include/rtems/rtems/dpmemimpl.h
index 2b3fefd199..3da0d5237b 100644
--- a/cpukit/include/rtems/rtems/dpmemimpl.h
+++ b/cpukit/include/rtems/rtems/dpmemimpl.h
@@ -32,12 +32,6 @@ extern "C" {
  * @{
  */
 
-/**
- *  @brief Define the internal Dual Ported Memory information
- *  The following define the internal Dual Ported Memory information.
- */
-extern Objects_Information _Dual_ported_memory_Information;
-
 /**
  *  @brief Allocates a port control block from the inactive chain
  *  of free port control blocks.
diff --git a/cpukit/include/rtems/rtems/messagedata.h b/cpukit/include/rtems/rtems/messagedata.h
index b035dff97b..fa1f681473 100644
--- a/cpukit/include/rtems/rtems/messagedata.h
+++ b/cpukit/include/rtems/rtems/messagedata.h
@@ -44,6 +44,45 @@ typedef struct {
   rtems_attribute             attribute_set;
 }   Message_queue_Control;
 
+/**
+ * @brief The Classic Message Queue objects information.
+ */
+extern Objects_Information _Message_queue_Information;
+
+#if defined(RTEMS_MULTIPROCESSING)
+/**
+ *  @brief _Message_queue_MP_Send_extract_proxy
+ *
+ *  This routine is invoked when a task is deleted and it
+ *  has a proxy which must be removed from a thread queue and
+ *  the remote node must be informed of this.
+ */
+void _Message_queue_MP_Send_extract_proxy (
+  Thread_Control *the_thread,
+  Objects_Id      id
+);
+#endif
+
+/**
+ * @brief Macro to define the objects information for the Classic Message Queue
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define MESSAGE_QUEUE_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Message_queue, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_MESSAGE_QUEUES, \
+    Message_queue_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    _Message_queue_MP_Send_extract_proxy \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/messageimpl.h b/cpukit/include/rtems/rtems/messageimpl.h
index 098e310804..5872b67e04 100644
--- a/cpukit/include/rtems/rtems/messageimpl.h
+++ b/cpukit/include/rtems/rtems/messageimpl.h
@@ -51,12 +51,6 @@ typedef enum {
   MESSAGE_QUEUE_URGENT_REQUEST = 1
 }  Message_queue_Submit_types;
 
-/**
- *  The following defines the information control block used to
- *  manage this class of objects.
- */
-extern Objects_Information _Message_queue_Information;
-
 /**
  *  @brief Message_queue_Submit
  *
diff --git a/cpukit/include/rtems/rtems/msgmp.h b/cpukit/include/rtems/rtems/msgmp.h
index 3dabd8d46b..1c5818b44e 100644
--- a/cpukit/include/rtems/rtems/msgmp.h
+++ b/cpukit/include/rtems/rtems/msgmp.h
@@ -189,18 +189,6 @@ void _Message_queue_MP_Send_object_was_deleted (
   Objects_Id      mp_id
 );
 
-/**
- *  @brief _Message_queue_MP_Send_extract_proxy
- *
- *  This routine is invoked when a task is deleted and it
- *  has a proxy which must be removed from a thread queue and
- *  the remote node must be informed of this.
- */
-void _Message_queue_MP_Send_extract_proxy (
-  Thread_Control *the_thread,
-  Objects_Id      id
-);
-
 /**@}*/
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/partdata.h b/cpukit/include/rtems/rtems/partdata.h
index 3b030c8f34..3be94b6cd1 100644
--- a/cpukit/include/rtems/rtems/partdata.h
+++ b/cpukit/include/rtems/rtems/partdata.h
@@ -53,6 +53,45 @@ typedef struct {
   Chain_Control       Memory;
 }   Partition_Control;
 
+/**
+ * @brief The Classic Partition objects information.
+ */
+extern Objects_Information _Partition_Information;
+
+#if defined(RTEMS_MULTIPROCESSING)
+/**
+ *  @brief Partition_MP_Send_extract_proxy
+ *
+ *  This routine is invoked when a task is deleted and it
+ *  has a proxy which must be removed from a thread queue and
+ *  the remote node must be informed of this.
+ */
+void _Partition_MP_Send_extract_proxy (
+  Thread_Control *the_thread,
+  Objects_Id      id
+);
+#endif
+
+/**
+ * @brief Macro to define the objects information for the Classic Partition
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define PARTITION_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Partition, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_PARTITIONS, \
+    Partition_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    _Partition_MP_Send_extract_proxy \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/partimpl.h b/cpukit/include/rtems/rtems/partimpl.h
index d795748723..0160d4add6 100644
--- a/cpukit/include/rtems/rtems/partimpl.h
+++ b/cpukit/include/rtems/rtems/partimpl.h
@@ -33,12 +33,6 @@ extern "C" {
  * @{
  */
 
-/**
- *  The following defines the information control block used to
- *  manage this class of objects.
- */
-extern Objects_Information _Partition_Information;
-
 /**
  *  @brief Allocate a buffer from the_partition.
  *
diff --git a/cpukit/include/rtems/rtems/partmp.h b/cpukit/include/rtems/rtems/partmp.h
index b9eaa08b8c..5fffd68480 100644
--- a/cpukit/include/rtems/rtems/partmp.h
+++ b/cpukit/include/rtems/rtems/partmp.h
@@ -122,18 +122,6 @@ void _Partition_MP_Process_packet (
  *  cannot be deleted when buffers are in use.
  */
 
-/**
- *  @brief Partition_MP_Send_extract_proxy
- *
- *  This routine is invoked when a task is deleted and it
- *  has a proxy which must be removed from a thread queue and
- *  the remote node must be informed of this.
- */
-void _Partition_MP_Send_extract_proxy (
-  Thread_Control *the_thread,
-  Objects_Id      id
-);
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpukit/include/rtems/rtems/ratemondata.h b/cpukit/include/rtems/rtems/ratemondata.h
index 898fc653c1..0e4415237b 100644
--- a/cpukit/include/rtems/rtems/ratemondata.h
+++ b/cpukit/include/rtems/rtems/ratemondata.h
@@ -130,6 +130,31 @@ typedef struct {
   uint64_t                                latest_deadline;
 }   Rate_monotonic_Control;
 
+/**
+ * @brief The Classic Rate Monotonic objects information.
+ */
+extern Objects_Information _Rate_monotonic_Information;
+
+/**
+ * @brief Macro to define the objects information for the Classic Rate
+ * Monotonic objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define RATE_MONOTONIC_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Rate_monotonic, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_PERIODS, \
+    Rate_monotonic_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/ratemonimpl.h b/cpukit/include/rtems/rtems/ratemonimpl.h
index 2a417f66c6..eb359b17c8 100644
--- a/cpukit/include/rtems/rtems/ratemonimpl.h
+++ b/cpukit/include/rtems/rtems/ratemonimpl.h
@@ -48,14 +48,6 @@ extern "C" {
 #define RATE_MONOTONIC_READY_AGAIN \
   ( THREAD_WAIT_CLASS_PERIOD | THREAD_WAIT_STATE_READY_AGAIN )
 
-/**
- *  @brief Rate Monotonic Period Class Management Structure
- *
- *  This instance of Objects_Information is used to manage the
- *  set of rate monotonic period instances.
- */
-extern Objects_Information _Rate_monotonic_Information;
-
 /**
  *  @brief Allocates a period control block from
  *  the inactive chain of free period control blocks.
diff --git a/cpukit/include/rtems/rtems/regiondata.h b/cpukit/include/rtems/rtems/regiondata.h
index cfbc07f713..c64f623c1d 100644
--- a/cpukit/include/rtems/rtems/regiondata.h
+++ b/cpukit/include/rtems/rtems/regiondata.h
@@ -46,6 +46,31 @@ typedef struct {
   Heap_Control          Memory;
 }  Region_Control;
 
+/**
+ * @brief The Classic Region objects information.
+ */
+extern Objects_Information _Region_Information;
+
+/**
+ * @brief Macro to define the objects information for the Classic Region
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define REGION_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Region, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_REGIONS, \
+    Region_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/regionimpl.h b/cpukit/include/rtems/rtems/regionimpl.h
index 8a7ee258cc..35775671e6 100644
--- a/cpukit/include/rtems/rtems/regionimpl.h
+++ b/cpukit/include/rtems/rtems/regionimpl.h
@@ -38,12 +38,6 @@ extern "C" {
 #define REGION_OF_THREAD_QUEUE_QUEUE( queue ) \
   RTEMS_CONTAINER_OF( queue, Region_Control, Wait_queue.Queue )
 
-/**
- *  The following defines the information control block used to
- *  manage this class of objects.
- */
-extern Objects_Information _Region_Information;
-
 /**
  *  @brief Region_Allocate
  *
diff --git a/cpukit/include/rtems/rtems/semdata.h b/cpukit/include/rtems/rtems/semdata.h
index 04db07d6a0..d2275e5dfe 100644
--- a/cpukit/include/rtems/rtems/semdata.h
+++ b/cpukit/include/rtems/rtems/semdata.h
@@ -92,6 +92,45 @@ typedef struct {
 #endif
 }   Semaphore_Control;
 
+/**
+ * @brief The Classic Semaphore objects information.
+ */
+extern Objects_Information _Semaphore_Information;
+
+#if defined(RTEMS_MULTIPROCESSING)
+/**
+ *  @brief Semaphore MP Send Extract Proxy
+ *
+ *  This routine is invoked when a task is deleted and it
+ *  has a proxy which must be removed from a thread queue and
+ *  the remote node must be informed of this.
+ */
+void _Semaphore_MP_Send_extract_proxy (
+  Thread_Control *the_thread,
+  Objects_Id      id
+);
+#endif
+
+/**
+ * @brief Macro to define the objects information for the Classic Semaphore
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define SEMAPHORE_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Semaphore, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_SEMAPHORES, \
+    Semaphore_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    _Semaphore_MP_Send_extract_proxy \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/semimpl.h b/cpukit/include/rtems/rtems/semimpl.h
index 1028879f39..743a4a9c6b 100644
--- a/cpukit/include/rtems/rtems/semimpl.h
+++ b/cpukit/include/rtems/rtems/semimpl.h
@@ -56,12 +56,6 @@ typedef enum {
   SEMAPHORE_DISCIPLINE_FIFO
 } Semaphore_Discipline;
 
-/**
- *  The following defines the information control block used to manage
- *  this class of objects.
- */
-extern Objects_Information _Semaphore_Information;
-
 RTEMS_INLINE_ROUTINE const Thread_queue_Operations *_Semaphore_Get_operations(
   const Semaphore_Control *the_semaphore
 )
diff --git a/cpukit/include/rtems/rtems/semmp.h b/cpukit/include/rtems/rtems/semmp.h
index 9d7669f43e..31774c39ba 100644
--- a/cpukit/include/rtems/rtems/semmp.h
+++ b/cpukit/include/rtems/rtems/semmp.h
@@ -119,18 +119,6 @@ void _Semaphore_MP_Send_object_was_deleted (
   Objects_Id      mp_id
 );
 
-/**
- *  @brief Semaphore MP Send Extract Proxy
- *
- *  This routine is invoked when a task is deleted and it
- *  has a proxy which must be removed from a thread queue and
- *  the remote node must be informed of this.
- */
-void _Semaphore_MP_Send_extract_proxy (
-  Thread_Control *the_thread,
-  Objects_Id      id
-);
-
 /**
  * @brief Semaphore Core Mutex MP Support
  *
diff --git a/cpukit/include/rtems/rtems/tasksdata.h b/cpukit/include/rtems/rtems/tasksdata.h
index 18562bf067..19e6a8a618 100644
--- a/cpukit/include/rtems/rtems/tasksdata.h
+++ b/cpukit/include/rtems/rtems/tasksdata.h
@@ -67,6 +67,12 @@ typedef struct {
 
 extern void _RTEMS_tasks_Initialize_user_tasks_body( void );
 
+/**
+ *  The following instantiates the information control block used to
+ *  manage this class of objects.
+ */
+extern Thread_Information _RTEMS_tasks_Information;
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/tasksimpl.h b/cpukit/include/rtems/rtems/tasksimpl.h
index b6694cc416..c98f1a3ab0 100644
--- a/cpukit/include/rtems/rtems/tasksimpl.h
+++ b/cpukit/include/rtems/rtems/tasksimpl.h
@@ -34,12 +34,6 @@ extern "C" {
  * @{
  */
 
-/**
- *  The following instantiates the information control block used to
- *  manage this class of objects.
- */
-extern Thread_Information _RTEMS_tasks_Information;
-
 /**
  *  @brief RTEMS User Task Initialization
  *
diff --git a/cpukit/include/rtems/rtems/timerdata.h b/cpukit/include/rtems/rtems/timerdata.h
index db32739488..ed00671b10 100644
--- a/cpukit/include/rtems/rtems/timerdata.h
+++ b/cpukit/include/rtems/rtems/timerdata.h
@@ -57,6 +57,31 @@ typedef struct {
   Watchdog_Interval stop_time;
 }   Timer_Control;
 
+/**
+ * @brief The Classic Timer objects information.
+ */
+extern Objects_Information  _Timer_Information;
+
+/**
+ * @brief Macro to define the objects information for the Classic Timer
+ * objects.
+ *
+ * This macro should only be used by <rtems/confdefs.h>.
+ *
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ * may be set).
+ */
+#define TIMER_INFORMATION_DEFINE( max ) \
+  OBJECTS_INFORMATION_DEFINE( \
+    _Timer, \
+    OBJECTS_CLASSIC_API, \
+    OBJECTS_RTEMS_TIMERS, \
+    Timer_Control, \
+    max, \
+    OBJECTS_NO_STRING_NAME, \
+    NULL \
+  )
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/rtems/timerimpl.h b/cpukit/include/rtems/rtems/timerimpl.h
index d62db3b34a..59b2b9f816 100644
--- a/cpukit/include/rtems/rtems/timerimpl.h
+++ b/cpukit/include/rtems/rtems/timerimpl.h
@@ -52,12 +52,6 @@ typedef struct Timer_server_Control {
  */
 extern Timer_server_Control *volatile _Timer_server;
 
-/**
- *  The following defines the information control block used to manage
- *  this class of objects.
- */
-extern Objects_Information  _Timer_Information;
-
 /**
  *  @brief Timer_Allocate
  *
diff --git a/cpukit/include/rtems/score/freechain.h b/cpukit/include/rtems/score/freechain.h
index 1540c0e2a1..6282178347 100644
--- a/cpukit/include/rtems/score/freechain.h
+++ b/cpukit/include/rtems/score/freechain.h
@@ -17,7 +17,7 @@
 #define _RTEMS_SCORE_FREECHAIN_H
 
 #include <rtems/score/basedefs.h>
-#include <rtems/score/chain.h>
+#include <rtems/score/chainimpl.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -58,16 +58,24 @@ typedef struct {
  * get more nodes.
  *
  * @param[in] freechain The freechain control to initialize.
- * @param[in] allocator The allocator function.
+ * @param[in] initial_nodes Array with the initial nodes.
  * @param[in] number_nodes The initial number of nodes.
  * @param[in] node_size The node size.
  */
-void _Freechain_Initialize(
+RTEMS_INLINE_ROUTINE void _Freechain_Initialize(
   Freechain_Control   *freechain,
-  Freechain_Allocator  allocator,
+  void                *initial_nodes,
   size_t               number_nodes,
   size_t               node_size
-);
+)
+{
+  _Chain_Initialize(
+    &freechain->Free,
+    initial_nodes,
+    number_nodes,
+    node_size
+  );
+}
 
 /**
  * @brief Gets a node from the freechain.
diff --git a/cpukit/include/rtems/score/interr.h b/cpukit/include/rtems/score/interr.h
index 0c734e855f..df1a1298d9 100644
--- a/cpukit/include/rtems/score/interr.h
+++ b/cpukit/include/rtems/score/interr.h
@@ -173,7 +173,7 @@ typedef enum {
   /* INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY = 16, */
   /* INTERNAL_ERROR_IMPLEMENTATION_BLOCKING_OPERATION_CANCEL = 17, */
   /* INTERNAL_ERROR_THREAD_QUEUE_ENQUEUE_FROM_BAD_STATE = 18, */
-  INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0 = 19,
+  /* INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0 = 19, */
   /* INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP = 20, */
   INTERNAL_ERROR_GXX_KEY_ADD_FAILED = 21,
   INTERNAL_ERROR_GXX_MUTEX_INIT_FAILED = 22,
diff --git a/cpukit/include/rtems/score/object.h b/cpukit/include/rtems/score/object.h
index e7861ecab1..f75d1de2ab 100644
--- a/cpukit/include/rtems/score/object.h
+++ b/cpukit/include/rtems/score/object.h
@@ -307,18 +307,11 @@ RTEMS_INLINE_ROUTINE Objects_Maximum _Objects_Get_index(
  *
  * @return This method returns an object Id constructed from the arguments.
  */
-RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id(
-  Objects_APIs     the_api,
-  uint16_t         the_class,
-  uint8_t          node,
-  uint16_t         index
-)
-{
-  return (( (Objects_Id) the_api )   << OBJECTS_API_START_BIT)   |
-         (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) |
-         (( (Objects_Id) node )      << OBJECTS_NODE_START_BIT)  |
-         (( (Objects_Id) index )     << OBJECTS_INDEX_START_BIT);
-}
+#define _Objects_Build_id( the_api, the_class, node, index ) \
+  ( (Objects_Id) ( (Objects_Id) the_api   << OBJECTS_API_START_BIT )   | \
+                 ( (Objects_Id) the_class << OBJECTS_CLASS_START_BIT ) | \
+                 ( (Objects_Id) node      << OBJECTS_NODE_START_BIT )  | \
+                 ( (Objects_Id) index     << OBJECTS_INDEX_START_BIT ) )
 
 /**
  * Returns if the object maximum specifies unlimited objects.
@@ -328,10 +321,8 @@ RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id(
  * @retval true Unlimited objects are available.
  * @retval false The object count is fixed.
  */
-RTEMS_INLINE_ROUTINE bool _Objects_Is_unlimited( uint32_t maximum )
-{
-  return (maximum & OBJECTS_UNLIMITED_OBJECTS) != 0;
-}
+#define _Objects_Is_unlimited( maximum ) \
+  ( ( ( maximum ) & OBJECTS_UNLIMITED_OBJECTS ) != 0 )
 
 /*
  * We cannot use an inline function for this since it may be evaluated at
diff --git a/cpukit/include/rtems/score/objectdata.h b/cpukit/include/rtems/score/objectdata.h
index 51258fa4a4..2531067260 100644
--- a/cpukit/include/rtems/score/objectdata.h
+++ b/cpukit/include/rtems/score/objectdata.h
@@ -19,7 +19,7 @@
 #define _RTEMS_SCORE_OBJECTDATA_H
 
 #include <rtems/score/object.h>
-#include <rtems/score/chain.h>
+#include <rtems/score/chainimpl.h>
 #include <rtems/score/rbtree.h>
 
 #ifdef __cplusplus
@@ -45,6 +45,54 @@ typedef struct {
   Objects_Name   name;
 } Objects_Control;
 
+/**
+ *  This enumerated type is used in the class field of the object ID
+ *  for RTEMS internal object classes.
+ */
+typedef enum {
+  OBJECTS_INTERNAL_NO_CLASS =  0,
+  OBJECTS_INTERNAL_THREADS  =  1
+} Objects_Internal_API;
+
+/**
+ *  This enumerated type is used in the class field of the object ID
+ *  for the RTEMS Classic API.
+ */
+typedef enum {
+  OBJECTS_CLASSIC_NO_CLASS     = 0,
+  OBJECTS_RTEMS_TASKS          = 1,
+  OBJECTS_RTEMS_TIMERS         = 2,
+  OBJECTS_RTEMS_SEMAPHORES     = 3,
+  OBJECTS_RTEMS_MESSAGE_QUEUES = 4,
+  OBJECTS_RTEMS_PARTITIONS     = 5,
+  OBJECTS_RTEMS_REGIONS        = 6,
+  OBJECTS_RTEMS_PORTS          = 7,
+  OBJECTS_RTEMS_PERIODS        = 8,
+  OBJECTS_RTEMS_EXTENSIONS     = 9,
+  OBJECTS_RTEMS_BARRIERS       = 10
+} Objects_Classic_API;
+
+/**
+ *  This enumerated type is used in the class field of the object ID
+ *  for the POSIX API.
+ */
+typedef enum {
+  OBJECTS_POSIX_NO_CLASS            = 0,
+  OBJECTS_POSIX_THREADS             = 1,
+  OBJECTS_POSIX_KEYS                = 2,
+  OBJECTS_POSIX_INTERRUPTS          = 3,
+  OBJECTS_POSIX_MESSAGE_QUEUES      = 5,
+  OBJECTS_POSIX_SEMAPHORES          = 7,
+  OBJECTS_POSIX_TIMERS              = 9,
+  OBJECTS_POSIX_SHMS                = 12
+} Objects_POSIX_API;
+
+/**
+ * @brief Constant for the object information string name length to indicate
+ * that this object class has no string names.
+ */
+#define OBJECTS_NO_STRING_NAME 0
+
 #if defined( RTEMS_MULTIPROCESSING )
 /**
  * @brief This defines the Global Object Control Block used to manage objects
@@ -86,8 +134,139 @@ typedef struct {
    */
   uint32_t name;
 } Objects_MP_Control;
+
+/**
+ *  The following type defines the callout used when a local task
+ *  is extracted from a remote thread queue (i.e. it's proxy must
+ *  extracted from the remote queue).
+ */
+typedef void ( *Objects_Thread_queue_Extract_callout )(
+  Thread_Control *,
+  Objects_Id
+);
+#endif
+
+/**
+ *  The following defines the structure for the information used to
+ *  manage each class of objects.
+ */
+typedef struct {
+  /** This is the maximum valid id of this object class. */
+  Objects_Id        maximum_id;
+  /** This points to the table of local objects. */
+  Objects_Control **local_table;
+  /** This is the number of objects on the Inactive list. */
+  Objects_Maximum   inactive;
+  /** This is the number of objects in a block. */
+  Objects_Maximum   objects_per_block;
+  /** This is the size in bytes of each object instance. */
+  uint16_t          object_size;
+  /**
+   * @brief This is the maximum length of names.
+   *
+   * A length of zero indicates that this object has a no string name
+   * (OBJECTS_NO_STRING_NAME).
+   */
+  uint16_t          name_length;
+  /** This is the chain of inactive control blocks. */
+  Chain_Control     Inactive;
+  /** This is the number of inactive objects per block. */
+  Objects_Maximum  *inactive_per_block;
+  /** This is a table to the chain of inactive object memory blocks. */
+  Objects_Control **object_blocks;
+  Objects_Control  *initial_objects;
+  #if defined(RTEMS_MULTIPROCESSING)
+    /** This is this object class' method called when extracting a thread. */
+    Objects_Thread_queue_Extract_callout extract;
+
+    /**
+     * @brief The global objects of this object information sorted by object
+     * identifier.
+     */
+    RBTree_Control   Global_by_id;
+
+    /**
+     * @brief The global objects of this object information sorted by object
+     * name.
+     *
+     * Objects with the same name are sorted according to their identifier.
+     */
+    RBTree_Control   Global_by_name;
+  #endif
+}   Objects_Information;
+
+#if defined(RTEMS_MULTIPROCESSING)
+#define OBJECTS_INFORMATION_MP( name, extract ) \
+  , \
+  extract, \
+  RBTREE_INITIALIZER_EMPTY( name.Global_by_id ), \
+  RBTREE_INITIALIZER_EMPTY( name.Global_by_name )
+#else
+#define OBJECTS_INFORMATION_MP( name, extract )
 #endif
 
+/**
+ * @brief Statically initializes an objects information.
+ *
+ * The initialized objects information contains no objects.
+ *
+ * @param name The object class C designator namespace prefix, e.g. _Semaphore.
+ * @param api The object API number, e.g. OBJECTS_CLASSIC_API.
+ * @param cls The object class number, e.g. OBJECTS_RTEMS_SEMAPHORES.
+ * @param nl The object name string length, use OBJECTS_NO_STRING_NAME for
+ *   objects without a string name.
+ */
+#define OBJECTS_INFORMATION_DEFINE_ZERO( name, api, cls, nl ) \
+Objects_Information name##_Information = { \
+  _Objects_Build_id( api, cls, 1, 0 ), \
+  NULL, \
+  0, \
+  0, \
+  0, \
+  nl, \
+  CHAIN_INITIALIZER_EMPTY( name##_Information.Inactive ), \
+  NULL, \
+  NULL, \
+  NULL \
+  OBJECTS_INFORMATION_MP( name##_Information, NULL ) \
+}
+
+/**
+ * @brief Statically initializes an objects information.
+ *
+ * The initialized objects information references a table with statically
+ * allocated objects as specified by the object maximum parameter.  These
+ * objects must be registered via a call to _Objects_Information().
+ *
+ * @param name The object class C designator namespace prefix, e.g. _Semaphore.
+ * @param api The object API number, e.g. OBJECTS_CLASSIC_API.
+ * @param cls The object class number, e.g. OBJECTS_RTEMS_SEMAPHORES.
+ * @param type The object class type.
+ * @param max The configured object maximum (the OBJECTS_UNLIMITED_OBJECTS flag
+ *   may be set).
+ * @param nl The object name string length, use OBJECTS_NO_STRING_NAME for
+ *   objects without a string name.
+ * @param ex The optional object extraction method.  Used only if
+ *   multiprocessing (RTEMS_MULTIPROCESSING) is enabled.
+ */
+#define OBJECTS_INFORMATION_DEFINE( name, api, cls, type, max, nl, ex ) \
+static Objects_Control * \
+name##_Local_table[ _Objects_Maximum_per_allocation( max ) ]; \
+static type name##_Objects[ _Objects_Maximum_per_allocation( max ) ]; \
+Objects_Information name##_Information = { \
+  _Objects_Build_id( api, cls, 1, _Objects_Maximum_per_allocation( max ) ), \
+  name##_Local_table, \
+  0, \
+  _Objects_Is_unlimited( max ) ? _Objects_Maximum_per_allocation( max ) : 0, \
+  sizeof( type ), \
+  nl, \
+  CHAIN_INITIALIZER_EMPTY( name##_Information.Inactive ), \
+  NULL, \
+  NULL, \
+  &name##_Objects[ 0 ].Object \
+  OBJECTS_INFORMATION_MP( name##_Information, ex ) \
+}
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/score/objectimpl.h b/cpukit/include/rtems/score/objectimpl.h
index bbf32fcd80..c5a315e57f 100644
--- a/cpukit/include/rtems/score/objectimpl.h
+++ b/cpukit/include/rtems/score/objectimpl.h
@@ -43,54 +43,12 @@ typedef bool    (*Objects_Name_comparators)(
   uint16_t     /* length */
 );
 
-/**
- *  This enumerated type is used in the class field of the object ID
- *  for RTEMS internal object classes.
- */
-typedef enum {
-  OBJECTS_INTERNAL_NO_CLASS =  0,
-  OBJECTS_INTERNAL_THREADS  =  1
-} Objects_Internal_API;
-
 /** This macro is used to generically specify the last API index. */
 #define OBJECTS_INTERNAL_CLASSES_LAST OBJECTS_INTERNAL_THREADS
 
-/**
- *  This enumerated type is used in the class field of the object ID
- *  for the RTEMS Classic API.
- */
-typedef enum {
-  OBJECTS_CLASSIC_NO_CLASS     = 0,
-  OBJECTS_RTEMS_TASKS          = 1,
-  OBJECTS_RTEMS_TIMERS         = 2,
-  OBJECTS_RTEMS_SEMAPHORES     = 3,
-  OBJECTS_RTEMS_MESSAGE_QUEUES = 4,
-  OBJECTS_RTEMS_PARTITIONS     = 5,
-  OBJECTS_RTEMS_REGIONS        = 6,
-  OBJECTS_RTEMS_PORTS          = 7,
-  OBJECTS_RTEMS_PERIODS        = 8,
-  OBJECTS_RTEMS_EXTENSIONS     = 9,
-  OBJECTS_RTEMS_BARRIERS       = 10
-} Objects_Classic_API;
-
 /** This macro is used to generically specify the last API index. */
 #define OBJECTS_RTEMS_CLASSES_LAST OBJECTS_RTEMS_BARRIERS
 
-/**
- *  This enumerated type is used in the class field of the object ID
- *  for the POSIX API.
- */
-typedef enum {
-  OBJECTS_POSIX_NO_CLASS            = 0,
-  OBJECTS_POSIX_THREADS             = 1,
-  OBJECTS_POSIX_KEYS                = 2,
-  OBJECTS_POSIX_INTERRUPTS          = 3,
-  OBJECTS_POSIX_MESSAGE_QUEUES      = 5,
-  OBJECTS_POSIX_SEMAPHORES          = 7,
-  OBJECTS_POSIX_TIMERS              = 9,
-  OBJECTS_POSIX_SHMS                = 12
-} Objects_POSIX_API;
-
 /** This macro is used to generically specify the last API index. */
 #define OBJECTS_POSIX_CLASSES_LAST OBJECTS_POSIX_SHMS
 
@@ -103,71 +61,6 @@ typedef enum {
   OBJECTS_FAKE_OBJECTS_SCHEDULERS = 1
 } Objects_Fake_objects_API;
 
-#if defined(RTEMS_MULTIPROCESSING)
-/**
- *  The following type defines the callout used when a local task
- *  is extracted from a remote thread queue (i.e. it's proxy must
- *  extracted from the remote queue).
- */
-typedef void ( *Objects_Thread_queue_Extract_callout )(
-  Thread_Control *,
-  Objects_Id
-);
-#endif
-
-/**
- *  The following defines the structure for the information used to
- *  manage each class of objects.
- */
-typedef struct {
-  /** This is the maximum valid id of this object class. */
-  Objects_Id        maximum_id;
-  /** This points to the table of local objects. */
-  Objects_Control **local_table;
-  /** This is the number of objects on the Inactive list. */
-  Objects_Maximum   inactive;
-  /**
-   * @brief This is the number of objects in a block if the automatic extension
-   * is enabled.
-   *
-   * This member is zero if the automatic extension is disabled.
-   */
-  Objects_Maximum   objects_per_block;
-  /** This is the size in bytes of each object instance. */
-  uint16_t          object_size;
-  /**
-   * @brief This is the maximum length of names.
-   *
-   * A length of zero indicates that this object has a no string name
-   * (OBJECTS_NO_STRING_NAME).
-   */
-  uint16_t          name_length;
-  /** This is the chain of inactive control blocks. */
-  Chain_Control     Inactive;
-  /** This is the number of inactive objects per block. */
-  Objects_Maximum  *inactive_per_block;
-  /** This is a table to the chain of inactive object memory blocks. */
-  Objects_Control **object_blocks;
-  #if defined(RTEMS_MULTIPROCESSING)
-    /** This is this object class' method called when extracting a thread. */
-    Objects_Thread_queue_Extract_callout extract;
-
-    /**
-     * @brief The global objects of this object information sorted by object
-     * identifier.
-     */
-    RBTree_Control   Global_by_id;
-
-    /**
-     * @brief The global objects of this object information sorted by object
-     * name.
-     *
-     * Objects with the same name are sorted according to their identifier.
-     */
-    RBTree_Control   Global_by_name;
-  #endif
-}   Objects_Information;
-
 /**
  *  The following is referenced to the node number of the local node.
  */
@@ -222,84 +115,13 @@ void _Objects_Shrink_information(
   Objects_Information *information
 );
 
-void _Objects_Do_initialize_information(
-  Objects_Information *information,
-  Objects_APIs         the_api,
-  uint16_t             the_class,
-  uint32_t             maximum,
-  uint16_t             object_size,
-  uint16_t             maximum_name_length
-#if defined(RTEMS_MULTIPROCESSING)
-  ,
-  Objects_Thread_queue_Extract_callout extract
-#endif
-);
-
 /**
- * @brief Constant for the object information string name length to indicate
- * that this object class has no string names.
- */
-#define OBJECTS_NO_STRING_NAME 0
-
-/**
- *  @brief Initialize object Information
- *
- *  This function initializes an object class information record.
- *  SUPPORTS_GLOBAL is true if the object class supports global
- *  objects, and false otherwise.  Maximum indicates the number
- *  of objects required in this class and size indicates the size
- *  in bytes of each control block for this object class.  The
- *  name length and string designator are also set.  In addition,
- *  the class may be a task, therefore this information is also included.
+ * @brief Initializes the specified objects information.
  *
- *  @param[in] information points to an object class information block.
- *  @param[in] the_api indicates the API associated with this information block.
- *  @param[in] the_class indicates the class of object being managed
- *             by this information block.  It is specific to @a the_api.
- *  @param[in] maximum is the maximum number of instances of this object
- *             class which may be concurrently active.
- *  @param[in] object_size is the size of the data structure for this class.
- *  @param[in] is_string is true if this object uses string style names.
- *  @param[in] maximum_name_length is the maximum length of object names.
+ * The objects information must be statically pre-initialized with the
+ * OBJECTS_INFORMATION_DEFINE() macro before this function is called.
  */
-#if defined(RTEMS_MULTIPROCESSING)
-  #define _Objects_Initialize_information( \
-    information, \
-    the_api, \
-    the_class, \
-    maximum, \
-    object_size, \
-    maximum_name_length, \
-    extract \
-  ) \
-    _Objects_Do_initialize_information( \
-      information, \
-      the_api, \
-      the_class, \
-      maximum, \
-      object_size, \
-      maximum_name_length, \
-      extract \
-    )
-#else
-  #define _Objects_Initialize_information( \
-    information, \
-    the_api, \
-    the_class, \
-    maximum, \
-    object_size, \
-    maximum_name_length, \
-    extract \
-  ) \
-    _Objects_Do_initialize_information( \
-      information, \
-      the_api, \
-      the_class, \
-      maximum, \
-      object_size, \
-      maximum_name_length \
-    )
-#endif
+void _Objects_Initialize_information( Objects_Information *information );
 
 /**
  *  @brief Object API Maximum Class
diff --git a/cpukit/include/rtems/score/thread.h b/cpukit/include/rtems/score/thread.h
index 7e24af43c9..cd2cab6d56 100644
--- a/cpukit/include/rtems/score/thread.h
+++ b/cpukit/include/rtems/score/thread.h
@@ -26,6 +26,7 @@
 #if defined(RTEMS_MULTIPROCESSING)
 #include <rtems/score/mppkt.h>
 #endif
+#include <rtems/score/freechain.h>
 #include <rtems/score/isrlock.h>
 #include <rtems/score/objectdata.h>
 #include <rtems/score/priority.h>
@@ -909,7 +910,7 @@ typedef struct {
  *
  * This array is provided via <rtems/confdefs.h>.
  *
- * @see _Thread_Control_add_on_count and _Thread_Control_size.
+ * @see _Thread_Control_add_on_count.
  */
 extern const Thread_Control_add_on _Thread_Control_add_ons[];
 
@@ -923,13 +924,11 @@ extern const Thread_Control_add_on _Thread_Control_add_ons[];
 extern const size_t _Thread_Control_add_on_count;
 
 /**
- * @brief Size of the thread control block of a particular application.
+ * @brief Count of configured threads.
  *
  * This value is provided via <rtems/confdefs.h>.
- *
- * @see _Thread_Control_add_ons.
  */
-extern const size_t _Thread_Control_size;
+extern const size_t _Thread_Initial_thread_count;
 
 /**
  * @brief Maximum size of a thread name in characters (including the
@@ -939,6 +938,73 @@ extern const size_t _Thread_Control_size;
  */
 extern const size_t _Thread_Maximum_name_size;
 
+typedef struct {
+  Objects_Information Objects;
+
+  Freechain_Control Free_thread_queue_heads;
+} Thread_Information;
+
+/**
+ *  The following defines the information control block used to
+ *  manage this class of objects.
+ */
+extern Thread_Information _Thread_Information;
+
+typedef struct Thread_Configured_control Thread_Configured_control;
+
+typedef struct Thread_queue_Configured_heads Thread_queue_Configured_heads;
+
+/**
+ * @brief Size of the thread queue heads of a particular application.
+ *
+ * This value is provided via <rtems/confdefs.h>.
+ */
+extern const size_t _Thread_queue_Heads_size;
+
+#define THREAD_INFORMATION_DEFINE_ZERO( name, api, cls ) \
+Thread_Information name##_Information = { \
+  { \
+    _Objects_Build_id( api, cls, 1, 0 ), \
+    NULL, \
+    0, \
+    0, \
+    0, \
+    0, \
+    CHAIN_INITIALIZER_EMPTY( name##_Information.Objects.Inactive ), \
+    NULL, \
+    NULL, \
+    NULL \
+    OBJECTS_INFORMATION_MP( name##_Information.Objects, NULL ), \
+  }, { \
+    CHAIN_INITIALIZER_EMPTY( name##_Information.Free_thread_queue_heads.Free ) \
+  } \
+}
+
+#define THREAD_INFORMATION_DEFINE( name, api, cls, max ) \
+static Objects_Control * \
+name##_Local_table[ _Objects_Maximum_per_allocation( max ) ]; \
+static Thread_Configured_control \
+name##_Objects[ _Objects_Maximum_per_allocation( max ) ]; \
+static Thread_queue_Configured_heads \
+name##_Heads[ _Objects_Maximum_per_allocation( max ) ]; \
+Thread_Information name##_Information = { \
+  { \
+    _Objects_Build_id( api, cls, 1, _Objects_Maximum_per_allocation( max ) ), \
+    name##_Local_table, \
+    0, \
+    _Objects_Is_unlimited( max ) ? _Objects_Maximum_per_allocation( max ) : 0, \
+    sizeof( Thread_Configured_control ), \
+    OBJECTS_NO_STRING_NAME, \
+    CHAIN_INITIALIZER_EMPTY( name##_Information.Objects.Inactive ), \
+    NULL, \
+    NULL, \
+    &name##_Objects[ 0 ].Control.Object \
+    OBJECTS_INFORMATION_MP( name##_Information.Objects, NULL ) \
+  }, {\
+    { { { (Chain_Node *) &name##_Heads[ 0 ], NULL }, NULL } } \
+  } \
+}
+
 /**@}*/
 
 #ifdef __cplusplus
diff --git a/cpukit/include/rtems/score/threadimpl.h b/cpukit/include/rtems/score/threadimpl.h
index 0e93cb501d..d3e69ed91c 100644
--- a/cpukit/include/rtems/score/threadimpl.h
+++ b/cpukit/include/rtems/score/threadimpl.h
@@ -34,7 +34,6 @@
 #include <rtems/score/timestampimpl.h>
 #include <rtems/score/threadqimpl.h>
 #include <rtems/score/todimpl.h>
-#include <rtems/score/freechain.h>
 #include <rtems/score/watchdogimpl.h>
 #include <rtems/config.h>
 
@@ -58,18 +57,6 @@ extern "C" {
  */
 extern void *rtems_ada_self;
 
-typedef struct {
-  Objects_Information Objects;
-
-  Freechain_Control Free_thread_queue_heads;
-} Thread_Information;
-
-/**
- *  The following defines the information control block used to
- *  manage this class of objects.
- */
-extern Thread_Information _Thread_Internal_information;
-
 /**
  * @brief Object identifier of the global constructor thread.
  *
@@ -100,12 +87,7 @@ void _Thread_Iterate(
   void           *arg
 );
 
-void _Thread_Initialize_information(
-  Thread_Information  *information,
-  Objects_APIs         the_api,
-  uint16_t             the_class,
-  uint32_t             maximum
-);
+void _Thread_Initialize_information( Thread_Information *information );
 
 /**
  *  @brief Initialize thread handler.
@@ -828,7 +810,7 @@ RTEMS_INLINE_ROUTINE uint32_t _Thread_Get_maximum_internal_threads(void)
 RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void )
 {
   return (Thread_Control *)
-    _Objects_Allocate_unprotected( &_Thread_Internal_information.Objects );
+    _Objects_Allocate_unprotected( &_Thread_Information.Objects );
 }
 
 /**
diff --git a/cpukit/include/rtems/score/threadq.h b/cpukit/include/rtems/score/threadq.h
index 5ddc2a10bb..c0a11770fb 100644
--- a/cpukit/include/rtems/score/threadq.h
+++ b/cpukit/include/rtems/score/threadq.h
@@ -394,15 +394,6 @@ typedef struct _Thread_queue_Heads {
 #endif
 } Thread_queue_Heads;
 
-#if defined(RTEMS_SMP)
-  #define THREAD_QUEUE_HEADS_SIZE( scheduler_count ) \
-    ( sizeof( Thread_queue_Heads ) \
-      + ( scheduler_count ) * sizeof( Thread_queue_Priority_queue ) )
-#else
-  #define THREAD_QUEUE_HEADS_SIZE( scheduler_count ) \
-    sizeof( Thread_queue_Heads )
-#endif
-
 struct Thread_queue_Queue {
   /**
    * @brief Lock to protect this thread queue.
diff --git a/cpukit/posix/src/key.c b/cpukit/posix/src/key.c
index a39e8d6479..0309a26da5 100644
--- a/cpukit/posix/src/key.c
+++ b/cpukit/posix/src/key.c
@@ -1,158 +1,47 @@
 /**
  * @file
  *
- * @brief POSIX Keys Manager Initialization
- * @ingroup POSIX_KEY Key
+ * @ingroup POSIX_KEY
+ *
+ * @brief POSIX Keys Information with Zero Objects
  */
 
 /*
- * Copyright (c) 2012 Zhongwei Yao.
- * COPYRIGHT (c) 1989-2014.
- * On-Line Applications Research Corporation (OAR).
- * Copyright (c) 2016 embedded brains GmbH.
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <limits.h>
-
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-
-#include <rtems/posix/keyimpl.h>
-#include <rtems/score/userextimpl.h>
-#include <rtems/score/wkspace.h>
-
-Objects_Information _POSIX_Keys_Information;
-
-Freechain_Control _POSIX_Keys_Keypool;
-
-static uint32_t _POSIX_Keys_Get_keypool_bump_count( void )
-{
-  uint32_t max = Configuration.maximum_key_value_pairs;
-
-  return _Objects_Is_unlimited( max ) ?
-    _Objects_Maximum_per_allocation( max ) : 0;
-}
-
-static uint32_t _POSIX_Keys_Get_initial_keypool_size( void )
-{
-  uint32_t max = Configuration.maximum_key_value_pairs;
-
-  return _Objects_Maximum_per_allocation( max );
-}
-
-static void _POSIX_Keys_Initialize_keypool( void )
-{
-  _Freechain_Initialize(
-    &_POSIX_Keys_Keypool,
-    _Workspace_Allocate_or_fatal_error,
-    _POSIX_Keys_Get_initial_keypool_size(),
-    sizeof( POSIX_Keys_Key_value_pair )
-  );
-}
-
-POSIX_Keys_Key_value_pair * _POSIX_Keys_Key_value_allocate( void )
-{
-  return (POSIX_Keys_Key_value_pair *) _Freechain_Get(
-    &_POSIX_Keys_Keypool,
-    _Workspace_Allocate,
-    _POSIX_Keys_Get_keypool_bump_count(),
-    sizeof( POSIX_Keys_Key_value_pair )
-  );
-}
-
-static void _POSIX_Keys_Run_destructors( Thread_Control *the_thread )
-{
-  while ( true ) {
-    ISR_lock_Context  lock_context;
-    RBTree_Node      *node;
-
-    _Objects_Allocator_lock();
-    _POSIX_Keys_Key_value_acquire( the_thread, &lock_context );
-
-    node = _RBTree_Root( &the_thread->Keys.Key_value_pairs );
-    if ( node != NULL ) {
-      POSIX_Keys_Key_value_pair *key_value_pair;
-      pthread_key_t              key;
-      void                      *value;
-      POSIX_Keys_Control        *the_key;
-      void                    ( *destructor )( void * );
-
-      key_value_pair = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( node );
-      key = key_value_pair->key;
-      value = key_value_pair->value;
-      _RBTree_Extract(
-        &the_thread->Keys.Key_value_pairs,
-        &key_value_pair->Lookup_node
-      );
-
-      _POSIX_Keys_Key_value_release( the_thread, &lock_context );
-      _POSIX_Keys_Key_value_free( key_value_pair );
-
-      the_key = _POSIX_Keys_Get( key );
-      _Assert( the_key != NULL );
-      destructor = the_key->destructor;
-
-      _Objects_Allocator_unlock();
-
-      if ( destructor != NULL && value != NULL ) {
-        ( *destructor )( value );
-      }
-    } else {
-      _POSIX_Keys_Key_value_release( the_thread, &lock_context );
-      _Objects_Allocator_unlock();
-      break;
-    }
-  }
-}
-
-static void _POSIX_Keys_Restart_run_destructors(
-  Thread_Control *executing,
-  Thread_Control *the_thread
-)
-{
-  (void) executing;
-  _POSIX_Keys_Run_destructors( the_thread );
-}
-
-static User_extensions_Control _POSIX_Keys_Extensions = {
-  .Callouts = {
-    .thread_restart = _POSIX_Keys_Restart_run_destructors,
-    .thread_terminate = _POSIX_Keys_Run_destructors
-  }
-};
-
-/**
- * @brief This routine performs the initialization necessary for this manager.
- */
-static void _POSIX_Keys_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_POSIX_Keys_Information,   /* object information table */
-    OBJECTS_POSIX_API,          /* object API */
-    OBJECTS_POSIX_KEYS,         /* object class */
-    Configuration.maximum_keys,
-                                /* maximum objects of this class */
-    sizeof( POSIX_Keys_Control ),
-                                /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,     /* maximum length of each object's name */
-    NULL                        /* Proxy extraction support callout */
-  );
-
-  _POSIX_Keys_Initialize_keypool();
-
-  _User_extensions_Add_API_set( &_POSIX_Keys_Extensions );
-}
+#include <rtems/posix/key.h>
 
-RTEMS_SYSINIT_ITEM(
-  _POSIX_Keys_Manager_initialization,
-  RTEMS_SYSINIT_POSIX_KEYS,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _POSIX_Keys,
+  OBJECTS_POSIX_API,
+  OBJECTS_POSIX_KEYS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/posix/src/keycreate.c b/cpukit/posix/src/keycreate.c
index 432bfd86b6..b4f1c87335 100644
--- a/cpukit/posix/src/keycreate.c
+++ b/cpukit/posix/src/keycreate.c
@@ -20,6 +20,9 @@
 #endif
 
 #include <rtems/posix/keyimpl.h>
+#include <rtems/score/userextimpl.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/sysinit.h>
 
 #include <errno.h>
 
@@ -47,3 +50,119 @@ int pthread_key_create(
   _Objects_Allocator_unlock();
   return 0;
 }
+
+Freechain_Control _POSIX_Keys_Keypool;
+
+static uint32_t _POSIX_Keys_Get_keypool_bump_count( void )
+{
+  uint32_t max;
+
+  max = _POSIX_Keys_Key_value_pair_maximum;
+  return _Objects_Is_unlimited( max ) ?
+    _Objects_Maximum_per_allocation( max ) : 0;
+}
+
+static uint32_t _POSIX_Keys_Get_initial_keypool_size( void )
+{
+  uint32_t max;
+
+  max = _POSIX_Keys_Key_value_pair_maximum;
+  return _Objects_Maximum_per_allocation( max );
+}
+
+static void _POSIX_Keys_Initialize_keypool( void )
+{
+  _Freechain_Initialize(
+    &_POSIX_Keys_Keypool,
+    _POSIX_Keys_Key_value_pairs,
+    _POSIX_Keys_Get_initial_keypool_size(),
+    sizeof( _POSIX_Keys_Key_value_pairs[ 0 ] )
+  );
+}
+
+POSIX_Keys_Key_value_pair * _POSIX_Keys_Key_value_allocate( void )
+{
+  return (POSIX_Keys_Key_value_pair *) _Freechain_Get(
+    &_POSIX_Keys_Keypool,
+    _Workspace_Allocate,
+    _POSIX_Keys_Get_keypool_bump_count(),
+    sizeof( POSIX_Keys_Key_value_pair )
+  );
+}
+
+static void _POSIX_Keys_Run_destructors( Thread_Control *the_thread )
+{
+  while ( true ) {
+    ISR_lock_Context  lock_context;
+    RBTree_Node      *node;
+
+    _Objects_Allocator_lock();
+    _POSIX_Keys_Key_value_acquire( the_thread, &lock_context );
+
+    node = _RBTree_Root( &the_thread->Keys.Key_value_pairs );
+    if ( node != NULL ) {
+      POSIX_Keys_Key_value_pair *key_value_pair;
+      pthread_key_t              key;
+      void                      *value;
+      POSIX_Keys_Control        *the_key;
+      void                    ( *destructor )( void * );
+
+      key_value_pair = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( node );
+      key = key_value_pair->key;
+      value = key_value_pair->value;
+      _RBTree_Extract(
+        &the_thread->Keys.Key_value_pairs,
+        &key_value_pair->Lookup_node
+      );
+
+      _POSIX_Keys_Key_value_release( the_thread, &lock_context );
+      _POSIX_Keys_Key_value_free( key_value_pair );
+
+      the_key = _POSIX_Keys_Get( key );
+      _Assert( the_key != NULL );
+      destructor = the_key->destructor;
+
+      _Objects_Allocator_unlock();
+
+      if ( destructor != NULL && value != NULL ) {
+        ( *destructor )( value );
+      }
+    } else {
+      _POSIX_Keys_Key_value_release( the_thread, &lock_context );
+      _Objects_Allocator_unlock();
+      break;
+    }
+  }
+}
+
+static void _POSIX_Keys_Restart_run_destructors(
+  Thread_Control *executing,
+  Thread_Control *the_thread
+)
+{
+  (void) executing;
+  _POSIX_Keys_Run_destructors( the_thread );
+}
+
+static User_extensions_Control _POSIX_Keys_Extensions = {
+  .Callouts = {
+    .thread_restart = _POSIX_Keys_Restart_run_destructors,
+    .thread_terminate = _POSIX_Keys_Run_destructors
+  }
+};
+
+/**
+ * @brief This routine performs the initialization necessary for this manager.
+ */
+static void _POSIX_Keys_Manager_initialization(void)
+{
+  _Objects_Initialize_information( &_POSIX_Keys_Information );
+  _POSIX_Keys_Initialize_keypool();
+  _User_extensions_Add_API_set( &_POSIX_Keys_Extensions );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _POSIX_Keys_Manager_initialization,
+  RTEMS_SYSINIT_POSIX_KEYS,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/posix/src/keyzerokvp.c b/cpukit/posix/src/keyzerokvp.c
new file mode 100644
index 0000000000..0419678821
--- /dev/null
+++ b/cpukit/posix/src/keyzerokvp.c
@@ -0,0 +1,36 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/posix/key.h>
+
+POSIX_Keys_Key_value_pair _POSIX_Keys_Key_value_pairs[ 0 ];
+
+const uint32_t _POSIX_Keys_Key_value_pair_maximum;
diff --git a/cpukit/posix/src/mqueue.c b/cpukit/posix/src/mqueue.c
index 192d853c35..21c5feb8be 100644
--- a/cpukit/posix/src/mqueue.c
+++ b/cpukit/posix/src/mqueue.c
@@ -1,66 +1,49 @@
 /**
  * @file
  *
- * @brief Initializes message_queue Manager Related Data Structures
- * @ingroup POSIX_MQUEUE_P Message Queues Private Support Information
+ * @ingroup POSIX_MQUEUE_P
+ *
+ * @brief POSIX Message Queue Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
  *
- *  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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <stdarg.h>
-
-#include <pthread.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <mqueue.h>
-#include <limits.h>
-
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/score/watchdog.h>
-#include <rtems/seterr.h>
 #include <rtems/posix/mqueueimpl.h>
 
-Objects_Information _POSIX_Message_queue_Information;
-
-/*
- *  _POSIX_Message_queue_Manager_initialization
- *
- *  This routine initializes all message_queue manager related data structures.
- *
- *  Input parameters:   NONE
- *
- *  Output parameters:  NONE
- */
-
-static void _POSIX_Message_queue_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_POSIX_Message_queue_Information, /* object information table */
-    OBJECTS_POSIX_API,                 /* object API */
-    OBJECTS_POSIX_MESSAGE_QUEUES,      /* object class */
-    _Configuration_POSIX_Maximum_message_queues,
-    sizeof( POSIX_Message_queue_Control ),
-                                /* size of this object's control block */
-    _POSIX_PATH_MAX,            /* maximum length of each object's name */
-    NULL                        /* Proxy extraction support callout */
-  );
-}
+#include <limits.h>
 
-RTEMS_SYSINIT_ITEM(
-  _POSIX_Message_queue_Manager_initialization,
-  RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _POSIX_Message_queue,
+  OBJECTS_POSIX_API,
+  OBJECTS_POSIX_MESSAGE_QUEUES,
+  _POSIX_PATH_MAX
 );
diff --git a/cpukit/posix/src/mqueueopen.c b/cpukit/posix/src/mqueueopen.c
index fe63d4ea6e..4bb8025e65 100644
--- a/cpukit/posix/src/mqueueopen.c
+++ b/cpukit/posix/src/mqueueopen.c
@@ -32,6 +32,7 @@
 
 #include <rtems/posix/mqueueimpl.h>
 #include <rtems/score/wkspace.h>
+#include <rtems/sysinit.h>
 
 #include <stdarg.h>
 #include <fcntl.h>
@@ -191,3 +192,14 @@ mqd_t mq_open(
   _Objects_Allocator_unlock();
   return status;
 }
+
+static void _POSIX_Message_queue_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_POSIX_Message_queue_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _POSIX_Message_queue_Manager_initialization,
+  RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/posix/src/psxsemaphore.c b/cpukit/posix/src/psxsemaphore.c
index a26ba7563e..952587a19f 100644
--- a/cpukit/posix/src/psxsemaphore.c
+++ b/cpukit/posix/src/psxsemaphore.c
@@ -1,57 +1,49 @@
 /**
  * @file
  *
- * @brief POSIX Function Initializes Semaphore Manager
- * @ingroup POSIXAPI
+ * @ingroup POSIXSemaphorePrivate
+ *
+ * @brief POSIX Semaphore Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/posix/semaphoreimpl.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
+#include <rtems/posix/semaphore.h>
 
 #include <limits.h>
 
-Objects_Information _POSIX_Semaphore_Information;
-
-/*
- *  _POSIX_Semaphore_Manager_initialization
- *
- *  This routine initializes all semaphore manager related data structures.
- *
- *  Input parameters:   NONE
- *
- *  Output parameters:  NONE
- */
-
-static void _POSIX_Semaphore_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_POSIX_Semaphore_Information, /* object information table */
-    OBJECTS_POSIX_API,          /* object API */
-    OBJECTS_POSIX_SEMAPHORES,   /* object class */
-    _Configuration_POSIX_Maximum_named_semaphores,
-    sizeof( POSIX_Semaphore_Control ),
-                                /* size of this object's control block */
-    _POSIX_PATH_MAX,            /* maximum length of each object's name */
-    NULL                        /* Proxy extraction support callout */
-  );
-}
-
-RTEMS_SYSINIT_ITEM(
-  _POSIX_Semaphore_Manager_initialization,
-  RTEMS_SYSINIT_POSIX_SEMAPHORE,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _POSIX_Semaphore,
+  OBJECTS_POSIX_API,
+  OBJECTS_POSIX_SEMAPHORES,
+  _POSIX_PATH_MAX
 );
diff --git a/cpukit/posix/src/psxtimercreate.c b/cpukit/posix/src/psxtimercreate.c
index 5123071d99..ba5d066194 100644
--- a/cpukit/posix/src/psxtimercreate.c
+++ b/cpukit/posix/src/psxtimercreate.c
@@ -24,12 +24,12 @@
 #include <errno.h>
 #include <signal.h>
 
-#include <rtems/system.h>
-#include <rtems/seterr.h>
-#include <rtems/score/thread.h>
 #include <rtems/posix/sigset.h>
 #include <rtems/posix/timerimpl.h>
+#include <rtems/score/thread.h>
 #include <rtems/score/watchdogimpl.h>
+#include <rtems/seterr.h>
+#include <rtems/sysinit.h>
 
 int timer_create(
   clockid_t        clock_id,
@@ -99,3 +99,14 @@ int timer_create(
   _Objects_Allocator_unlock();
   return 0;
 }
+
+static void _POSIX_Timer_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_POSIX_Timer_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _POSIX_Timer_Manager_initialization,
+  RTEMS_SYSINIT_POSIX_TIMER,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
index 0a790f9371..18c8635497 100644
--- a/cpukit/posix/src/pthread.c
+++ b/cpukit/posix/src/pthread.c
@@ -17,192 +17,11 @@
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
-#include <stdio.h>
 
-#include <errno.h>
-#include <pthread.h>
-#include <limits.h>
-#include <assert.h>
+#include <rtems/posix/pthread.h>
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/score/stack.h>
-#include <rtems/score/threadimpl.h>
-#include <rtems/score/threadqimpl.h>
-#include <rtems/score/userextimpl.h>
-#include <rtems/score/wkspace.h>
-#include <rtems/posix/pthreadimpl.h>
-#include <rtems/posix/priorityimpl.h>
-#if defined(RTEMS_POSIX_API)
-#include <rtems/posix/psignalimpl.h>
-#endif
-#include <rtems/posix/config.h>
-#include <rtems/posix/keyimpl.h>
-#include <rtems/score/assert.h>
-#include <rtems/score/schedulerimpl.h>
-
-Thread_Information _POSIX_Threads_Information;
-
-#if defined(RTEMS_POSIX_API)
-void _POSIX_Threads_Sporadic_timer( Watchdog_Control *watchdog )
-{
-  POSIX_API_Control    *api;
-  Thread_Control       *the_thread;
-  Thread_queue_Context  queue_context;
-
-  api = RTEMS_CONTAINER_OF( watchdog, POSIX_API_Control, Sporadic.Timer );
-  the_thread = api->Sporadic.thread;
-
-  _Thread_queue_Context_initialize( &queue_context );
-  _Thread_queue_Context_clear_priority_updates( &queue_context );
-  _Thread_Wait_acquire( the_thread, &queue_context );
-
-  if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) {
-    _Thread_Priority_add(
-      the_thread,
-      &the_thread->Real_priority,
-      &queue_context
-    );
-    _Thread_Priority_remove(
-      the_thread,
-      &api->Sporadic.Low_priority,
-      &queue_context
-    );
-    _Priority_Node_set_inactive( &api->Sporadic.Low_priority );
-  }
-
-  _Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer );
-  _POSIX_Threads_Sporadic_timer_insert( the_thread, api );
-
-  _Thread_Wait_release( the_thread, &queue_context );
-  _Thread_Priority_update( &queue_context );
-}
-
-void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread )
-{
-  POSIX_API_Control    *api;
-  Thread_queue_Context  queue_context;
-
-  api = the_thread->API_Extensions[ THREAD_API_POSIX ];
-
-  _Thread_queue_Context_initialize( &queue_context );
-  _Thread_queue_Context_clear_priority_updates( &queue_context );
-  _Thread_Wait_acquire( the_thread, &queue_context );
-
-  /*
-   *  This will prevent the thread from consuming its entire "budget"
-   *  while at low priority.
-   */
-  the_thread->cpu_time_budget = UINT32_MAX;
-
-  if ( !_Priority_Node_is_active( &api->Sporadic.Low_priority ) ) {
-    _Thread_Priority_add(
-      the_thread,
-      &api->Sporadic.Low_priority,
-      &queue_context
-    );
-    _Thread_Priority_remove(
-      the_thread,
-      &the_thread->Real_priority,
-      &queue_context
-    );
-  }
-
-  _Thread_Wait_release( the_thread, &queue_context );
-  _Thread_Priority_update( &queue_context );
-}
-
-/*
- *  _POSIX_Threads_Create_extension
- *
- *  This method is invoked for each thread created.
- */
-
-static bool _POSIX_Threads_Create_extension(
-  Thread_Control *executing RTEMS_UNUSED,
-  Thread_Control *created
-)
-{
-  POSIX_API_Control *api;
-
-  api = created->API_Extensions[ THREAD_API_POSIX ];
-
-  api->Sporadic.thread = created;
-  _Watchdog_Preinitialize( &api->Sporadic.Timer, _Per_CPU_Get_by_index( 0 ) );
-  _Watchdog_Initialize( &api->Sporadic.Timer, _POSIX_Threads_Sporadic_timer );
-  _Priority_Node_set_inactive( &api->Sporadic.Low_priority );
-
-  return true;
-}
-
-static void _POSIX_Threads_Terminate_extension( Thread_Control *executing )
-{
-  POSIX_API_Control *api;
-  ISR_lock_Context   lock_context;
-
-  api = executing->API_Extensions[ THREAD_API_POSIX ];
-
-  _Thread_State_acquire( executing, &lock_context );
-  _Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer );
-  _Thread_State_release( executing, &lock_context );
-}
-#endif
-
-/*
- *  _POSIX_Threads_Exitted_extension
- *
- *  This method is invoked each time a thread exits.
- */
-static void _POSIX_Threads_Exitted_extension(
-  Thread_Control *executing
-)
-{
-  /*
-   *  If the executing thread was not created with the POSIX API, then this
-   *  API do not get to define its exit behavior.
-   */
-  if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API )
-    pthread_exit( executing->Wait.return_argument );
-}
-
-User_extensions_Control _POSIX_Threads_User_extensions = {
-  .Callouts = {
-#if defined(RTEMS_POSIX_API)
-    .thread_create    = _POSIX_Threads_Create_extension,
-    .thread_terminate = _POSIX_Threads_Terminate_extension,
-#endif
-    .thread_exitted   = _POSIX_Threads_Exitted_extension
-  }
-};
-
-/*
- *  _POSIX_Threads_Manager_initialization
- *
- *  This routine initializes all threads manager related data structures.
- */
-static void _POSIX_Threads_Manager_initialization(void)
-{
-  _Thread_Initialize_information(
-    &_POSIX_Threads_Information, /* object information table */
-    OBJECTS_POSIX_API,           /* object API */
-    OBJECTS_POSIX_THREADS,       /* object class */
-    _Configuration_POSIX_Maximum_threads
-  );
-
-  /*
-   *  Add all the extensions for this API
-   */
-  _User_extensions_Add_API_set( &_POSIX_Threads_User_extensions );
-
-  /*
-   *  If we supported MP, then here we would ...
-   *       Register the MP Process Packet routine.
-   */
-}
-
-RTEMS_SYSINIT_ITEM(
-  _POSIX_Threads_Manager_initialization,
-  RTEMS_SYSINIT_POSIX_THREADS,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+THREAD_INFORMATION_DEFINE_ZERO(
+  _POSIX_Threads,
+  OBJECTS_POSIX_API,
+  OBJECTS_POSIX_THREADS
 );
diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c
index 39a241350f..b70be00217 100644
--- a/cpukit/posix/src/pthreadcreate.c
+++ b/cpukit/posix/src/pthreadcreate.c
@@ -26,6 +26,9 @@
 #include <errno.h>
 
 #include <rtems/posix/priorityimpl.h>
+#if defined(RTEMS_POSIX_API)
+#include <rtems/posix/psignalimpl.h>
+#endif
 #include <rtems/posix/pthreadimpl.h>
 #include <rtems/posix/pthreadattrimpl.h>
 #include <rtems/score/assert.h>
@@ -33,6 +36,8 @@
 #include <rtems/score/apimutex.h>
 #include <rtems/score/stackimpl.h>
 #include <rtems/score/schedulerimpl.h>
+#include <rtems/score/userextimpl.h>
+#include <rtems/sysinit.h>
 
 static inline size_t _POSIX_Threads_Ensure_minimum_stack (
   size_t size
@@ -299,3 +304,136 @@ int pthread_create(
   _Objects_Allocator_unlock();
   return 0;
 }
+
+#if defined(RTEMS_POSIX_API)
+void _POSIX_Threads_Sporadic_timer( Watchdog_Control *watchdog )
+{
+  POSIX_API_Control    *api;
+  Thread_Control       *the_thread;
+  Thread_queue_Context  queue_context;
+
+  api = RTEMS_CONTAINER_OF( watchdog, POSIX_API_Control, Sporadic.Timer );
+  the_thread = api->Sporadic.thread;
+
+  _Thread_queue_Context_initialize( &queue_context );
+  _Thread_queue_Context_clear_priority_updates( &queue_context );
+  _Thread_Wait_acquire( the_thread, &queue_context );
+
+  if ( _Priority_Node_is_active( &api->Sporadic.Low_priority ) ) {
+    _Thread_Priority_add(
+      the_thread,
+      &the_thread->Real_priority,
+      &queue_context
+    );
+    _Thread_Priority_remove(
+      the_thread,
+      &api->Sporadic.Low_priority,
+      &queue_context
+    );
+    _Priority_Node_set_inactive( &api->Sporadic.Low_priority );
+  }
+
+  _Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer );
+  _POSIX_Threads_Sporadic_timer_insert( the_thread, api );
+
+  _Thread_Wait_release( the_thread, &queue_context );
+  _Thread_Priority_update( &queue_context );
+}
+
+void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread )
+{
+  POSIX_API_Control    *api;
+  Thread_queue_Context  queue_context;
+
+  api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+  _Thread_queue_Context_initialize( &queue_context );
+  _Thread_queue_Context_clear_priority_updates( &queue_context );
+  _Thread_Wait_acquire( the_thread, &queue_context );
+
+  /*
+   *  This will prevent the thread from consuming its entire "budget"
+   *  while at low priority.
+   */
+  the_thread->cpu_time_budget = UINT32_MAX;
+
+  if ( !_Priority_Node_is_active( &api->Sporadic.Low_priority ) ) {
+    _Thread_Priority_add(
+      the_thread,
+      &api->Sporadic.Low_priority,
+      &queue_context
+    );
+    _Thread_Priority_remove(
+      the_thread,
+      &the_thread->Real_priority,
+      &queue_context
+    );
+  }
+
+  _Thread_Wait_release( the_thread, &queue_context );
+  _Thread_Priority_update( &queue_context );
+}
+
+static bool _POSIX_Threads_Create_extension(
+  Thread_Control *executing RTEMS_UNUSED,
+  Thread_Control *created
+)
+{
+  POSIX_API_Control *api;
+
+  api = created->API_Extensions[ THREAD_API_POSIX ];
+
+  api->Sporadic.thread = created;
+  _Watchdog_Preinitialize( &api->Sporadic.Timer, _Per_CPU_Get_by_index( 0 ) );
+  _Watchdog_Initialize( &api->Sporadic.Timer, _POSIX_Threads_Sporadic_timer );
+  _Priority_Node_set_inactive( &api->Sporadic.Low_priority );
+
+  return true;
+}
+
+static void _POSIX_Threads_Terminate_extension( Thread_Control *executing )
+{
+  POSIX_API_Control *api;
+  ISR_lock_Context   lock_context;
+
+  api = executing->API_Extensions[ THREAD_API_POSIX ];
+
+  _Thread_State_acquire( executing, &lock_context );
+  _Watchdog_Per_CPU_remove_ticks( &api->Sporadic.Timer );
+  _Thread_State_release( executing, &lock_context );
+}
+#endif
+
+static void _POSIX_Threads_Exitted_extension(
+  Thread_Control *executing
+)
+{
+  /*
+   *  If the executing thread was not created with the POSIX API, then this
+   *  API do not get to define its exit behavior.
+   */
+  if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API )
+    pthread_exit( executing->Wait.return_argument );
+}
+
+static User_extensions_Control _POSIX_Threads_User_extensions = {
+  .Callouts = {
+#if defined(RTEMS_POSIX_API)
+    .thread_create    = _POSIX_Threads_Create_extension,
+    .thread_terminate = _POSIX_Threads_Terminate_extension,
+#endif
+    .thread_exitted   = _POSIX_Threads_Exitted_extension
+  }
+};
+
+static void _POSIX_Threads_Manager_initialization( void )
+{
+  _Thread_Initialize_information( &_POSIX_Threads_Information );
+  _User_extensions_Add_API_set( &_POSIX_Threads_User_extensions );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _POSIX_Threads_Manager_initialization,
+  RTEMS_SYSINIT_POSIX_THREADS,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/posix/src/ptimer.c b/cpukit/posix/src/ptimer.c
index f3af1710b8..311bc0b909 100644
--- a/cpukit/posix/src/ptimer.c
+++ b/cpukit/posix/src/ptimer.c
@@ -1,77 +1,47 @@
 /**
  * @file
  *
- * @brief Process Timer
- * @ingroup POSIXAPI
+ * @ingroup POSIX_INTERNAL_TIMERS
+ *
+ * @brief POSIX Timer Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
  *
- *  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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <time.h>
-#include <errno.h>
-#include <limits.h> /* _POSIX_PATH_MAX */
-
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/score/isr.h>
-#include <rtems/score/thread.h>
-
-
-/************************************/
-/* These includes are now necessary */
-/************************************/
-
-#include <unistd.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/types.h>
-#include <rtems/rtems/timer.h>
-#include <rtems/rtems/clock.h>
-#include <rtems/score/wkspace.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <signal.h>
-
-#include <rtems/posix/timerimpl.h>
-
-Objects_Information _POSIX_Timer_Information;
-
-/*
- * _POSIX_Timer_Manager_initialization
- *
- *  Description:
- *
- *  Initialize the internal structure in which the data of all
- *  the timers are stored
- */
-
-static void _POSIX_Timer_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_POSIX_Timer_Information,  /* object information table */
-    OBJECTS_POSIX_API,          /* object API */
-    OBJECTS_POSIX_TIMERS,       /* object class */
-    _Configuration_POSIX_Maximum_timers,
-    sizeof( POSIX_Timer_Control ),
-                                /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,     /* maximum length of an object name */
-    NULL                        /* Proxy extraction support callout */
-  );
-}
+#include <rtems/posix/timer.h>
 
-RTEMS_SYSINIT_ITEM(
-  _POSIX_Timer_Manager_initialization,
-  RTEMS_SYSINIT_POSIX_TIMER,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _POSIX_Timer,
+  OBJECTS_POSIX_API,
+  OBJECTS_POSIX_TIMERS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/posix/src/semopen.c b/cpukit/posix/src/semopen.c
index 63915fca57..86bd6a615e 100644
--- a/cpukit/posix/src/semopen.c
+++ b/cpukit/posix/src/semopen.c
@@ -20,6 +20,7 @@
 
 #include <rtems/posix/semaphoreimpl.h>
 #include <rtems/score/wkspace.h>
+#include <rtems/sysinit.h>
 
 #include <stdarg.h>
 #include <fcntl.h>
@@ -172,3 +173,14 @@ sem_t *sem_open(
   _Objects_Allocator_unlock();
   return sem;
 }
+
+static void _POSIX_Semaphore_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_POSIX_Semaphore_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _POSIX_Semaphore_Manager_initialization,
+  RTEMS_SYSINIT_POSIX_SEMAPHORE,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/posix/src/shm.c b/cpukit/posix/src/shm.c
index 5030a9376e..8ab14f4e0f 100644
--- a/cpukit/posix/src/shm.c
+++ b/cpukit/posix/src/shm.c
@@ -1,47 +1,49 @@
 /**
  * @file
+ *
+ * @ingroup POSIXShmPrivate
+ *
+ * @brief POSIX Shared Memory Information with Zero Objects
  */
 
 /*
- * Copyright (c) 2016 Gedare Bloom.
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- * 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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <limits.h>
-
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/libio.h>
-#include <rtems/sysinit.h>
-#include <rtems/posix/shmimpl.h>
+#include <rtems/posix/shm.h>
 
-Objects_Information _POSIX_Shm_Information;
-
-static void _POSIX_Shm_Manager_initialization( void )
-{
-  _Objects_Initialize_information(
-    &_POSIX_Shm_Information,    /* object information table */
-    OBJECTS_POSIX_API,          /* object API */
-    OBJECTS_POSIX_SHMS,         /* object class */
-    _Configuration_POSIX_Maximum_shms,
-    sizeof( POSIX_Shm_Control ),
-                                /* size of this object's control block */
-    _POSIX_PATH_MAX,            /* maximum length of each object's name */
-    NULL                        /* Proxy extraction support callout */
-  );
-}
+#include <limits.h>
 
-RTEMS_SYSINIT_ITEM(
-  _POSIX_Shm_Manager_initialization,
-  RTEMS_SYSINIT_POSIX_SHM,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _POSIX_Shm,
+  OBJECTS_POSIX_API,
+  OBJECTS_POSIX_SHMS,
+  _POSIX_PATH_MAX
 );
diff --git a/cpukit/posix/src/shmopen.c b/cpukit/posix/src/shmopen.c
index 8913e19c15..ca8da00140 100644
--- a/cpukit/posix/src/shmopen.c
+++ b/cpukit/posix/src/shmopen.c
@@ -25,6 +25,7 @@
 
 #include <rtems/posix/shmimpl.h>
 #include <rtems/score/wkspace.h>
+#include <rtems/sysinit.h>
 
 static const rtems_filesystem_file_handlers_r shm_handlers;
 
@@ -314,3 +315,14 @@ static const rtems_filesystem_file_handlers_r shm_handlers = {
   .readv_h = rtems_filesystem_default_readv,
   .writev_h = rtems_filesystem_default_writev
 };
+
+static void _POSIX_Shm_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_POSIX_Shm_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _POSIX_Shm_Manager_initialization,
+  RTEMS_SYSINIT_POSIX_SHM,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/barrier.c b/cpukit/rtems/src/barrier.c
index 59b0a5d142..c0d167b0db 100644
--- a/cpukit/rtems/src/barrier.c
+++ b/cpukit/rtems/src/barrier.c
@@ -1,51 +1,47 @@
 /**
  * @file
  *
- * @brief RTEMS Barrier Manager Initialization
- * @ingroup ClassicBarrier Barriers
+ * @ingroup ClassicBarrier
+ *
+ * @brief Classic Barrier Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2015.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
  *
- *  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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/rtems/barrierimpl.h>
-
-Objects_Information _Barrier_Information;
-
-/**
- *  @brief _Barrier_Manager_initialization
- */
-static void _Barrier_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Barrier_Information,         /* object information table */
-    OBJECTS_CLASSIC_API,           /* object API */
-    OBJECTS_RTEMS_BARRIERS,        /* object class */
-    Configuration_RTEMS_API.maximum_barriers,
-                                   /* maximum objects of this class */
-    sizeof( Barrier_Control ),     /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,        /* maximum length of an object name */
-    NULL                           /* Proxy extraction support callout */
-  );
-}
+#include <rtems/rtems/barrierdata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Barrier_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_BARRIER,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Barrier,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_BARRIERS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/barriercreate.c b/cpukit/rtems/src/barriercreate.c
index 12a917fe60..5e0f883106 100644
--- a/cpukit/rtems/src/barriercreate.c
+++ b/cpukit/rtems/src/barriercreate.c
@@ -18,30 +18,12 @@
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
+#include <rtems/rtems/barrierimpl.h>
 #include <rtems/rtems/status.h>
 #include <rtems/rtems/support.h>
 #include <rtems/rtems/attrimpl.h>
 #include <rtems/score/isr.h>
-#include <rtems/rtems/barrierimpl.h>
-
-/*
- *  rtems_barrier_create
- *
- *  This directive creates a barrier.  A barrier id is returned.
- *
- *  Input parameters:
- *    name             - user defined barrier name
- *    attribute_set    - barrier attributes
- *    maximum_waiters  - number of threads before automatic release
- *    priority_ceiling - barrier's ceiling priority
- *    id               - pointer to barrier id
- *
- *  Output parameters:
- *    id               - barrier id
- *    RTEMS_SUCCESSFUL - if successful
- *    error code       - if unsuccessful
- */
+#include <rtems/sysinit.h>
 
 rtems_status_code rtems_barrier_create(
   rtems_name           name,
@@ -90,3 +72,14 @@ rtems_status_code rtems_barrier_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Barrier_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_Barrier_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Barrier_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_BARRIER,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/dpmem.c b/cpukit/rtems/src/dpmem.c
index ccecdfd6cc..79f0fb2e69 100644
--- a/cpukit/rtems/src/dpmem.c
+++ b/cpukit/rtems/src/dpmem.c
@@ -1,49 +1,47 @@
 /**
- *  @file
+ * @file
  *
- *  @brief Dual Ported Memory Manager Initialization
- *  @ingroup ClassicDPMEM
+ * @ingroup ClassicDPMEM
+ *
+ * @brief Classic Dual Ported Memory Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/rtems/dpmemimpl.h>
-
-Objects_Information _Dual_ported_memory_Information;
-
-static void _Dual_ported_memory_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Dual_ported_memory_Information, /* object information table */
-    OBJECTS_CLASSIC_API,              /* object API */
-    OBJECTS_RTEMS_PORTS,              /* object class */
-    Configuration_RTEMS_API.maximum_ports,
-                                  /* maximum objects of this class */
-    sizeof( Dual_ported_memory_Control ),
-                                  /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,       /* maximum length of an object name */
-    NULL                          /* Proxy extraction support callout */
-  );
-}
+#include <rtems/rtems/dpmemdata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Dual_ported_memory_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Dual_ported_memory,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_PORTS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/dpmemcreate.c b/cpukit/rtems/src/dpmemcreate.c
index 206a199c00..1dc096d084 100644
--- a/cpukit/rtems/src/dpmemcreate.c
+++ b/cpukit/rtems/src/dpmemcreate.c
@@ -18,12 +18,12 @@
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
+#include <rtems/rtems/dpmemimpl.h>
 #include <rtems/rtems/status.h>
 #include <rtems/rtems/support.h>
 #include <rtems/score/address.h>
-#include <rtems/rtems/dpmemimpl.h>
 #include <rtems/score/thread.h>
+#include <rtems/sysinit.h>
 
 rtems_status_code rtems_port_create(
   rtems_name    name,
@@ -66,3 +66,14 @@ rtems_status_code rtems_port_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Dual_ported_memory_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_Dual_ported_memory_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Dual_ported_memory_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/msg.c b/cpukit/rtems/src/msg.c
index 8060735beb..1156db4485 100644
--- a/cpukit/rtems/src/msg.c
+++ b/cpukit/rtems/src/msg.c
@@ -1,64 +1,47 @@
 /**
- *  @file
+ * @file
  *
- *  @brief Message Queue Manager Initialization
- *  @ingroup ClassicMessageQueue
+ * @ingroup ClassicMessageQueue
+ *
+ * @brief Classic Message Queue Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.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>
-
-Objects_Information _Message_queue_Information;
-
-static void _Message_queue_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Message_queue_Information,  /* object information table */
-    OBJECTS_CLASSIC_API,          /* object API */
-    OBJECTS_RTEMS_MESSAGE_QUEUES, /* object class */
-    Configuration_RTEMS_API.maximum_message_queues,
-                                  /* maximum objects of this class */
-    sizeof( Message_queue_Control ),
-                                  /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,       /* maximum length of an object name */
-    _Message_queue_MP_Send_extract_proxy
-                                  /* Proxy extraction support callout */
-  );
-
-  /*
-   *  Register the MP Process Packet routine.
-   */
-
-#if defined(RTEMS_MULTIPROCESSING)
-  _MPCI_Register_packet_processor(
-    MP_PACKET_MESSAGE_QUEUE,
-    _Message_queue_MP_Process_packet
-  );
-#endif
-
-}
+#include <rtems/rtems/messagedata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Message_queue_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Message_queue,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_MESSAGE_QUEUES,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/msgqcreate.c b/cpukit/rtems/src/msgqcreate.c
index 8a16819f80..2925d244a7 100644
--- a/cpukit/rtems/src/msgqcreate.c
+++ b/cpukit/rtems/src/msgqcreate.c
@@ -18,18 +18,18 @@
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
+#include <rtems/rtems/messageimpl.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attrimpl.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/support.h>
 #include <rtems/score/sysstate.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>
+#include <rtems/sysinit.h>
 
 rtems_status_code rtems_message_queue_create(
   rtems_name       name,
@@ -143,3 +143,26 @@ rtems_status_code rtems_message_queue_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Message_queue_Manager_initialization(void)
+{
+   _Objects_Initialize_information( &_Message_queue_Information);
+
+  /*
+   *  Register the MP Process Packet routine.
+   */
+
+#if defined(RTEMS_MULTIPROCESSING)
+  _MPCI_Register_packet_processor(
+    MP_PACKET_MESSAGE_QUEUE,
+    _Message_queue_MP_Process_packet
+  );
+#endif
+
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Message_queue_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/part.c b/cpukit/rtems/src/part.c
index d395f34342..cb47921556 100644
--- a/cpukit/rtems/src/part.c
+++ b/cpukit/rtems/src/part.c
@@ -1,60 +1,47 @@
 /**
- *  @file
+ * @file
  *
- *  @brief Partition Manager Initialization
- *  @ingroup ClassicPart
+ * @ingroup ClassicPart
+ *
+ * @brief Classic Partition Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/rtems/partimpl.h>
-
-Objects_Information _Partition_Information;
-
-static void _Partition_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Partition_Information,     /* object information table */
-    OBJECTS_CLASSIC_API,         /* object API */
-    OBJECTS_RTEMS_PARTITIONS,    /* object class */
-    Configuration_RTEMS_API.maximum_partitions,
-                                 /* maximum objects of this class */
-    sizeof( Partition_Control ), /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,      /* maximum length of an object name */
-    _Partition_MP_Send_extract_proxy  /* Proxy extraction support callout */
-  );
-
-  /*
-   *  Register the MP Process Packet routine.
-   */
-
-#if defined(RTEMS_MULTIPROCESSING)
-  _MPCI_Register_packet_processor(
-    MP_PACKET_PARTITION,
-    _Partition_MP_Process_packet
-  );
-#endif
-
-}
+#include <rtems/rtems/partdata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Partition_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_PARTITION,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Partition,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_PARTITIONS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/partcreate.c b/cpukit/rtems/src/partcreate.c
index 1a7304efa3..99d0d59b37 100644
--- a/cpukit/rtems/src/partcreate.c
+++ b/cpukit/rtems/src/partcreate.c
@@ -23,26 +23,8 @@
 #include <rtems/rtems/support.h>
 #include <rtems/score/threaddispatch.h>
 #include <rtems/score/sysstate.h>
+#include <rtems/sysinit.h>
 
-/*
- *  rtems_partition_create
- *
- *  This directive creates a partiton of fixed sized buffers from the
- *  given contiguous memory area.
- *
- *  Input parameters:
- *    name             - user defined partition name
- *    starting_address - physical start address of partition
- *    length           - physical length in bytes
- *    buffer_size      - size of buffers in bytes
- *    attribute_set    - partition attributes
- *    id               - pointer to partition id
- *
- *  Output parameters:
- *    id               - partition id
- *    RTEMS_SUCCESSFUL - if successful
- *    error code       - if unsuccessful
- */
 
 rtems_status_code rtems_partition_create(
   rtems_name       name,
@@ -133,3 +115,26 @@ rtems_status_code rtems_partition_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Partition_Manager_initialization(void)
+{
+  _Objects_Initialize_information( &_Partition_Information );
+
+  /*
+   *  Register the MP Process Packet routine.
+   */
+
+#if defined(RTEMS_MULTIPROCESSING)
+  _MPCI_Register_packet_processor(
+    MP_PACKET_PARTITION,
+    _Partition_MP_Process_packet
+  );
+#endif
+
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Partition_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_PARTITION,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/ratemon.c b/cpukit/rtems/src/ratemon.c
index a8681dda44..dc54169a96 100644
--- a/cpukit/rtems/src/ratemon.c
+++ b/cpukit/rtems/src/ratemon.c
@@ -1,48 +1,47 @@
 /**
- *  @file
+ * @file
  *
- *  @brief Rate Monotonic Manager Initialization
- *  @ingroup ClassicRateMon
+ * @ingroup ClassicRateMon
+ *
+ * @brief Classic Rate Monotonic Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/rtems/ratemonimpl.h>
-
-Objects_Information _Rate_monotonic_Information;
-
-static void _Rate_monotonic_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Rate_monotonic_Information,    /* object information table */
-    OBJECTS_CLASSIC_API,             /* object API */
-    OBJECTS_RTEMS_PERIODS,           /* object class */
-    Configuration_RTEMS_API.maximum_periods,
-                                     /* maximum objects of this class */
-    sizeof( Rate_monotonic_Control ),/* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,          /* maximum length of an object name */
-    NULL                             /* Proxy extraction support callout */
-  );
-}
+#include <rtems/rtems/ratemondata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Rate_monotonic_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Rate_monotonic,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_PERIODS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/ratemoncreate.c b/cpukit/rtems/src/ratemoncreate.c
index 12327295ac..8dd43bb9fc 100644
--- a/cpukit/rtems/src/ratemoncreate.c
+++ b/cpukit/rtems/src/ratemoncreate.c
@@ -18,29 +18,13 @@
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
+#include <rtems/rtems/ratemonimpl.h>
 #include <rtems/rtems/status.h>
 #include <rtems/rtems/support.h>
 #include <rtems/score/isr.h>
-#include <rtems/rtems/ratemonimpl.h>
 #include <rtems/score/thread.h>
 #include <rtems/score/watchdogimpl.h>
-
-/*
- *  rtems_rate_monotonic_create
- *
- *  This directive creates a rate monotonic timer and performs
- *  some initialization.
- *
- *  Input parameters:
- *    name - name of period
- *    id   - pointer to rate monotonic id
- *
- *  Output parameters:
- *    id               - rate monotonic id
- *    RTEMS_SUCCESSFUL - if successful
- *    error code       - if unsuccessful
- */
+#include <rtems/sysinit.h>
 
 rtems_status_code rtems_rate_monotonic_create(
   rtems_name  name,
@@ -84,3 +68,14 @@ rtems_status_code rtems_rate_monotonic_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Rate_monotonic_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_Rate_monotonic_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Rate_monotonic_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/region.c b/cpukit/rtems/src/region.c
index 4fbce63160..f7ed857832 100644
--- a/cpukit/rtems/src/region.c
+++ b/cpukit/rtems/src/region.c
@@ -1,59 +1,47 @@
 /**
  * @file
  *
- * @brief _Region_Manager_initialization
- * @ingroup ClassicRegion Regions
+ * @ingroup ClassicRegion
+ *
+ * @brief Classic Region Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2013.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/rtems/options.h>
-#include <rtems/rtems/regionimpl.h>
-
-Objects_Information _Region_Information;
-
-/*
- *  _Region_Manager_initialization
- *
- *  This routine initializes all region manager related data structures.
- *
- *  Input parameters:   NONE
- *
- *  Output parameters:  NONE
- */
-
-static void _Region_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Region_Information,      /* object information table */
-    OBJECTS_CLASSIC_API,       /* object API */
-    OBJECTS_RTEMS_REGIONS,     /* object class */
-    Configuration_RTEMS_API.maximum_regions,
-                               /* maximum objects of this class */
-    sizeof( Region_Control ),  /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,    /* maximum length of an object name */
-    NULL                       /* Proxy extraction support callout */
-  );
-}
+#include <rtems/rtems/regiondata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Region_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_REGION,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Region,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_REGIONS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/regioncreate.c b/cpukit/rtems/src/regioncreate.c
index 05df1dec5a..3d6215cdb1 100644
--- a/cpukit/rtems/src/regioncreate.c
+++ b/cpukit/rtems/src/regioncreate.c
@@ -23,26 +23,7 @@
 #include <rtems/rtems/support.h>
 #include <rtems/score/apimutex.h>
 #include <rtems/score/threadqimpl.h>
-
-/*
- *  rtems_region_create
- *
- *  This directive creates a region of physical contiguous memory area
- *  from which variable sized segments can be allocated.
- *
- *  Input parameters:
- *    name             - user defined region name
- *    starting_address - physical start address of region
- *    length           - physical length in bytes
- *    page_size        - page size in bytes
- *    attribute_set    - region attributes
- *    id               - address of region id to set
- *
- *  Output parameters:
- *    id               - region id
- *    RTEMS_SUCCESSFUL - if successful
- *    error code       - if unsuccessful
- */
+#include <rtems/sysinit.h>
 
 rtems_status_code rtems_region_create(
   rtems_name          name,
@@ -104,3 +85,14 @@ rtems_status_code rtems_region_create(
 
   return return_status;
 }
+
+static void _Region_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_Region_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Region_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_REGION,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/rtemstimer.c b/cpukit/rtems/src/rtemstimer.c
index f0a8c672fa..be6592216f 100644
--- a/cpukit/rtems/src/rtemstimer.c
+++ b/cpukit/rtems/src/rtemstimer.c
@@ -1,50 +1,47 @@
 /**
- *  @file
+ * @file
  *
- *  @brief Timer Manager Initialization
- *  @ingroup ClassicTimer
+ * @ingroup ClassicTimer
+ *
+ * @brief Classic Timer Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/support.h>
-#include <rtems/rtems/timerimpl.h>
-
-Timer_server_Control *volatile _Timer_server;
-
-Objects_Information  _Timer_Information;
-
-static void _Timer_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Timer_Information,       /* object information table */
-    OBJECTS_CLASSIC_API,       /* object API */
-    OBJECTS_RTEMS_TIMERS,      /* object class */
-    Configuration_RTEMS_API.maximum_timers ,
-                               /* maximum objects of this class */
-    sizeof( Timer_Control ),   /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,    /* maximum length of an object name */
-    NULL                       /* Proxy extraction support callout */
-  );
-}
+#include <rtems/rtems/timerdata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Timer_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_TIMER,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Timer,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_TIMERS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/sem.c b/cpukit/rtems/src/sem.c
index e91e2d14bf..51733b4997 100644
--- a/cpukit/rtems/src/sem.c
+++ b/cpukit/rtems/src/sem.c
@@ -1,57 +1,47 @@
 /**
- *  @file
+ * @file
  *
- *  @brief Semaphore Manager Initialization
- *  @ingroup ClassicSem
+ * @ingroup ClassicSem
+ *
+ * @brief Classic Semaphore Information with Zero Objects
  */
 
 /*
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/semimpl.h>
-
-Objects_Information _Semaphore_Information;
-
-static void _Semaphore_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Semaphore_Information,     /* object information table */
-    OBJECTS_CLASSIC_API,         /* object API */
-    OBJECTS_RTEMS_SEMAPHORES,    /* object class */
-     Configuration_RTEMS_API.maximum_semaphores,
-                                 /* maximum objects of this class */
-    sizeof( Semaphore_Control ), /* size of this object's control block */
-    OBJECTS_NO_STRING_NAME,      /* maximum length of an object name */
-    _Semaphore_MP_Send_extract_proxy /* Proxy extraction support callout */
-  );
-
-  /*
-   *  Register the MP Process Packet routine.
-   */
-
-#if defined(RTEMS_MULTIPROCESSING)
-  _MPCI_Register_packet_processor(
-    MP_PACKET_SEMAPHORE,
-    _Semaphore_MP_Process_packet
-  );
-#endif
-
-}
+#include <rtems/rtems/semdata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Semaphore_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_SEMAPHORE,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Semaphore,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_SEMAPHORES,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/rtems/src/semcreate.c b/cpukit/rtems/src/semcreate.c
index fd266f8cd5..dc4e02cd97 100644
--- a/cpukit/rtems/src/semcreate.c
+++ b/cpukit/rtems/src/semcreate.c
@@ -25,6 +25,7 @@
 #include <rtems/rtems/tasksimpl.h>
 #include <rtems/score/schedulerimpl.h>
 #include <rtems/score/sysstate.h>
+#include <rtems/sysinit.h>
 
 #define SEMAPHORE_KIND_MASK ( RTEMS_SEMAPHORE_CLASS | RTEMS_INHERIT_PRIORITY \
   | RTEMS_PRIORITY_CEILING | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING )
@@ -254,3 +255,21 @@ rtems_status_code rtems_semaphore_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Semaphore_Manager_initialization(void)
+{
+  _Objects_Initialize_information( &_Semaphore_Information );
+
+#if defined(RTEMS_MULTIPROCESSING)
+  _MPCI_Register_packet_processor(
+    MP_PACKET_SEMAPHORE,
+    _Semaphore_MP_Process_packet
+  );
+#endif
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Semaphore_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_SEMAPHORE,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/taskcreate.c b/cpukit/rtems/src/taskcreate.c
index 26953828e9..4055e1eb50 100644
--- a/cpukit/rtems/src/taskcreate.c
+++ b/cpukit/rtems/src/taskcreate.c
@@ -20,12 +20,15 @@
 
 #include <rtems/rtems/tasksimpl.h>
 #include <rtems/rtems/attrimpl.h>
+#include <rtems/rtems/eventimpl.h>
 #include <rtems/rtems/modesimpl.h>
 #include <rtems/rtems/support.h>
 #include <rtems/score/apimutex.h>
 #include <rtems/score/schedulerimpl.h>
 #include <rtems/score/sysstate.h>
 #include <rtems/score/threadimpl.h>
+#include <rtems/score/userextimpl.h>
+#include <rtems/sysinit.h>
 
 rtems_status_code rtems_task_create(
   rtems_name           name,
@@ -198,3 +201,62 @@ rtems_status_code rtems_task_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _RTEMS_tasks_Start_extension(
+  Thread_Control *executing,
+  Thread_Control *started
+)
+{
+  RTEMS_API_Control *api;
+
+  api = started->API_Extensions[ THREAD_API_RTEMS ];
+
+  _Event_Initialize( &api->Event );
+  _Event_Initialize( &api->System_event );
+}
+
+#if defined(RTEMS_MULTIPROCESSING)
+static void _RTEMS_tasks_Terminate_extension( Thread_Control *executing )
+{
+  if ( executing->is_global ) {
+    _Objects_MP_Close(
+      &_RTEMS_tasks_Information.Objects,
+      executing->Object.id
+    );
+    _RTEMS_tasks_MP_Send_process_packet(
+      RTEMS_TASKS_MP_ANNOUNCE_DELETE,
+      executing->Object.id,
+      0                                /* Not used */
+    );
+  }
+}
+#endif
+
+static User_extensions_Control _RTEMS_tasks_User_extensions = {
+  .Callouts = {
+#if defined(RTEMS_MULTIPROCESSING)
+    .thread_terminate = _RTEMS_tasks_Terminate_extension,
+#endif
+    .thread_start     = _RTEMS_tasks_Start_extension,
+    .thread_restart   = _RTEMS_tasks_Start_extension
+  }
+};
+
+static void _RTEMS_tasks_Manager_initialization(void)
+{
+  _Thread_Initialize_information( &_RTEMS_tasks_Information );
+  _User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
+
+#if defined(RTEMS_MULTIPROCESSING)
+  _MPCI_Register_packet_processor(
+    MP_PACKET_TASKS,
+    _RTEMS_tasks_MP_Process_packet
+  );
+#endif
+}
+
+RTEMS_SYSINIT_ITEM(
+  _RTEMS_tasks_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_TASKS,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c
index 55dd1dc334..f0297b175b 100644
--- a/cpukit/rtems/src/tasks.c
+++ b/cpukit/rtems/src/tasks.c
@@ -18,86 +18,10 @@
 #include "config.h"
 #endif
 
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-#include <rtems/rtems/eventimpl.h>
-#include <rtems/rtems/tasksimpl.h>
-#include <rtems/score/threadimpl.h>
-#include <rtems/score/userextimpl.h>
+#include <rtems/rtems/tasksdata.h>
 
-Thread_Information _RTEMS_tasks_Information;
-
-static void _RTEMS_tasks_Start_extension(
-  Thread_Control *executing,
-  Thread_Control *started
-)
-{
-  RTEMS_API_Control *api;
-
-  api = started->API_Extensions[ THREAD_API_RTEMS ];
-
-  _Event_Initialize( &api->Event );
-  _Event_Initialize( &api->System_event );
-}
-
-#if defined(RTEMS_MULTIPROCESSING)
-static void _RTEMS_tasks_Terminate_extension( Thread_Control *executing )
-{
-  if ( executing->is_global ) {
-    _Objects_MP_Close(
-      &_RTEMS_tasks_Information.Objects,
-      executing->Object.id
-    );
-    _RTEMS_tasks_MP_Send_process_packet(
-      RTEMS_TASKS_MP_ANNOUNCE_DELETE,
-      executing->Object.id,
-      0                                /* Not used */
-    );
-  }
-}
-#endif
-
-User_extensions_Control _RTEMS_tasks_User_extensions = {
-  .Callouts = {
-#if defined(RTEMS_MULTIPROCESSING)
-    .thread_terminate = _RTEMS_tasks_Terminate_extension,
-#endif
-    .thread_start     = _RTEMS_tasks_Start_extension,
-    .thread_restart   = _RTEMS_tasks_Start_extension
-  }
-};
-
-static void _RTEMS_tasks_Manager_initialization(void)
-{
-  _Thread_Initialize_information(
-    &_RTEMS_tasks_Information, /* object information table */
-    OBJECTS_CLASSIC_API,       /* object API */
-    OBJECTS_RTEMS_TASKS,       /* object class */
-    Configuration_RTEMS_API.maximum_tasks
-                               /* maximum objects of this class */
-  );
-
-  /*
-   *  Add all the extensions for this API
-   */
-
-  _User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
-
-  /*
-   *  Register the MP Process Packet routine.
-   */
-
-#if defined(RTEMS_MULTIPROCESSING)
-  _MPCI_Register_packet_processor(
-    MP_PACKET_TASKS,
-    _RTEMS_tasks_MP_Process_packet
-  );
-#endif
-
-}
-
-RTEMS_SYSINIT_ITEM(
-  _RTEMS_tasks_Manager_initialization,
-  RTEMS_SYSINIT_CLASSIC_TASKS,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+THREAD_INFORMATION_DEFINE_ZERO(
+  _RTEMS_tasks,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_TASKS
 );
diff --git a/cpukit/rtems/src/timercreate.c b/cpukit/rtems/src/timercreate.c
index 0fff3d54cf..ad47ce505a 100644
--- a/cpukit/rtems/src/timercreate.c
+++ b/cpukit/rtems/src/timercreate.c
@@ -27,12 +27,15 @@
 #include <rtems/score/thread.h>
 #include <rtems/score/todimpl.h>
 #include <rtems/score/watchdogimpl.h>
+#include <rtems/sysinit.h>
 
 RTEMS_STATIC_ASSERT(
   PER_CPU_WATCHDOG_REALTIME == TIMER_CLASS_BIT_TIME_OF_DAY,
   TIMER_CLASS_BIT_TIME_OF_DAY
 );
 
+Timer_server_Control *volatile _Timer_server;
+
 void _Timer_Routine_adaptor( Watchdog_Control *the_watchdog )
 {
   Timer_Control   *the_timer;
@@ -212,3 +215,14 @@ rtems_status_code rtems_timer_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Timer_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_Timer_Information );
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Timer_Manager_initialization,
+  RTEMS_SYSINIT_CLASSIC_TIMER,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/sapi/src/extension.c b/cpukit/sapi/src/extension.c
index 8e73030d29..028dccd4e0 100644
--- a/cpukit/sapi/src/extension.c
+++ b/cpukit/sapi/src/extension.c
@@ -1,47 +1,47 @@
 /**
  * @file
  *
- * @brief Initialize Extension Manager
- *
  * @ingroup ClassicUserExtensions
+ *
+ * @brief Extension Manager Information with Zero Objects
  */
 
 /*
- *  Extension Manager
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018 embedded brains GmbH
  *
- *  COPYRIGHT (c) 1989-2008.
- *  On-Line Applications Research Corporation (OAR).
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
  *
- *  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.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
  */
 
 #if HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <rtems/extensionimpl.h>
-#include <rtems/config.h>
-#include <rtems/sysinit.h>
-
-Objects_Information _Extension_Information;
-
-static void _Extension_Manager_initialization(void)
-{
-  _Objects_Initialize_information(
-    &_Extension_Information,
-    OBJECTS_CLASSIC_API,                 /* object API */
-    OBJECTS_RTEMS_EXTENSIONS,
-    Configuration.maximum_extensions,
-    sizeof( Extension_Control ),
-    OBJECTS_NO_STRING_NAME,    /* maximum length of an object name */
-    NULL                       /* Proxy extraction support callout */
-  );
-}
+#include <rtems/extensiondata.h>
 
-RTEMS_SYSINIT_ITEM(
-  _Extension_Manager_initialization,
-  RTEMS_SYSINIT_USER_EXTENSIONS,
-  RTEMS_SYSINIT_ORDER_MIDDLE
+OBJECTS_INFORMATION_DEFINE_ZERO(
+  _Extension,
+  OBJECTS_CLASSIC_API,
+  OBJECTS_RTEMS_EXTENSIONS,
+  OBJECTS_NO_STRING_NAME
 );
diff --git a/cpukit/sapi/src/extensioncreate.c b/cpukit/sapi/src/extensioncreate.c
index e3439b6a0e..d3ab0f6983 100644
--- a/cpukit/sapi/src/extensioncreate.c
+++ b/cpukit/sapi/src/extensioncreate.c
@@ -19,11 +19,10 @@
 #include "config.h"
 #endif
 
-#include <rtems/system.h>
+#include <rtems/extensionimpl.h>
 #include <rtems/rtems/support.h>
-#include <rtems/score/thread.h>
 #include <rtems/score/userextimpl.h>
-#include <rtems/extensionimpl.h>
+#include <rtems/sysinit.h>
 
 rtems_status_code rtems_extension_create(
   rtems_name                    name,
@@ -58,3 +57,14 @@ rtems_status_code rtems_extension_create(
   _Objects_Allocator_unlock();
   return RTEMS_SUCCESSFUL;
 }
+
+static void _Extension_Manager_initialization( void )
+{
+  _Objects_Initialize_information( &_Extension_Information);
+}
+
+RTEMS_SYSINIT_ITEM(
+  _Extension_Manager_initialization,
+  RTEMS_SYSINIT_USER_EXTENSIONS,
+  RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/cpukit/score/src/freechain.c b/cpukit/score/src/freechain.c
index 68786b1d7a..57ba293d4b 100644
--- a/cpukit/score/src/freechain.c
+++ b/cpukit/score/src/freechain.c
@@ -20,31 +20,6 @@
 
 #include <rtems/score/freechain.h>
 #include <rtems/score/assert.h>
-#include <rtems/score/chainimpl.h>
-
-void _Freechain_Initialize(
-  Freechain_Control   *freechain,
-  Freechain_Allocator  allocator,
-  size_t               number_nodes,
-  size_t               node_size
-)
-{
-  void *starting_address;
-
-  if ( number_nodes > 0 ) {
-    starting_address = ( *allocator )( number_nodes * node_size );
-    number_nodes *= ( starting_address != NULL );
-  } else {
-    starting_address = NULL;
-  }
-
-  _Chain_Initialize(
-    &freechain->Free,
-    starting_address,
-    number_nodes,
-    node_size
-  );
-}
 
 void *_Freechain_Get(
   Freechain_Control   *freechain,
diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c
index 2d0244d887..9b09caa074 100644
--- a/cpukit/score/src/mpci.c
+++ b/cpukit/score/src/mpci.c
@@ -146,7 +146,7 @@ static void _MPCI_Create_server( void )
 
   name.name_u32 = _Objects_Build_name( 'M', 'P', 'C', 'I' );
   _Thread_Initialize(
-    &_Thread_Internal_information,
+    &_Thread_Information,
     _MPCI_Receive_server_tcb,
     &_Scheduler_Table[ 0 ],
     NULL,        /* allocate the stack */
diff --git a/cpukit/score/src/objectallocate.c b/cpukit/score/src/objectallocate.c
index 9213cf8eb7..ad73884a07 100644
--- a/cpukit/score/src/objectallocate.c
+++ b/cpukit/score/src/objectallocate.c
@@ -68,13 +68,18 @@ Objects_Control *_Objects_Allocate_unprotected(
     }
 
     if ( the_object != NULL ) {
+      Objects_Maximum objects_per_block;
       Objects_Maximum block;
 
+      objects_per_block = information->objects_per_block;
       block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM;
-      block /= information->objects_per_block;
 
-      information->inactive_per_block[ block ]--;
-      information->inactive--;
+      if ( block > objects_per_block ) {
+        block /= objects_per_block;
+
+        information->inactive_per_block[ block ]--;
+        information->inactive--;
+      }
     }
   }
 
diff --git a/cpukit/score/src/objectextendinformation.c b/cpukit/score/src/objectextendinformation.c
index 59a03ebbb4..3724f637c9 100644
--- a/cpukit/score/src/objectextendinformation.c
+++ b/cpukit/score/src/objectextendinformation.c
@@ -61,28 +61,25 @@ void _Objects_Extend_information(
     _Objects_Allocator_is_owner()
       || !_System_state_Is_up( _System_state_Get() )
   );
+  _Assert( _Objects_Is_auto_extend( information ) );
 
-  api_class_and_node = information->maximum_id & ~OBJECTS_INDEX_MASK;
+  extend_count = _Objects_Extend_size( information );
+  old_maximum = _Objects_Get_maximum_index( information );
+  new_maximum = (uint32_t) old_maximum + extend_count;
 
-  if ( _Objects_Is_auto_extend( information ) ) {
-  } else {
-  }
+  api_class_and_node = information->maximum_id & ~OBJECTS_INDEX_MASK;
 
   /*
    *  Search for a free block of indexes. If we do NOT need to allocate or
    *  extend the block table, then we will change do_extend.
    */
   do_extend     = true;
-  index_base    = 0;
-  block         = 0;
+  index_base    = extend_count;
+  block         = 1;
 
   if ( information->object_blocks == NULL ) {
-    extend_count = _Objects_Get_maximum_index( information );
-    old_maximum = 0;
-    block_count = 0;
+    block_count = 1;
   } else {
-    extend_count = information->objects_per_block;
-    old_maximum = _Objects_Get_maximum_index( information );
     block_count = old_maximum / extend_count;
 
     for ( ; block < block_count; block++ ) {
@@ -94,7 +91,6 @@ void _Objects_Extend_information(
     }
   }
 
-  new_maximum = (uint32_t) old_maximum + extend_count;
   index_end = index_base + extend_count;
 
   /*
@@ -111,12 +107,9 @@ void _Objects_Extend_information(
    * generate a fatal error depending on auto-extending being active.
    */
   object_block_size = extend_count * information->object_size;
-  if ( _Objects_Is_auto_extend( information ) ) {
-    new_object_block = _Workspace_Allocate( object_block_size );
-    if ( !new_object_block )
-      return;
-  } else {
-    new_object_block = _Workspace_Allocate_or_fatal_error( object_block_size );
+  new_object_block = _Workspace_Allocate( object_block_size );
+  if ( new_object_block == NULL ) {
+    return;
   }
 
   /*
@@ -162,14 +155,10 @@ void _Objects_Extend_information(
     table_size = object_blocks_size
       + local_table_size
       + block_count * sizeof( *inactive_per_block );
-    if ( _Objects_Is_auto_extend( information ) ) {
-      object_blocks = _Workspace_Allocate( table_size );
-      if ( !object_blocks ) {
-        _Workspace_Free( new_object_block );
-        return;
-      }
-    } else {
-      object_blocks = _Workspace_Allocate_or_fatal_error( table_size );
+    object_blocks = _Workspace_Allocate( table_size );
+    if ( object_blocks == NULL ) {
+      _Workspace_Free( new_object_block );
+      return;
     }
 
     /*
@@ -190,7 +179,7 @@ void _Objects_Extend_information(
      */
     block_count--;
 
-    if ( old_maximum > 0 ) {
+    if ( old_maximum > extend_count ) {
       /*
        *  Copy each section of the table over. This has to be performed as
        *  separate parts as size of each block has changed.
@@ -205,13 +194,17 @@ void _Objects_Extend_information(
         information->inactive_per_block,
         block_count * sizeof( *inactive_per_block )
       );
-      memcpy(
-        local_table,
-        information->local_table,
-        old_maximum * sizeof( *local_table )
-      );
+    } else {
+      object_blocks[ 0 ] = NULL;
+      inactive_per_block[ 0 ] = 0;
     }
 
+    memcpy(
+      local_table,
+      information->local_table,
+      old_maximum * sizeof( *local_table )
+    );
+
     /*
      *  Initialise the new entries in the table.
      */
diff --git a/cpukit/score/src/objectfree.c b/cpukit/score/src/objectfree.c
index 38ae17d739..c9af8ba7cf 100644
--- a/cpukit/score/src/objectfree.c
+++ b/cpukit/score/src/objectfree.c
@@ -38,21 +38,24 @@ void _Objects_Free(
 
     objects_per_block = information->objects_per_block;
     block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM;
-    block /= objects_per_block;
 
-    ++information->inactive_per_block[ block ];
+    if ( block > objects_per_block ) {
+      block /= objects_per_block;
 
-    inactive = information->inactive;
-    ++inactive;
-    information->inactive = inactive;
+      ++information->inactive_per_block[ block ];
 
-    /*
-     *  Check if the threshold level has been met of
-     *  1.5 x objects_per_block are free.
-     */
+      inactive = information->inactive;
+      ++inactive;
+      information->inactive = inactive;
 
-    if ( inactive > ( objects_per_block + ( objects_per_block >> 1 ) ) ) {
-      _Objects_Shrink_information( information );
+      /*
+       *  Check if the threshold level has been met of
+       *  1.5 x objects_per_block are free.
+       */
+
+      if ( inactive > ( objects_per_block + ( objects_per_block >> 1 ) ) ) {
+        _Objects_Shrink_information( information );
+      }
     }
   }
 }
diff --git a/cpukit/score/src/objectinitializeinformation.c b/cpukit/score/src/objectinitializeinformation.c
index 57e588ad4a..0b2fa2ad0f 100644
--- a/cpukit/score/src/objectinitializeinformation.c
+++ b/cpukit/score/src/objectinitializeinformation.c
@@ -24,83 +24,50 @@
 #include <rtems/score/sysstate.h>
 #include <rtems/score/wkspace.h>
 
-void _Objects_Do_initialize_information(
-  Objects_Information *information,
-  Objects_APIs         the_api,
-  uint16_t             the_class,
-  uint32_t             maximum,
-  uint16_t             object_size,
-  uint16_t             maximum_name_length
-#if defined(RTEMS_MULTIPROCESSING)
-  ,
-  Objects_Thread_queue_Extract_callout extract
-#endif
+void _Objects_Initialize_information(
+  Objects_Information *information
 )
 {
-  Objects_Maximum maximum_per_allocation;
-
-  maximum_per_allocation = _Objects_Maximum_per_allocation( maximum );
-  information->maximum_id = _Objects_Build_id(
-    the_api,
-    the_class,
-    _Objects_Local_node,
-    maximum_per_allocation
-  );
-  information->object_size = object_size;
+  Objects_Id       maximum_id;
+  Objects_Id       api_class_and_node;
+  Objects_Maximum  maximum;
+  Objects_Maximum  index;
+  Chain_Node      *head;
+  Chain_Node      *tail;
+  Chain_Node      *current;
+  Objects_Control *next;
 
-  /*
-   *  Register this Object Class in the Object Information Table.
-   */
-  _Objects_Information_table[ the_api ][ the_class ] = information;
-
-  /*
-   *  Are we operating in limited or unlimited (e.g. auto-extend) mode.
-   */
-  if ( _Objects_Is_unlimited( maximum ) ) {
-    /*
-     *  Unlimited and maximum of zero is illogical.
-     */
-    if ( maximum_per_allocation == 0) {
-      _Internal_error( INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0 );
-    }
+  maximum_id = information->maximum_id;
 
-    /*
-     *  The allocation unit is the maximum value
-     */
-    information->objects_per_block = maximum_per_allocation;
-  }
+#if defined(RTEMS_MULTIPROCESSING)
+  maximum_id |= _Objects_Local_node << OBJECTS_NODE_START_BIT;
+  information->maximum_id = maximum_id;
+#endif
 
+  maximum = _Objects_Get_index( maximum_id );
+  api_class_and_node = maximum_id & ~OBJECTS_INDEX_MASK;
 
   /*
-   *  Calculate the maximum name length
-   *
-   *  NOTE: Either 4 bytes for Classic API names or an arbitrary
-   *        number for POSIX names which are strings that may be
-   *        an odd number of bytes.
+   *  Register this Object Class in the Object Information Table.
    */
+  _Objects_Information_table[ _Objects_Get_API( maximum_id ) ]
+    [ _Objects_Get_class( maximum_id ) ] = information;
 
-  information->name_length = maximum_name_length;
+  head = _Chain_Head( &information->Inactive );
+  tail = _Chain_Tail( &information->Inactive );
+  current = head;
+  next = information->initial_objects;
 
-  _Chain_Initialize_empty( &information->Inactive );
+  head->previous = NULL;
 
-  /*
-   *  Initialize objects .. if there are any
-   */
-  if ( maximum_per_allocation ) {
-    /*
-     *  Always have the maximum size available so the current performance
-     *  figures are create are met.  If the user moves past the maximum
-     *  number then a performance hit is taken.
-     */
-    _Objects_Extend_information( information );
+  for ( index = OBJECTS_INDEX_MINIMUM; index <= maximum ; ++index ) {
+    current->next = &next->Node;
+    next->Node.previous = current;
+    current = &next->Node;
+    next->id = api_class_and_node | ( index << OBJECTS_INDEX_START_BIT );
+    next = _Addresses_Add_offset( next, information->object_size );
   }
 
-  /*
-   *  Take care of multiprocessing
-   */
-  #if defined(RTEMS_MULTIPROCESSING)
-    information->extract = extract;
-    _RBTree_Initialize_empty( &information->Global_by_id );
-    _RBTree_Initialize_empty( &information->Global_by_name );
-  #endif
+  current->next = tail;
+  tail->previous = current;
 }
diff --git a/cpukit/score/src/objectshrinkinformation.c b/cpukit/score/src/objectshrinkinformation.c
index 5a53be9979..964f3f5ef6 100644
--- a/cpukit/score/src/objectshrinkinformation.c
+++ b/cpukit/score/src/objectshrinkinformation.c
@@ -33,6 +33,7 @@ void _Objects_Shrink_information(
   Objects_Maximum index_base;
 
   _Assert( _Objects_Allocator_is_owner() );
+  _Assert( _Objects_Is_auto_extend( information ) );
 
   /*
    * Search the list to find block or chunk with all objects inactive.
@@ -40,9 +41,9 @@ void _Objects_Shrink_information(
 
   objects_per_block = information->objects_per_block;
   block_count = _Objects_Get_maximum_index( information ) / objects_per_block;
-  index_base = 0;
+  index_base = objects_per_block;
 
-  for ( block = 0; block < block_count; block++ ) {
+  for ( block = 1; block < block_count; block++ ) {
     if ( information->inactive_per_block[ block ] == objects_per_block ) {
       Chain_Node       *node;
       const Chain_Node *tail;
diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c
index 5c27ee00ef..def50b14a6 100644
--- a/cpukit/score/src/thread.c
+++ b/cpukit/score/src/thread.c
@@ -20,6 +20,7 @@
 
 #include <rtems/score/threadimpl.h>
 #include <rtems/score/interr.h>
+#include <rtems/score/objectimpl.h>
 #include <rtems/score/scheduler.h>
 #include <rtems/score/wkspace.h>
 
@@ -43,30 +44,15 @@ THREAD_OFFSET_ASSERT( Timer );
 THREAD_OFFSET_ASSERT( receive_packet );
 #endif
 
-Thread_Information _Thread_Internal_information;
-
-void _Thread_Initialize_information(
-  Thread_Information  *information,
-  Objects_APIs         the_api,
-  uint16_t             the_class,
-  uint32_t             maximum
-)
+void _Thread_Initialize_information( Thread_Information *information )
 {
-  _Objects_Initialize_information(
-    &information->Objects,
-    the_api,
-    the_class,
-    maximum,
-    _Thread_Control_size,
-    OBJECTS_NO_STRING_NAME,
-    NULL
-  );
+  _Objects_Initialize_information( &information->Objects );
 
   _Freechain_Initialize(
     &information->Free_thread_queue_heads,
-    _Workspace_Allocate_or_fatal_error,
-    _Objects_Maximum_per_allocation( maximum ),
-    THREAD_QUEUE_HEADS_SIZE( _Scheduler_Count )
+    information->Free_thread_queue_heads.Free.Head.Node.next,
+    _Objects_Get_maximum_index( &information->Objects ),
+    _Thread_queue_Heads_size
   );
 }
 
@@ -95,11 +81,5 @@ void _Thread_Handler_initialization(void)
    *  per CPU in an SMP system.  In addition, if this is a loosely
    *  coupled multiprocessing system, account for the MPCI Server Thread.
    */
-  _Thread_Initialize_information(
-    &_Thread_Internal_information,
-    OBJECTS_INTERNAL_API,
-    OBJECTS_INTERNAL_THREADS,
-    _Thread_Get_maximum_internal_threads()
-  );
-
+  _Thread_Initialize_information( &_Thread_Information );
 }
diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c
index d8dd2b4197..cdb2b1eebd 100644
--- a/cpukit/score/src/threadcreateidle.c
+++ b/cpukit/score/src/threadcreateidle.c
@@ -51,7 +51,7 @@ static void _Thread_Create_idle_for_CPU( Per_CPU_Control *cpu )
   _Assert( idle != NULL );
 
   _Thread_Initialize(
-    &_Thread_Internal_information,
+    &_Thread_Information,
     idle,
     scheduler,
     NULL,        /* allocate the stack */
diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
index df526e9a8e..f3b8d896d2 100644
--- a/cpukit/score/src/threadinitialize.c
+++ b/cpukit/score/src/threadinitialize.c
@@ -148,7 +148,7 @@ bool _Thread_Initialize(
     &information->Free_thread_queue_heads,
     _Workspace_Allocate,
     _Objects_Extend_size( &information->Objects ),
-    THREAD_QUEUE_HEADS_SIZE( _Scheduler_Count )
+    _Thread_queue_Heads_size
   );
   if ( the_thread->Wait.spare_heads == NULL ) {
     goto failed;
diff --git a/cpukit/score/src/wkspace.c b/cpukit/score/src/wkspace.c
index c9df793526..95c4127056 100644
--- a/cpukit/score/src/wkspace.c
+++ b/cpukit/score/src/wkspace.c
@@ -42,24 +42,6 @@ RTEMS_LINKER_RWSET(
 
 Heap_Control _Workspace_Area;
 
-static uint32_t _Workspace_Get_maximum_thread_count( void )
-{
-  uint32_t thread_count;
-
-  thread_count = 0;
-  thread_count += _Thread_Get_maximum_internal_threads();
-
-  thread_count += rtems_resource_maximum_per_allocation(
-    Configuration_RTEMS_API.maximum_tasks
-  );
-
-  thread_count += rtems_resource_maximum_per_allocation(
-    _Configuration_POSIX_Maximum_threads
-  );
-
-  return thread_count;
-}
-
 static uintptr_t _Workspace_Space_for_TLS( uintptr_t page_size )
 {
   uintptr_t tls_size;
@@ -86,7 +68,7 @@ static uintptr_t _Workspace_Space_for_TLS( uintptr_t page_size )
      */
     space = _Heap_Min_block_size( page_size );
 
-    space += _Workspace_Get_maximum_thread_count()
+    space += _Thread_Initial_thread_count
       * _Heap_Size_with_overhead( page_size, tls_alloc, tls_align );
   } else {
     space = 0;
diff --git a/testsuites/psxtests/psxobj01/init.c b/testsuites/psxtests/psxobj01/init.c
index 52cad3462d..ba1e327ea5 100644
--- a/testsuites/psxtests/psxobj01/init.c
+++ b/testsuites/psxtests/psxobj01/init.c
@@ -22,15 +22,18 @@
 
 const char rtems_test_name[] = "PSXOBJ 1";
 
-/* forward declarations to avoid warnings */
-rtems_task Init(rtems_task_argument ignored);
+typedef struct {
+  Objects_Control Object;
+} Test_Control;
 
-rtems_task Init(
+/* very fake object class to test with */
+OBJECTS_INFORMATION_DEFINE( Test, 1, 4, Test_Control, 0, 10, NULL );
+
+static rtems_task Init(
   rtems_task_argument ignored
 )
 {
   Objects_Get_by_name_error  error;
-  Objects_Information        TestClass;
   Objects_Control           *the_object;
   char                       name[64];
   size_t                     name_len;
@@ -38,21 +41,9 @@ rtems_task Init(
 
   TEST_BEGIN();
 
-  /* very fake object class to test with */
-  _Objects_Initialize_information(
-    &TestClass,
-    1,           /* the_api */
-    4,           /* the_class */
-    0,           /* maximum */
-    4,           /* size */
-    10,          /* maximum_name_length */
-    NULL         /* Objects_Thread_queue_Extract_callout extract */
-  );
-
-
   puts( "INIT - _Objects_Get_by_name - NULL name" );
   _Objects_Allocator_lock();
-  the_object = _Objects_Get_by_name( &TestClass, NULL, NULL, &error );
+  the_object = _Objects_Get_by_name( &Test_Information, NULL, NULL, &error );
   _Objects_Allocator_unlock();
   rtems_test_assert( the_object == NULL );
   rtems_test_assert( error == OBJECTS_GET_BY_NAME_INVALID_NAME );
@@ -60,7 +51,7 @@ rtems_task Init(
   puts( "INIT - _Objects_Get_by_name - name too long" );
   strcpy( name, "TOOOOOOOOOOOOOOOOOO LONG" );
   _Objects_Allocator_lock();
-  the_object = _Objects_Get_by_name( &TestClass, name, NULL, &error );
+  the_object = _Objects_Get_by_name( &Test_Information, name, NULL, &error );
   _Objects_Allocator_unlock();
   rtems_test_assert( the_object == NULL );
   rtems_test_assert( error == OBJECTS_GET_BY_NAME_NAME_TOO_LONG );
@@ -69,7 +60,7 @@ rtems_task Init(
   strcpy( name, "NOT FOUND" );
   name_len = 123;
   _Objects_Allocator_lock();
-  the_object = _Objects_Get_by_name( &TestClass, name, &name_len, &error );
+  the_object = _Objects_Get_by_name( &Test_Information, name, &name_len, &error );
   _Objects_Allocator_unlock();
   rtems_test_assert( the_object == NULL );
   rtems_test_assert( error == OBJECTS_GET_BY_NAME_NO_OBJECT );
@@ -79,7 +70,11 @@ rtems_task Init(
   puts( "INIT - _Objects_Set_name fails - out of memory" );
   rtems_workspace_greedy_allocate( NULL, 0 );
 
-  bc = _Objects_Set_name( &TestClass, &_Thread_Get_executing()->Object, name );
+  bc = _Objects_Set_name(
+    &Test_Information,
+    &_Thread_Get_executing()->Object,
+    name
+  );
   rtems_test_assert( bc == false );
 
   TEST_END();
diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
index 80680dfe83..8f92873d2b 100644
--- a/testsuites/sptests/Makefile.am
+++ b/testsuites/sptests/Makefile.am
@@ -985,16 +985,6 @@ spfatal12_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_spfatal12) \
 	$(support_includes) -I$(top_srcdir)/spfatal12
 endif
 
-if TEST_spfatal13
-sp_tests += spfatal13
-sp_screens += spfatal13/spfatal13.scn
-sp_docs += spfatal13/spfatal13.doc
-spfatal13_SOURCES = spfatal_support/init.c spfatal_support/system.h \
-	spfatal13/testcase.h
-spfatal13_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_spfatal13) \
-	$(support_includes) -I$(top_srcdir)/spfatal13
-endif
-
 if TEST_spfatal14
 sp_tests += spfatal14
 sp_screens += spfatal14/spfatal14.scn
diff --git a/testsuites/sptests/configure.ac b/testsuites/sptests/configure.ac
index e725b39067..d25d9e9e32 100644
--- a/testsuites/sptests/configure.ac
+++ b/testsuites/sptests/configure.ac
@@ -146,7 +146,6 @@ RTEMS_TEST_CHECK([spfatal09])
 RTEMS_TEST_CHECK([spfatal10])
 RTEMS_TEST_CHECK([spfatal11])
 RTEMS_TEST_CHECK([spfatal12])
-RTEMS_TEST_CHECK([spfatal13])
 RTEMS_TEST_CHECK([spfatal14])
 RTEMS_TEST_CHECK([spfatal15])
 RTEMS_TEST_CHECK([spfatal16])
diff --git a/testsuites/sptests/spfatal13/spfatal13.doc b/testsuites/sptests/spfatal13/spfatal13.doc
deleted file mode 100644
index e47ee27d12..0000000000
--- a/testsuites/sptests/spfatal13/spfatal13.doc
+++ /dev/null
@@ -1,19 +0,0 @@
-#  COPYRIGHT (c) 1989-2009.
-#  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.
-#
-
-This file describes the directives and concepts tested by this test set.
-
-test set name:  fatal 13
-
-directives:
-  initialization focued on _Objects_Initialize
-
-concepts:
-
-  a.  Verify that the combination of maximum of 0 and unlimited is
-      detected.
diff --git a/testsuites/sptests/spfatal13/spfatal13.scn b/testsuites/sptests/spfatal13/spfatal13.scn
deleted file mode 100644
index 27c0dba42e..0000000000
--- a/testsuites/sptests/spfatal13/spfatal13.scn
+++ /dev/null
@@ -1,3 +0,0 @@
-*** TEST FATAL 13 ***
-Fatal error (Configuration of unlimited and maximum of 0) hit
-*** END OF TEST FATAL 13 ***
diff --git a/testsuites/sptests/spfatal13/testcase.h b/testsuites/sptests/spfatal13/testcase.h
deleted file mode 100644
index 6f82689958..0000000000
--- a/testsuites/sptests/spfatal13/testcase.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*  Test __assert_func with NULL function name
- *
- *  COPYRIGHT (c) 1989-2010.
- *  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.
- */
-
-#define FATAL_ERROR_TEST_NAME            "13"
-#define FATAL_ERROR_DESCRIPTION  \
-        "Configuration of unlimited and maximum of 0"
-#define FATAL_ERROR_EXPECTED_SOURCE      INTERNAL_ERROR_CORE
-#define FATAL_ERROR_EXPECTED_ERROR     INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0
-
-/*
- *  Actual object does not matter.  Important thing is zero and unlimited.
- */
-#define CONFIGURE_MAXIMUM_PARTITIONS rtems_resource_unlimited(0)
-
-void force_error()
-{
-  /* we should not run this far */
-  rtems_partition_create(0, NULL, 0, 0, 0, NULL);
-}
diff --git a/testsuites/sptests/spfreechain01/init.c b/testsuites/sptests/spfreechain01/init.c
index 60388101ea..22730793a4 100644
--- a/testsuites/sptests/spfreechain01/init.c
+++ b/testsuites/sptests/spfreechain01/init.c
@@ -25,13 +25,16 @@ static rtems_task Init(rtems_task_argument ignored)
 {
     Freechain_Control fc;
     test_node *node;
+    test_node node2;
 
     TEST_BEGIN();
 
-    _Freechain_Initialize(&fc, NULL, 0, sizeof(test_node));
-    rtems_test_assert(_Chain_Is_empty(&fc.Free));
+    _Freechain_Initialize(&fc, &node2, 1, sizeof(node2));
+    rtems_test_assert(_Chain_Node_count_unprotected(&fc.Free) == 1);
+    rtems_test_assert(_Chain_First(&fc.Free) == &node2.Node);
+    rtems_test_assert(_Chain_Last(&fc.Free) == &node2.Node);
 
-    _Freechain_Initialize(&fc, malloc, 1, SIZE_MAX);
+    _Freechain_Initialize(&fc, NULL, 0, sizeof(test_node));
     rtems_test_assert(_Chain_Is_empty(&fc.Free));
 
     rtems_test_assert(_Freechain_Get(&fc, NULL, 0, sizeof(test_node)) == NULL);
diff --git a/testsuites/sptests/spsimplesched02/init.c b/testsuites/sptests/spsimplesched02/init.c
index f683a7dd90..b7b1a21919 100644
--- a/testsuites/sptests/spsimplesched02/init.c
+++ b/testsuites/sptests/spsimplesched02/init.c
@@ -81,7 +81,7 @@ rtems_task Init(
   TEST_BEGIN();
 
   status = _Objects_Name_to_id_u32(
-    &_Thread_Internal_information.Objects,
+    &_Thread_Information.Objects,
     rtems_build_name( 'I', 'D', 'L', 'E' ),
     RTEMS_SEARCH_LOCAL_NODE,
     &Idle_id
diff --git a/testsuites/sptests/spsize/size.c b/testsuites/sptests/spsize/size.c
index 951cdd7414..671ecd7197 100644
--- a/testsuites/sptests/spsize/size.c
+++ b/testsuites/sptests/spsize/size.c
@@ -368,7 +368,7 @@ uninitialized =
 #if (CPU_HARDWARE_FP == 1) || (CPU_SOFTWARE_FP == 1)
                 (sizeof _Thread_Allocated_fp)             +
 #endif
-                (sizeof _Thread_Internal_information)     +
+                (sizeof _Thread_Information)     +
 
 /*threadq.h*/
 
diff --git a/testsuites/sptests/spsysinit01/init.c b/testsuites/sptests/spsysinit01/init.c
index 6d0c431a85..7e187c423e 100644
--- a/testsuites/sptests/spsysinit01/init.c
+++ b/testsuites/sptests/spsysinit01/init.c
@@ -19,12 +19,18 @@
 #include "tmacros.h"
 
 #include <sys/types.h>
+#include <sys/mman.h>
 #include <sys/stat.h>
 
 #include <assert.h>
+#include <fcntl.h>
+#include <mqueue.h>
 #include <pthread.h>
-#include <string.h>
+#include <semaphore.h>
+#include <signal.h>
 #include <stdlib.h>
+#include <string.h>
+#include <time.h>
 #include <unistd.h>
 
 #include <rtems.h>
@@ -188,6 +194,16 @@ static void next_step(init_step expected)
   step = expected + 1;
 }
 
+static bool info_not_init(const Objects_Information *info)
+{
+  return _Chain_Is_empty(&info->Inactive);
+}
+
+static bool info_is_init(const Objects_Information *info, size_t count)
+{
+  return _Chain_Node_count_unprotected(&info->Inactive) == count;
+}
+
 FIRST(RTEMS_SYSINIT_BSP_WORK_AREAS)
 {
   assert(_Workspace_Area.area_begin == 0);
@@ -248,53 +264,49 @@ LAST(RTEMS_SYSINIT_INITIAL_EXTENSIONS)
 
 FIRST(RTEMS_SYSINIT_DATA_STRUCTURES)
 {
-  assert(
-    _Objects_Get_maximum_index(&_Thread_Internal_information.Objects) == 0
-  );
+  assert(info_not_init(&_Thread_Information.Objects));
   next_step(DATA_STRUCTURES_PRE);
 }
 
 LAST(RTEMS_SYSINIT_DATA_STRUCTURES)
 {
-  assert(
-    _Objects_Get_maximum_index(&_Thread_Internal_information.Objects) != 0
-  );
+  assert(info_is_init(&_Thread_Information.Objects, 1));
   next_step(DATA_STRUCTURES_POST);
 }
 
 FIRST(RTEMS_SYSINIT_USER_EXTENSIONS)
 {
-  assert(_Objects_Get_maximum_index(&_Extension_Information) == 0);
+  assert(info_not_init(&_Extension_Information));
   next_step(USER_EXTENSIONS_PRE);
 }
 
 LAST(RTEMS_SYSINIT_USER_EXTENSIONS)
 {
-  assert(_Objects_Get_maximum_index(&_Extension_Information) != 0);
+  assert(info_is_init(&_Extension_Information, 1));
   next_step(USER_EXTENSIONS_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_TASKS)
 {
-  assert(_Objects_Get_maximum_index(&_RTEMS_tasks_Information.Objects) == 0);
+  assert(info_not_init(&_RTEMS_tasks_Information.Objects));
   next_step(CLASSIC_TASKS_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_TASKS)
 {
-  assert(_Objects_Get_maximum_index(&_RTEMS_tasks_Information.Objects) != 0);
+  assert(info_is_init(&_RTEMS_tasks_Information.Objects, 2));
   next_step(CLASSIC_TASKS_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_TIMER)
 {
-  assert(_Objects_Get_maximum_index(&_Timer_Information) == 0);
+  assert(info_not_init(&_Timer_Information));
   next_step(CLASSIC_TIMER_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_TIMER)
 {
-  assert(_Objects_Get_maximum_index(&_Timer_Information) != 0);
+  assert(info_is_init(&_Timer_Information, 1));
   next_step(CLASSIC_TIMER_POST);
 }
 
@@ -322,85 +334,85 @@ LAST(RTEMS_SYSINIT_CLASSIC_EVENT)
 
 FIRST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
 {
-  assert(_Objects_Get_maximum_index(&_Message_queue_Information) == 0);
+  assert(info_not_init(&_Message_queue_Information));
   next_step(CLASSIC_MESSAGE_QUEUE_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
 {
-  assert(_Objects_Get_maximum_index(&_Message_queue_Information) != 0);
+  assert(info_is_init(&_Message_queue_Information, 1));
   next_step(CLASSIC_MESSAGE_QUEUE_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
 {
-  assert(_Objects_Get_maximum_index(&_Semaphore_Information) == 0);
+  assert(_Semaphore_Information.initial_objects[0].id == 0);
   next_step(CLASSIC_SEMAPHORE_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
 {
-  assert(_Objects_Get_maximum_index(&_Semaphore_Information) != 0);
+  assert(_Semaphore_Information.initial_objects[0].id != 0);
   next_step(CLASSIC_SEMAPHORE_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_PARTITION)
 {
-  assert(_Objects_Get_maximum_index(&_Partition_Information) == 0);
+  assert(info_not_init(&_Partition_Information));
   next_step(CLASSIC_PARTITION_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_PARTITION)
 {
-  assert(_Objects_Get_maximum_index(&_Partition_Information) != 0);
+  assert(info_is_init(&_Partition_Information, 1));
   next_step(CLASSIC_PARTITION_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_REGION)
 {
-  assert(_Objects_Get_maximum_index(&_Region_Information) == 0);
+  assert(info_not_init(&_Region_Information));
   next_step(CLASSIC_REGION_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_REGION)
 {
-  assert(_Objects_Get_maximum_index(&_Region_Information) != 0);
+  assert(info_is_init(&_Region_Information, 1));
   next_step(CLASSIC_REGION_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
 {
-  assert(_Objects_Get_maximum_index(&_Dual_ported_memory_Information) == 0);
+  assert(info_not_init(&_Dual_ported_memory_Information));
   next_step(CLASSIC_DUAL_PORTED_MEMORY_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
 {
-  assert(_Objects_Get_maximum_index(&_Dual_ported_memory_Information) != 0);
+  assert(info_is_init(&_Dual_ported_memory_Information, 1));
   next_step(CLASSIC_DUAL_PORTED_MEMORY_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
 {
-  assert(_Objects_Get_maximum_index(&_Rate_monotonic_Information) == 0);
+  assert(info_not_init(&_Rate_monotonic_Information));
   next_step(CLASSIC_RATE_MONOTONIC_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
 {
-  assert(_Objects_Get_maximum_index(&_Rate_monotonic_Information) != 0);
+  assert(info_is_init(&_Rate_monotonic_Information, 1));
   next_step(CLASSIC_RATE_MONOTONIC_POST);
 }
 
 FIRST(RTEMS_SYSINIT_CLASSIC_BARRIER)
 {
-  assert(_Objects_Get_maximum_index(&_Barrier_Information) == 0);
+  assert(info_not_init(&_Barrier_Information));
   next_step(CLASSIC_BARRIER_PRE);
 }
 
 LAST(RTEMS_SYSINIT_CLASSIC_BARRIER)
 {
-  assert(_Objects_Get_maximum_index(&_Barrier_Information) != 0);
+  assert(info_is_init(&_Barrier_Information, 1));
   next_step(CLASSIC_BARRIER_POST);
 }
 
@@ -432,63 +444,63 @@ LAST(RTEMS_SYSINIT_POSIX_SIGNALS)
 
 FIRST(RTEMS_SYSINIT_POSIX_THREADS)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Threads_Information.Objects) == 0);
+  assert(info_not_init(&_POSIX_Threads_Information.Objects));
   next_step(POSIX_THREADS_PRE);
 }
 
 LAST(RTEMS_SYSINIT_POSIX_THREADS)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Threads_Information.Objects) != 0);
+  assert(info_is_init(&_POSIX_Threads_Information.Objects, 1));
   next_step(POSIX_THREADS_POST);
 }
 
 FIRST(RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Message_queue_Information) == 0);
+  assert(info_not_init(&_POSIX_Message_queue_Information));
   next_step(POSIX_MESSAGE_QUEUE_PRE);
 }
 
 LAST(RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Message_queue_Information) != 0);
+  assert(info_is_init(&_POSIX_Message_queue_Information, 1));
   next_step(POSIX_MESSAGE_QUEUE_POST);
 }
 
 FIRST(RTEMS_SYSINIT_POSIX_SEMAPHORE)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Semaphore_Information) == 0);
+  assert(info_not_init(&_POSIX_Semaphore_Information));
   next_step(POSIX_SEMAPHORE_PRE);
 }
 
 LAST(RTEMS_SYSINIT_POSIX_SEMAPHORE)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Semaphore_Information) != 0);
+  assert(info_is_init(&_POSIX_Semaphore_Information, 1));
   next_step(POSIX_SEMAPHORE_POST);
 }
 
 #ifdef RTEMS_POSIX_API
 FIRST(RTEMS_SYSINIT_POSIX_TIMER)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Timer_Information) == 0);
+  assert(info_not_init(&_POSIX_Timer_Information));
   next_step(POSIX_TIMER_PRE);
 }
 
 LAST(RTEMS_SYSINIT_POSIX_TIMER)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Timer_Information) != 0);
+  assert(info_is_init(&_POSIX_Timer_Information, 1));
   next_step(POSIX_TIMER_POST);
 }
 #endif /* RTEMS_POSIX_API */
 
 FIRST(RTEMS_SYSINIT_POSIX_SHM)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Shm_Information) == 0);
+  assert(info_not_init(&_POSIX_Shm_Information));
   next_step(POSIX_SHM_PRE);
 }
 
 LAST(RTEMS_SYSINIT_POSIX_SHM)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Shm_Information) != 0);
+  assert(info_is_init(&_POSIX_Shm_Information, 1));
   next_step(POSIX_SHM_POST);
 }
 
@@ -512,13 +524,13 @@ LAST(RTEMS_SYSINIT_POSIX_CLEANUP)
 
 FIRST(RTEMS_SYSINIT_POSIX_KEYS)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Keys_Information) == 0);
+  assert(info_not_init(&_POSIX_Keys_Information));
   next_step(POSIX_KEYS_PRE);
 }
 
 LAST(RTEMS_SYSINIT_POSIX_KEYS)
 {
-  assert(_Objects_Get_maximum_index(&_POSIX_Keys_Information) != 0);
+  assert(info_is_init(&_POSIX_Keys_Information, 2));
   next_step(POSIX_KEYS_POST);
 }
 
@@ -657,11 +669,268 @@ LAST_STEP(TENTH);
 LAST_STEP(MIDDLE);
 LAST_STEP(LAST);
 
-static void Init(rtems_task_argument arg)
+static void do_barrier_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+
+  sc = rtems_barrier_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    RTEMS_DEFAULT_ATTRIBUTES,
+    1,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_barrier_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_extensions_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+  rtems_extensions_table table;
+
+  memset(&table, 0, sizeof(table));
+  sc = rtems_extension_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    &table,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_extension_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_message_queue_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+
+  sc = rtems_message_queue_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    1,
+    1,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_message_queue_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_partition_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+  long buf[32];
+
+  sc = rtems_partition_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    buf,
+    sizeof(buf),
+    sizeof(buf),
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_partition_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_period_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+
+  sc = rtems_rate_monotonic_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_rate_monotonic_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_port_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+
+  sc = rtems_port_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    NULL,
+    NULL,
+    1,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_port_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_region_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+  long buf[32];
+
+  sc = rtems_region_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    buf,
+    sizeof(buf),
+    1,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_region_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_semaphore_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+
+  sc = rtems_semaphore_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    0,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    0,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_semaphore_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_task_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+
+  sc = rtems_task_create(
+    rtems_build_name('T', 'E', 'S', 'T'),
+    1,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &id
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_task_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_timer_create(void)
+{
+  rtems_status_code sc;
+  rtems_id id;
+
+  sc = rtems_timer_create(rtems_build_name('T', 'E', 'S', 'T'), &id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_timer_delete(id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
+
+static void do_cleanup_push_pop(void)
 {
   pthread_cleanup_push(NULL, NULL);
   pthread_cleanup_pop(0);
+}
+
+static void do_posix_mq_open(void)
+{
+  struct mq_attr attr;
+  mqd_t mq;
+  int rv;
+
+  memset(&attr, 0, sizeof(attr));
+  attr.mq_maxmsg = 1;
+  attr.mq_msgsize = 1;
+  mq = mq_open("mq", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO, &attr);
+  rtems_test_assert(mq != (mqd_t) -1);
+
+  rv = mq_close(mq);
+  rtems_test_assert(rv == 0);
+
+  rv = mq_unlink("mq");
+  rtems_test_assert(rv == 0);
+}
+
+static void do_posix_sem_open(void)
+{
+  sem_t *sem;
+  int rv;
+
+  sem = sem_open("sem", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO);
+  rtems_test_assert(sem != SEM_FAILED);
+
+  rv = sem_close(sem);
+  rtems_test_assert(rv == 0);
+
+  rv = sem_unlink("sem");
+  rtems_test_assert(rv == 0);
+}
+
+static void do_posix_shm_open(void)
+{
+  int fd;
+  int rv;
+
+  fd = shm_open("/shm", O_CREAT | O_RDWR, S_IRWXU | S_IRWXG | S_IRWXO);
+  rtems_test_assert(fd >= 0);
+
+  rv = close(fd);
+  rtems_test_assert(rv == 0);
+
+  rv = shm_unlink("/shm");
+  rtems_test_assert(rv == 0);
+}
+
+static void do_posix_timer_create(void)
+{
+#ifdef RTEMS_POSIX_API
+  int rv;
+  timer_t timer;
+
+  rv = timer_create(CLOCK_REALTIME, NULL, &timer);
+  rtems_test_assert(rv == 0);
+
+  rv = timer_delete(timer);
+  rtems_test_assert(rv == 0);
+#endif /* RTEMS_POSIX_API */
+}
+
+static void Init(rtems_task_argument arg)
+{
   next_step(INIT_TASK);
+  do_barrier_create();
+  do_extensions_create();
+  do_message_queue_create();
+  do_partition_create();
+  do_period_create();
+  do_port_create();
+  do_region_create();
+  do_semaphore_create();
+  do_task_create();
+  do_timer_create();
+  do_cleanup_push_pop();
+  do_posix_mq_open();
+  do_posix_sem_open();
+  do_posix_shm_open();
+  do_posix_timer_create();
   TEST_END();
   exit(0);
 }
@@ -672,8 +941,11 @@ static void *POSIX_Init(void *arg)
 }
 
 #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
+
 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
 
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
+
 #define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
 
 #define CONFIGURE_MAXIMUM_BARRIERS 1
@@ -690,7 +962,7 @@ static void *POSIX_Init(void *arg)
 
 #define CONFIGURE_MAXIMUM_SEMAPHORES 1
 
-#define CONFIGURE_MAXIMUM_TASKS 1
+#define CONFIGURE_MAXIMUM_TASKS 2
 
 #define CONFIGURE_MAXIMUM_TIMERS 1
 
@@ -710,6 +982,9 @@ static void *POSIX_Init(void *arg)
 
 #define CONFIGURE_MAXIMUM_POSIX_KEYS 1
 
+#define CONFIGURE_MESSAGE_BUFFER_MEMORY \
+  CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(1, 1)
+
 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
 
 #define CONFIGURE_STACK_CHECKER_ENABLED
-- 
2.16.4




More information about the devel mailing list