diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 7739222..6cd8a5a 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -32,7 +32,7 @@ include_rtems_score_HEADERS = include/rtems/score/address.h \
     include/rtems/score/timestamp64.h include/rtems/score/tod.h \
     include/rtems/score/tqdata.h include/rtems/score/userext.h \
     include/rtems/score/watchdog.h include/rtems/score/wkspace.h \
-    include/rtems/score/cpuopts.h
+    include/rtems/score/cpuopts.h include/rtems/score/sysinit.h
 
 if HAS_PTHREADS
 include_rtems_score_HEADERS += include/rtems/score/corespinlock.h \
@@ -197,6 +197,9 @@ libscore_a_SOURCES += src/apiext.c src/chain.c src/chainappend.c \
     src/chainextract.c src/chainget.c src/chaininsert.c \
     src/interr.c src/isr.c src/isrthreaddispatch.c src/wkspace.c
 
+## SYSINIT_C_FILES
+libscore_a_SOURCES += src/sysinititerate.c src/sysinititeratereversed.c
+
 EXTRA_DIST = src/Unlimited.txt
 
 DISTCLEANFILES = include/rtems/score/cpuopts.h
diff --git a/cpukit/score/include/rtems/score/sysinit.h b/cpukit/score/include/rtems/score/sysinit.h
new file mode 100644
index 0000000..5ed9089
--- /dev/null
+++ b/cpukit/score/include/rtems/score/sysinit.h
@@ -0,0 +1,174 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreSysInit
+ *
+ * @brief System initialization API.
+ */
+
+/*
+ * Copyright (c) 2010 Zhang Wenjie <157724595@163.com>
+ *
+ * Copyright (c) 2010 embedded brains GmbH <rtems@embedded-brains.de>
+ *
+ *  embedded brains GmbH
+ *  Obere Lagerstr. 30
+ *  D-82178 Puchheim
+ *  Germany
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id: $
+ */
+
+#ifndef _RTEMS_SCORE_SYSINIT_H
+#define _RTEMS_SCORE_SYSINIT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup ScoreSysInit System Initialization
+ *
+ * @ingroup Score
+ *
+ * @brief System initialization.
+ *
+ * @{
+ */
+
+/**
+ * @brief Sysinit state.
+ */
+typedef enum {
+   SYSINIT_INITIALIZE,
+   SYSINIT_TERMINATE
+} Sysinit_State;
+
+/**
+ * @brief Sysinit handler type.
+ */
+typedef void ( *Sysinit_Handler )( Sysinit_State state );
+
+/**
+ * @brief Sysinit linker set entry.
+ */
+typedef struct {
+  Sysinit_Handler handler;
+} Sysinit_Entry;
+
+#define SYSINIT_MAKE_ORDER(group, index) \
+  group "." index
+
+#define SYSINIT_MAKE_INDEX(i3, i2, i1, i0) \
+  #i3 #i2 #i1 #i0
+
+#define SYSINIT_ENTRY_NAME(handler) \
+  _Sysinit_Entry_ ## handler
+
+#define SYSINIT_REFERENCE_NAME(handler) \
+  _Sysinit_Reference_ ## handler
+
+#define SYSINIT_DECLARE_ENTRY(handler) \
+  extern const Sysinit_Entry SYSINIT_ENTRY_NAME(handler)
+
+#define SYSINIT_ENTRY_WITH_INDEX(handler, group, index) \
+  SYSINIT_DECLARE_ENTRY(handler); \
+  const Sysinit_Entry SYSINIT_ENTRY_NAME(handler) \
+  __attribute__((section(".score.sysinit." SYSINIT_MAKE_ORDER(group, index)))) \
+  = { handler }
+
+#define SYSINIT_ENTRY(handler, group) \
+  SYSINIT_ENTRY_WITH_INDEX(handler, group, SYSINIT_INDEX_MIDDLE)
+
+#define SYSINIT_REFERENCE(handler) \
+  SYSINIT_DECLARE_ENTRY(handler); \
+  static const Sysinit_Entry * const SYSINIT_REFERENCE_NAME(handler) \
+  __attribute__((used)) \
+  = &SYSINIT_ENTRY_NAME(handler)
+
+/**
+ * @brief Iterates through all entries of the system initialization set.
+ *
+ * Calls each handler with the @a state parameter.
+ */
+void _Sysinit_Iterate(Sysinit_State state);
+
+/**
+ * @brief Iterates through all entries of the system initialization set in
+ * reversed order.
+ *
+ * Calls each handler with the @a state parameter.
+ */
+void _Sysinit_Iterate_reversed(Sysinit_State state);
+
+/** @} */
+
+/**
+ * @defgroup ScoreSysInitGroups Groups and Indices
+ *
+ * @ingroup ScoreSysInit
+ *
+ * @brief System initialization groups and indices.
+ *
+ * @{
+ */
+
+/**
+ * @name Groups
+ *
+ * @{
+ */
+
+#define SYSINIT_GROUP_FIRST 		"0000"
+
+/**
+ * @name Groups_sapi 
+ *
+ * @{
+ */
+#define SYSINIT_GROUP_TASK  		"0100"
+#define SYSINIT_GROUP_TIMER 		"0101"
+#define SYSINIT_GROUP_SIGNAL  	"0102"
+#define SYSINIT_GROUP_EVENT 		"0103"
+#define SYSINIT_GROUP_MESSAGE  	"0104"
+#define SYSINIT_GROUP_SEMAPHORE 	"0105"
+#define SYSINIT_GROUP_PARTITION 	"0106"
+#define SYSINIT_GROUP_REGION 		"0107"
+#define SYSINIT_GROUP_DPMEM 		"0108"
+#define SYSINIT_GROUP_RATEMON 	"0109"
+#define SYSINIT_GROUP_BARRIER 	"0110"
+/** @} */
+
+#define SYSINIT_GROUP_LAST 		"9999"
+
+/** @} */
+
+/**
+ * @name Indices
+ *
+ * @{
+ */
+
+#define SYSINIT_INDEX_FIRST SYSINIT_MAKE_INDEX(0, 0, 0, 0)
+#define SYSINIT_INDEX_MIDDLE SYSINIT_MAKE_INDEX(5, 0, 0, 0)
+#define SYSINIT_INDEX_LAST SYSINIT_MAKE_INDEX(9, 9, 9, 9)
+
+/** @} */
+
+/** @} */
+
+/**
+ * @brief System initialization link set start and end.
+ */
+extern const Sysinit_Entry *const _Sysinit_Entry_set_begin [];
+extern const Sysinit_Entry *const _Sysinit_Entry_set_end [];
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_SCORE_SYSINIT_H */
diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am
index da6f308..13b836e 100644
--- a/cpukit/score/preinstall.am
+++ b/cpukit/score/preinstall.am
@@ -163,6 +163,10 @@ $(PROJECT_INCLUDE)/rtems/score/cpuopts.h: include/rtems/score/cpuopts.h $(PROJEC
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/cpuopts.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpuopts.h
 
+$(PROJECT_INCLUDE)/rtems/score/sysinit.h: include/rtems/score/sysinit.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/sysinit.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/sysinit.h
+
 if HAS_PTHREADS
 $(PROJECT_INCLUDE)/rtems/score/corespinlock.h: include/rtems/score/corespinlock.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/corespinlock.h
diff --git a/cpukit/score/src/sysinititerate.c b/cpukit/score/src/sysinititerate.c
new file mode 100644
index 0000000..cfcffb9
--- /dev/null
+++ b/cpukit/score/src/sysinititerate.c
@@ -0,0 +1,43 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreSysInit
+ *
+ * @brief Iterate system initialization set handler.
+ */
+
+/*
+ * Copyright (c) 2010 Zhang Wenjie <157724595@163.com>
+ *
+ * Copyright (c) 2010 embedded brains GmbH <rtems@embedded-brains.de>
+ *
+ *  embedded brains GmbH
+ *  Obere Lagerstr. 30
+ *  D-82178 Puchheim
+ *  Germany
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id: $
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/sysinit.h>
+
+/**
+ *@brief Iterates through all entries of system initialization set.
+ */
+void _Sysinit_Iterate(
+  Sysinit_State state
+)
+{
+  Sysinit_Entry *entry;
+
+  for ( entry = _Sysinit_Entry_set_begin; entry != _Sysinit_Entry_set_end; ++entry )
+    entry->handler( state );
+}
diff --git a/cpukit/score/src/sysinititeratereversed.c b/cpukit/score/src/sysinititeratereversed.c
new file mode 100644
index 0000000..17f6e1e
--- /dev/null
+++ b/cpukit/score/src/sysinititeratereversed.c
@@ -0,0 +1,44 @@
+/**
+ * @file
+ *
+ * @ingroup ScoreSysInit
+ * 
+ * @brief Iterate system initialization set in reversed order handler.
+ */
+
+/*
+ * Copyright (c) 2010 Zhang Wenjie <157724595@163.com>
+ *
+ * Copyright (c) 2010 embedded brains GmbH <rtems@embedded-brains.de>
+ *
+ *  embedded brains GmbH
+ *  Obere Lagerstr. 30
+ *  D-82178 Puchheim
+ *  Germany
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id: $
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/score/sysinit.h>
+
+/**
+ *@brief Iterates through all entries of system initialization set in reversed order.
+ */
+void _Sysinit_Iterate_reversed(
+  Sysinit_State state
+)
+{
+  Sysinit_Entry *entry;
+	
+  for ( entry = _Sysinit_Entry_set_end; entry != _Sysinit_Entry_set_begin; --entry )
+    entry->handler( state );
+
+}
