Index: cpukit/Makefile.am
===================================================================
--- cpukit/Makefile.am	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ cpukit/Makefile.am	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -855,4 +855,6 @@
 librtemscpu_a_SOURCES += score/src/memoryallocate.c
 librtemscpu_a_SOURCES += score/src/memoryfill.c
+librtemscpu_a_SOURCES += score/src/memoryzerobeforeuse.c
+librtemscpu_a_SOURCES += score/src/memoryzerofreeareas.c
 librtemscpu_a_SOURCES += score/src/objectallocate.c
 librtemscpu_a_SOURCES += score/src/objectclose.c
Index: cpukit/include/rtems/confdefs.h
===================================================================
--- cpukit/include/rtems/confdefs.h	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ cpukit/include/rtems/confdefs.h	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -2779,9 +2779,4 @@
     CONFIGURE_TASK_STACK_ALLOCATOR,           /* stack allocator */
     CONFIGURE_TASK_STACK_DEALLOCATOR,         /* stack deallocator */
-    #ifdef CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY /* true to clear memory */
-      true,
-    #else
-      false,
-    #endif
     #ifdef CONFIGURE_UNIFIED_WORK_AREAS       /* true for unified work areas */
       true,
@@ -2807,4 +2802,14 @@
     #endif
   };
+
+  #ifdef CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY
+    const bool _Memory_Zero_before_use = true;
+
+    RTEMS_SYSINIT_ITEM(
+      _Memory_Zero_free_areas,
+      RTEMS_SYSINIT_ZERO_MEMORY,
+      RTEMS_SYSINIT_ORDER_MIDDLE
+    );
+  #endif
 
   #if CONFIGURE_RECORD_PER_PROCESSOR_ITEMS > 0
Index: cpukit/include/rtems/config.h
===================================================================
--- cpukit/include/rtems/config.h	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ cpukit/include/rtems/config.h	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -30,4 +30,5 @@
 #include <rtems/score/object.h>
 #include <rtems/score/isr.h>
+#include <rtems/score/memory.h>
 #include <rtems/score/userextdata.h>
 #include <rtems/score/watchdogticks.h>
@@ -149,12 +150,4 @@
   rtems_stack_free_hook          stack_free_hook;
 
-  /** 
-   * If this element is TRUE, then RTEMS will zero the Executive Workspace.
-   * When this element is FALSE, it is assumed that the BSP or invoking
-   * environment has ensured that memory was cleared before RTEMS was
-   * invoked.
-   */
-  bool                           do_zero_of_workspace;
-
   /**
    * @brief Specifies if a unified work area is used or not.
@@ -242,5 +235,5 @@
   */
 #define rtems_configuration_get_do_zero_of_workspace() \
-   (Configuration.do_zero_of_workspace)
+  _Memory_Zero_before_use
 
 #define rtems_configuration_get_number_of_initial_extensions() \
Index: cpukit/include/rtems/score/memory.h
===================================================================
--- cpukit/include/rtems/score/memory.h	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ cpukit/include/rtems/score/memory.h	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -332,4 +332,17 @@
 void _Memory_Fill( const Memory_Information *information, int c );
 
+/**
+ * @brief Indicates if the memory is zeroed during system initialization.
+ *
+ * This value is provided via <rtems/confdefs.h> in case
+ * CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY is defined.
+ */
+extern const bool _Memory_Zero_before_use;
+
+/**
+ * @brief Zeros all free memory areas of the system.
+ */
+void _Memory_Zero_free_areas( void );
+
 /** @} */
 
Index: cpukit/include/rtems/sysinit.h
===================================================================
--- cpukit/include/rtems/sysinit.h	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ cpukit/include/rtems/sysinit.h	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2015, 2018 embedded brains GmbH.  All rights reserved.
+ * Copyright (c) 2015, 2020 embedded brains GmbH.  All rights reserved.
  *
  *  embedded brains GmbH
@@ -31,4 +31,5 @@
 #define RTEMS_SYSINIT_MEMORY                     000180
 #define RTEMS_SYSINIT_DIRTY_MEMORY               0001c0
+#define RTEMS_SYSINIT_ZERO_MEMORY                0001e0
 #define RTEMS_SYSINIT_ISR_STACK                  000200
 #define RTEMS_SYSINIT_PER_CPU_DATA               000220
Index: cpukit/sapi/src/sysinitverbose.c
===================================================================
--- cpukit/sapi/src/sysinitverbose.c	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ cpukit/sapi/src/sysinitverbose.c	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -49,4 +49,5 @@
 SYSINIT_VERBOSE( MEMORY );
 SYSINIT_VERBOSE( DIRTY_MEMORY );
+SYSINIT_VERBOSE( ZERO_MEMORY );
 SYSINIT_VERBOSE( ISR_STACK );
 SYSINIT_VERBOSE( PER_CPU_DATA );
@@ -193,7 +194,14 @@
 }
 
+static void _Sysinit_Verbose_ZERO_MEMORY( void )
+{
+  if ( !SYSINIT_IS_ADJACENT( DIRTY_MEMORY, ZERO_MEMORY ) ) {
+    printk( "sysinit: ZERO_MEMORY: done\n" );
+  }
+}
+
 static void _Sysinit_Verbose_ISR_STACK( void )
 {
-  if ( !SYSINIT_IS_ADJACENT( DIRTY_MEMORY, ISR_STACK ) ) {
+  if ( !SYSINIT_IS_ADJACENT( ZERO_MEMORY, ISR_STACK ) ) {
     printk( "sysinit: ISR_STACK: done\n" );
   }
Index: cpukit/score/src/memoryzerobeforeuse.c
===================================================================
--- cpukit/score/src/memoryzerobeforeuse.c	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
+++ cpukit/score/src/memoryzerobeforeuse.c	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -0,0 +1,34 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2020 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/score/memory.h>
+
+const bool _Memory_Zero_before_use;
Index: cpukit/score/src/memoryzerofreeareas.c
===================================================================
--- cpukit/score/src/memoryzerofreeareas.c	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
+++ cpukit/score/src/memoryzerofreeareas.c	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -0,0 +1,37 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2020 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/score/memory.h>
+
+void _Memory_Zero_free_areas( void )
+{
+  _Memory_Fill( _Memory_Get(), 0 );
+}
Index: cpukit/score/src/wkspace.c
===================================================================
--- cpukit/score/src/wkspace.c	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ cpukit/score/src/wkspace.c	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -91,5 +91,4 @@
   Heap_Initialization_or_extend_handler init_or_extend;
   uintptr_t                             remaining;
-  bool                                  do_zero;
   bool                                  unified;
   uintptr_t                             page_size;
@@ -102,5 +101,4 @@
 
   init_or_extend = _Heap_Initialize;
-  do_zero = rtems_configuration_get_do_zero_of_workspace();
   unified = rtems_configuration_get_unified_work_area();
   overhead = _Heap_Area_overhead( page_size );
@@ -112,8 +110,4 @@
     area = _Memory_Get_area( mem, i );
     free_size = _Memory_Get_free_size( area );
-
-    if ( do_zero ) {
-      memset( _Memory_Get_free_begin( area ), 0, free_size );
-    }
 
     if ( free_size > overhead ) {
Index: testsuites/sptests/sp54/init.c
===================================================================
--- testsuites/sptests/sp54/init.c	(revision 1d43a976a83f1b815ec07ce00e3db31fbd36aac4)
+++ testsuites/sptests/sp54/init.c	(revision 8ecbc3826edfbfebabf5b9b75243df8b04421073)
@@ -51,4 +51,6 @@
   fatal_directive_status( status, RTEMS_INVALID_NAME, "rtems_task_ident" );
 
+  rtems_test_assert( rtems_configuration_get_do_zero_of_workspace() );
+
   TEST_END();
   rtems_test_exit(0);
