commit c53ef0b19cb670c47c2e3d9390f62e7661659e32
Author: Thomas Schöpping <tschoepp@cit-ec.uni-bielefeld.de>
Date:   Mon Nov 11 16:33:58 2019 +0100

    MSI implemented

diff --git a/core/inc/aos_sssp.h b/core/inc/aos_sssp.h
index be5dc22..0fb8ea7 100644
--- a/core/inc/aos_sssp.h
+++ b/core/inc/aos_sssp.h
@@ -75,8 +75,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* CHECKS                                                                     */
 /******************************************************************************/
 
-#if (AMIROOS_CFG_SSSP_MSI == true)
-  #error "SSSP module stack initialization (MSI not implemented yet"
+#if (!(AMIROOS_CFG_SSSP_MODULEIDWIDTH == 8) &&                                \
+   !(AMIROOS_CFG_SSSP_MODULEIDWIDTH == 16)  &&                                \
+   !(AMIROOS_CFG_SSSP_MODULEIDWIDTH == 32)  &&                                \
+   !(AMIROOS_CFG_SSSP_MODULEIDWIDTH == 64))
+  #error "AMIROOS_CFG_SSSP_MODULEIDWIDTH set to an invalid value."
 #endif
 
 /******************************************************************************/
@@ -87,30 +90,38 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   Enumeration of the several stages of SSSP.
  */
 typedef enum {
-  AOS_SSSP_STAGE_UNDEFINED    = 0x0000, /**< Identifier of yet undefined stage variable.  */
-  AOS_SSSP_STAGE_STARTUP      = 0x1000, /**< Identifier of SSSP startup phase.            */
-  AOS_SSSP_STAGE_STARTUP_1    = 0x1100, /**< Identifier of SSSP startup phase stage 1.    */
-  AOS_SSSP_STAGE_STARTUP_1_1  = 0x1110, /**< Identifier of SSSP startup phase stage 1-1.  */
-  AOS_SSSP_STAGE_STARTUP_1_2  = 0x1120, /**< Identifier of SSSP startup phase stage 1-2.  */
-  AOS_SSSP_STAGE_STARTUP_1_3  = 0x1130, /**< Identifier of SSSP startup phase stage 1-3.  */
-  AOS_SSSP_STAGE_STARTUP_2    = 0x1200, /**< Identifier of SSSP startup phase stage 2.    */
-  AOS_SSSP_STAGE_STARTUP_2_1  = 0x1210, /**< Identifier of SSSP startup phase stage 2-1.  */
-  AOS_SSSP_STAGE_STARTUP_2_2  = 0x1220, /**< Identifier of SSSP startup phase stage 2-2.  */
-  AOS_SSSP_STAGE_STARTUP_3    = 0x1300, /**< Identifier of SSSP startup phase stage 3.    */
-  AOS_SSSP_STAGE_STARTUP_3_1  = 0x1310, /**< Identifier of SSSP startup phase stage 3-1.  */
-  AOS_SSSP_STAGE_STARTUP_3_2  = 0x1320, /**< Identifier of SSSP startup phase stage 3-2.  */
-  AOS_SSSP_STAGE_STARTUP_3_3  = 0x1330, /**< Identifier of SSSP startup phase stage 3-3.  */
-  AOS_SSSP_STAGE_STARTUP_3_4  = 0x1340, /**< Identifier of SSSP startup phase stage 3-4.  */
-  AOS_SSSP_STAGE_OPERATION    = 0x2000, /**< Identifier of SSSP operation phase.          */
-  AOS_SSSP_STAGE_SHUTDOWN     = 0x3000, /**< Identifier of SSSP shutdown phase.           */
-  AOS_SSSP_STAGE_SHUTDOWN_1   = 0x3100, /**< Identifier of SSSP shutdown phase stage 1.   */
-  AOS_SSSP_STAGE_SHUTDOWN_1_1 = 0x3110, /**< Identifier of SSSP shutdown phase stage 1-1. */
-  AOS_SSSP_STAGE_SHUTDOWN_1_2 = 0x3120, /**< Identifier of SSSP shutdown phase stage 1-2. */
-  AOS_SSSP_STAGE_SHUTDOWN_1_3 = 0x3130, /**< Identifier of SSSP shutdown phase stage 1-3. */
-  AOS_SSSP_STAGE_SHUTDOWN_2   = 0x3200, /**< Identifier of SSSP shutdown phase stage 2.   */
-  AOS_SSSP_STAGE_SHUTDOWN_2_1 = 0x3210, /**< Identifier of SSSP shutdown phase stage 2-1. */
-  AOS_SSSP_STAGE_SHUTDOWN_2_2 = 0x3220, /**< Identifier of SSSP shutdown phase stage 2-2. */
-  AOS_SSSP_STAGE_SHUTDOWN_2_3 = 0x3230, /**< Identifier of SSSP shutdown phase stage 2-3. */
+  AOS_SSSP_STAGE_UNDEFINED                    = 0x00000000, /**< Identifier of yet undefined stage variable.                                          */
+  AOS_SSSP_STAGE_STARTUP                      = 0x10000000, /**< Identifier of SSSP startup phase.                                                    */
+  AOS_SSSP_STAGE_STARTUP_1                    = 0x11000000, /**< Identifier of SSSP startup phase stage 1.                                            */
+  AOS_SSSP_STAGE_STARTUP_1_1                  = 0x11100000, /**< Identifier of SSSP startup phase stage 1-1.                                          */
+  AOS_SSSP_STAGE_STARTUP_1_2                  = 0x11200000, /**< Identifier of SSSP startup phase stage 1-2.                                          */
+  AOS_SSSP_STAGE_STARTUP_1_3                  = 0x11300000, /**< Identifier of SSSP startup phase stage 1-3.                                          */
+  AOS_SSSP_STAGE_STARTUP_2                    = 0x12000000, /**< Identifier of SSSP startup phase stage 2.                                            */
+  AOS_SSSP_STAGE_STARTUP_2_1                  = 0x12100000, /**< Identifier of SSSP startup phase stage 2-1.                                          */
+  AOS_SSSP_STAGE_STARTUP_2_2                  = 0x12200000, /**< Identifier of SSSP startup phase stage 2-2.                                          */
+  AOS_SSSP_STAGE_STARTUP_3                    = 0x13000000, /**< Identifier of SSSP startup phase stage 3.                                            */
+  AOS_SSSP_STAGE_STARTUP_3_1                  = 0x13100000, /**< Identifier of SSSP startup phase stage 3-1.                                          */
+  AOS_SSSP_STAGE_STARTUP_3_1_BROADCASTINIT    = 0x13110001, /**< Identifier of SSSP startup phase stage 3-1 broadcast initialization (master only).   */
+  AOS_SSSP_STAGE_STARTUP_3_1_WAITFORINIT      = 0x13110002, /**< Identifier of SSSP startup phase stage 3-1 waiting for broadcast (non-master only).  */
+  AOS_SSSP_STAGE_STARTUP_3_2                  = 0x13200000, /**< Identifier of SSSP startup phase stage 3-2.                                          */
+  AOS_SSSP_STAGE_STARTUP_3_3                  = 0x13300000, /**< Identifier of SSSP startup phase stage 3-3.                                          */
+  AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT       = 0x13310000, /**< Identifier of SSSP startup phase stage 3-3 waiting for an event to occurr.           */
+  AOS_SSSP_STAGE_STARTUP_3_3_BROADCASTID      = 0x13320000, /**< Identifier of SSSP startup phase stage 3-3 broadcasting identifier.                  */
+  AOS_SSSP_STAGE_STARTUP_3_4                  = 0x13400000, /**< Identifier of SSSP startup phase stage 3-4.                                          */
+  AOS_SSSP_STAGE_STARTUP_3_4_COMPLETION       = 0x13410000, /**< Identifier of SSSP startup phase stage 3-4 completion.                               */
+  AOS_SSSP_STAGE_STARTUP_3_4_ABORTION         = 0x13420000, /**< Identifier of SSSP startup phase stage 3-4 abortion.                                 */
+  AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT    = 0x13421000, /**< Identifier of SSSP startup phase stage 3-4 abortion initialization.                  */
+  AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_SYNC    = 0x13422000, /**< Identifier of SSSP startup phase stage 3-4 abortion synchronization.                 */
+  AOS_SSSP_STAGE_OPERATION                    = 0x20000000, /**< Identifier of SSSP operation phase.                                                  */
+  AOS_SSSP_STAGE_SHUTDOWN                     = 0x30000000, /**< Identifier of SSSP shutdown phase.                                                   */
+  AOS_SSSP_STAGE_SHUTDOWN_1                   = 0x31000000, /**< Identifier of SSSP shutdown phase stage 1.                                           */
+  AOS_SSSP_STAGE_SHUTDOWN_1_1                 = 0x31100000, /**< Identifier of SSSP shutdown phase stage 1-1.                                         */
+  AOS_SSSP_STAGE_SHUTDOWN_1_2                 = 0x31200000, /**< Identifier of SSSP shutdown phase stage 1-2.                                         */
+  AOS_SSSP_STAGE_SHUTDOWN_1_3                 = 0x31300000, /**< Identifier of SSSP shutdown phase stage 1-3.                                         */
+  AOS_SSSP_STAGE_SHUTDOWN_2                   = 0x32000000, /**< Identifier of SSSP shutdown phase stage 2.                                           */
+  AOS_SSSP_STAGE_SHUTDOWN_2_1                 = 0x32100000, /**< Identifier of SSSP shutdown phase stage 2-1.                                         */
+  AOS_SSSP_STAGE_SHUTDOWN_2_2                 = 0x32200000, /**< Identifier of SSSP shutdown phase stage 2-2.                                         */
+  AOS_SSSP_STAGE_SHUTDOWN_2_3                 = 0x32300000, /**< Identifier of SSSP shutdown phase stage 2-3.                                         */
 } aos_ssspstage_t;
 
 /**
@@ -122,8 +133,8 @@ typedef uint8_t aos_ssspmoduleid_t;
 typedef uint16_t aos_ssspmoduleid_t;
 #elif (AMIROOS_CFG_SSSP_MODULEIDWIDTH == 32)
 typedef uint32_t aos_ssspmoduleid_t;
-#else
-#error "AMIROOS_CFG_SSSP_MODULEIDWIDTH set to an invalid value."
+#elif (AMIROOS_CFG_SSSP_MODULEIDWIDTH == 64)
+typedef uint64_t aos_ssspmoduleid_t;
 #endif
 
 /**
@@ -135,19 +146,122 @@ typedef struct {
    */
   aos_ssspstage_t stage;
 
-#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
-
   /**
    * @brief   Module identifier.
    * @details A value of @p AOS_SSSP_MODULEID_INVALID indicates an uninitialized ID.
-   *          The values @p AOS_SSSP_MODULEID_INVALID and @p AOS_SSSP_MODULEID_ALL are reserved and must not be set.
    */
   aos_ssspmoduleid_t moduleId;
 
-#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
-
 } aos_ssspdata_t;
 
+#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
+
+/**
+ * @brief   Type to qualify attempts to transmitt/receive mesages via BCB.
+ */
+typedef enum {
+  AOS_SSSP_BCB_SUCCESS,     /**< BCB access was sucessfull. */
+  AOS_SSSP_BCB_ERROR,       /**< BCB access failed or no message was available. */
+  AOS_SSSP_BCB_INVALIDMSG,  /**< Invalid BCB message detected. */
+} aos_ssspbcbstatus_t;
+
+/**
+ * @brief   Data structure to be transmitted via BCB during module stack initialization (MSI).
+ */
+typedef struct {
+
+  /**
+   * @brief   Type of the message.
+   */
+  uint8_t type;
+
+  /**
+   * @brief   Message payload.
+   * @details Payload depends on message type.
+   */
+  union {
+    /**
+     * @brief   Transmitted ID.
+     * @details This field is only used for @p SSSP_MSI_ID type messages.
+     */
+    aos_ssspmoduleid_t id;
+  } payload PACKED_VAR;
+
+} aos_ssspbcbmessage_t;
+
+/*
+ * Available BCB messages:
+ */
+#define AOS_SSSP_BCBMESSAGE_INVALID             0   /**< Invalid BCB message.         */
+#define AOS_SSSP_BCBMESSAGE_MSIINIT             1   /**< MSI initialization message.  */
+#define AOS_SSSP_BCBMESSAGE_MSIID               2   /**< MSI identifier message.      */
+#define AOS_SSSP_BCBMESSAGE_MSIABORT            3   /**< MSI abort message.           */
+
+/**
+ * @brief   Data structure required for the module stack initialization (MSI) phase.
+ */
+typedef struct {
+
+  /**
+   * @brief   Timout related data.
+   */
+  struct {
+    /**
+     * @brief   Timer to trigger potential timeouts.
+     * @details This timer must not be an AMiRo-OS timer, since delays occurr before system is initialized.
+     */
+    virtual_timer_t timer;
+
+    /**
+     * @brief   Event source to be triggered on timeout.
+     */
+    event_source_t eventsource;
+
+    /**
+     * @brief   Event listener to inform the MSI thread about timeout events.
+     */
+    event_listener_t eventlistener;
+  } timeout;
+
+  /**
+   * @brief   Signal related data.
+   */
+  struct {
+    /**
+     * @brief   Pointer to an existing event listener, which informs about GPIO signal events.
+     */
+    event_listener_t* eventlistener;
+  } signals;
+
+  /**
+   * @brief   BCB related data.
+   */
+  struct {
+    /**
+     * @brief   Message object.
+     */
+    aos_ssspbcbmessage_t message;
+
+    /**
+     * @brief   Buffer for (de)serialization BCB messages.
+     */
+    uint8_t buffer[sizeof(aos_ssspbcbmessage_t)];
+
+    /**
+     * @brief   Return status of last BCB access.
+     */
+    aos_ssspbcbstatus_t status;
+
+    /**
+     * @brief   The most recently received identifier.
+     */
+    aos_ssspmoduleid_t lastid;
+  } bcb;
+
+} aos_ssspmsidata_t;
+
+#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+
 /******************************************************************************/
 /* MACROS                                                                     */
 /******************************************************************************/
@@ -159,16 +273,120 @@ typedef struct {
 #if defined(__cplusplus)
 extern "C" {
 #endif /* defined(__cplusplus) */
+
+  /*
+   * module specific interface functions
+   */
+#if !defined(moduleSsspSignalPD) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the control GPIO object for the PD signal.
+   * @return  Pounter to the control GPIO object.
+   */
+  apalControlGpio_t* moduleSsspSignalPD(void);
+#endif /* !defined(moduleSsspSignalPD) */
+#if !defined(moduleSsspEventflagPD) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the GPIO event flag set by a PD signal edge.
+   * @return  Eventflag set on PD events.
+   */
+  eventflags_t moduleSsspEventflagPD(void);
+#endif /* !defined(moduleSsspEventflagPD) */
+
+#if !defined(moduleSsspSignalS) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the control GPIO object for the S signal.
+   * @return  Pounter to the control GPIO object.
+   */
+  apalControlGpio_t* moduleSsspSignalS(void);
+#endif /* !defined(moduleSsspSignalS) */
+#if !defined(moduleSsspEventflagS) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the GPIO event flag set by a S signal edge.
+   * @return  Eventflag set on S events.
+   */
+  eventflags_t moduleSsspEventflagS(void);
+#endif /* !defined(moduleSsspEventflagS) */
+
+#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
+
+#if (AMIROOS_CFG_SSSP_STACK_START != true) || defined(__DOXYGEN__)
+#if !defined(moduleSsspSignalDN) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the control GPIO object for the DN signal.
+   * @return  Pounter to the control GPIO object.
+   */
+  apalControlGpio_t* moduleSsspSignalDN(void);
+#endif /* !defined(moduleSsspSignalDN) */
+#if !defined(moduleSsspEventflagDN) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the GPIO event flag set by a DN signal edge.
+   * @return  Eventflag set on DN events.
+   */
+  eventflags_t moduleSsspEventflagDN(void);
+#endif /* !defined(moduleSsspEventflagDN) */
+#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
+
+#if (AMIROOS_CFG_SSSP_STACK_END != true) || defined(__DOXYGEN__)
+#if !defined(moduleSsspSignalUP) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the control GPIO object for the UP signal.
+   * @return  Pounter to the control GPIO object.
+   */
+  apalControlGpio_t* moduleSsspSignalUP(void);
+#endif /* !defined(moduleSsspSignalUP) */
+#if !defined(moduleSsspEventflagUP) || defined(__DOXYGEN__)
+  /**
+   * @brief   Retreive the GPIO event flag set by a UP signal edge.
+   * @return  Eventflag set on UP events.
+   */
+  eventflags_t moduleSsspEventflagUP(void);
+#endif /* !defined(moduleSsspEventflagUP) */
+#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
+
+#if !defined(moduleSsspBcbTransmit) || defined(__DOXYGEN__)
+  /**
+   * @brief   Transmit data via BCB.
+   *
+   * @param[in] buffer    Pointer to a buffer, that holds the data to be sent.
+   * @param[in] length    Length of the buffer in bytes.
+   *
+   * @return  Status value, indicating whether the operation was successful.
+   */
+  aos_ssspbcbstatus_t moduleSsspBcbTransmit(const uint8_t* buffer, size_t length);
+
+  /**
+   * @brief   Receive a message from BCB.
+   * @note    If a message is received, which is not defined by SSSP, the data may be irreversibly discarded by this function.
+   *
+   * @param[out]    buffer  Pointer to a buffer to store the received data to.
+   * @param[in]     length  Number of expected bytes to receive.
+   *                        Obviously, the buffer must be large enough.
+   *
+   * @return  Status value, indicating whether the operation was successful.
+   */
+  aos_ssspbcbstatus_t moduleSsspBcbReceive(uint8_t* buffer, size_t length);
+#endif /* !defined(moduleSsspBcbTransmit) */
+
+#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+
+  /*
+   * API functions
+   */
   void aosSsspInit(aos_timestamp_t* system_uptime);
-  aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, eventmask_t mask, eventmask_t* received);
+  aos_status_t aosSsspProceed(event_listener_t* listener, eventmask_t mask, eventmask_t* received);
+#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
+  void aosSsspMsiInit(aos_ssspmsidata_t* msidata, eventmask_t delayMask, eventmask_t timeoutMask, event_listener_t* gpioListener);
+  void aosSsspMsi(aos_ssspmsidata_t* msidata, eventmask_t* received);
+#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+#if ((AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__)
+  float aosSsspGetSyncSkew(void);
+#endif /* (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */
   void aosSsspShutdownInit(bool active);
 #if (AMIROOS_CFG_SSSP_SHUTDOWN == true) || defined(__DOXYGEN__)
   void aosSsspShutdownBroadcastIdentifier(unsigned int identifier);
   eventmask_t aosSsspShutdownWaitForIdentifierPulse(event_listener_t* gpiolistener, eventflags_t sflags, eventmask_t timermask, unsigned int* identifier);
 #endif /* (AMIROOS_CFG_SSSP_SHUTDOWN == true) */
-#if ((AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__)
-  float aosSsspGetSyncSkew(void);
-#endif /* (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */
+
 #if defined(__cplusplus)
 }
 #endif /* defined(__cplusplus) */
diff --git a/core/inc/aos_types.h b/core/inc/aos_types.h
index c934a54..69b58a4 100644
--- a/core/inc/aos_types.h
+++ b/core/inc/aos_types.h
@@ -46,7 +46,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /******************************************************************************/
 
 /**
- * @brief   Error and status type generally used in AMiRo-OS.
+ * @brief   Status type generally used in AMiRo-OS.
+ * @details By definition, the most significant bit (MSB) indicates whether an error occurred (e.g. the function call failed).
+ *          All other bits can be used to specify the issue in more detail.
+ *          If the MSB is unset, all other bits can still be used to indicate and specify non-critical warnings.
+ *          As a result, a value of 0 (no bit set) indicates a flawles success.
  */
 typedef uint8_t aos_status_t;
 
@@ -58,7 +62,7 @@ typedef uint8_t aos_status_t;
 /**
  * @brief   Success: no error or warning occurred.
  */
-#define AOS_SUCCESS                             ((aos_status_t)0x00u)
+#define AOS_SUCCESS                             AOS_OK
 
 /**
  * @brief   Some unspecified waring occurred.
@@ -73,12 +77,12 @@ typedef uint8_t aos_status_t;
 /**
  * @brief   An error occurred.
  */
-#define AOS_ERROR                               ((aos_status_t)0x80u)
+#define AOS_ERROR                               ((aos_status_t)(1 << ((sizeof(aos_status_t) * 8) - 1)))
 
 /**
  * @brief   An error occurred.
  */
-#define AOS_FAILURE                             ((aos_status_t)0x80u)
+#define AOS_FAILURE                             AOS_ERROR
 
 /******************************************************************************/
 /* MACROS                                                                     */
diff --git a/core/src/aos_main.cpp b/core/src/aos_main.cpp
index 9d74144..322c566 100644
--- a/core/src/aos_main.cpp
+++ b/core/src/aos_main.cpp
@@ -49,10 +49,20 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
 
+
+#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
+
+/**
+ * @brief   Event mask to identify SSSP timeout events (MSI only).
+ */
+#define EVENTMASK_SSSPTIMEOUT                   EVENT_MASK(2)
+
+#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+
 /**
- * @brief   Event mask to identify SSSP timer events.
+ * @brief   Event mask to identify SSSP delay events.
  */
-#define EVENTMASK_SSSPTIMER                     EVENT_MASK(2)
+#define EVENTMASK_SSSPDELAY                     EVENT_MASK(3)
 
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 
@@ -273,13 +283,13 @@ int main(void)
   /* event associations */
 #if (AMIROOS_CFG_SSSP_ENABLE == true)
   {
-    eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | MODULE_SSSP_EVENTFLAG_PD | MODULE_SSSP_EVENTFLAG_S;
+    eventflags_t flagsmask = AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK | moduleSsspEventflagPD() | moduleSsspEventflagS();
 #if (AMIROOS_CFG_SSSP_MSI == true)
 #if (AMIROOS_CFG_SSSP_STACK_START != true)
-    flagsmask |= MODULE_SSSP_EVENTFLAG_DN;
+    flagsmask |= moduleSsspEventflagDN();
 #endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
 #if (AMIROOS_CFG_SSSP_STACK_END != true)
-    flagsmask |= MODULE_SSSP_EVENTFLAG_UP;
+    flagsmask |= moduleSsspEventflagUP();
 #endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
 #endif /* (AMIROOS_CFG_SSSP_MSI == true) */
     chEvtRegisterMaskWithFlags(&aos.events.gpio, &_eventListenerGPIO, EVENTMASK_GPIO, flagsmask);
@@ -305,7 +315,7 @@ int main(void)
 
   // proceed to startup stage 1.2
 #if (AMIROOS_CFG_SSSP_MASTER == true)
-  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
+  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
     /*
      * This code is executed if the received event was not about the delay.
      * The received event could be casued by any listener.
@@ -314,7 +324,7 @@ int main(void)
     if (eventmask & _eventListenerGPIO.events) {
       eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
       // PD event
-      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
+      if (eventflags & moduleSsspEventflagPD()) {
         shutdown = AOS_SHUTDOWN_PASSIVE;
       } else {
 #if defined(MODULE_SSSP_STARTUP_1_1_GPIOEVENT_HOOK)
@@ -339,13 +349,13 @@ int main(void)
   }
 #else /* (AMIROOS_CFG_SSSP_MASTER == true) */
   if (shutdown == AOS_SHUTDOWN_NONE) {
-    aosSsspProceed(NULL, 0, 0, NULL);
+    aosSsspProceed(NULL, 0, NULL);
     aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_1_2);
   }
 #endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
 
   // proceed to startup stage 1.3
-  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
+  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
     /*
      * This code is executed if the received event was not about a deactivation of the snychronization signal.
      * The received event could be caused by any listener.
@@ -354,7 +364,7 @@ int main(void)
     if (eventmask & _eventListenerGPIO.events) {
       eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
       // PD event
-      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
+      if (eventflags & moduleSsspEventflagPD()) {
         shutdown = AOS_SHUTDOWN_PASSIVE;
       } else {
 #if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
@@ -380,7 +390,7 @@ int main(void)
 
   // proceed to startup stage 2.1
 #if (AMIROOS_CFG_SSSP_MASTER == true)
-  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
+  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
     /*
      * This code is executed if the received event was not about the delay.
      * The received event could be caused by any listener.
@@ -389,7 +399,7 @@ int main(void)
     if (eventmask & _eventListenerGPIO.events) {
       eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
       // PD event
-      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
+      if (eventflags & moduleSsspEventflagPD()) {
         shutdown = AOS_SHUTDOWN_PASSIVE;
       } else {
 #if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
@@ -410,7 +420,7 @@ int main(void)
     }
   }
 #else /* (AMIROOS_CFG_SSSP_MASTER == true) */
-  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
+  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
     /*
      * This code is executed if the received event was not about a deactivation of the snychronization signal.
      * The received event could be caused by any listener.
@@ -419,7 +429,7 @@ int main(void)
     if (eventmask & _eventListenerGPIO.events) {
       eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
       // PD event
-      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
+      if (eventflags & moduleSsspEventflagPD()) {
         shutdown = AOS_SHUTDOWN_PASSIVE;
       } else {
 #if defined(MODULE_SSSP_STARTUP_1_2_GPIOEVENT_HOOK)
@@ -525,7 +535,7 @@ int main(void)
 
   // proceed to startup stage 2.2
 #if (AMIROOS_CFG_SSSP_MASTER == true)
-  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, 0, EVENTMASK_SSSPTIMER, &eventmask) != AOS_SUCCESS)) {
+  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(NULL, EVENTMASK_SSSPDELAY, &eventmask) != AOS_SUCCESS)) {
     /*
      * This code is executed if the received event was not about the delay.
      * The received event could be caused by any listener.
@@ -534,7 +544,7 @@ int main(void)
     if (eventmask & _eventListenerGPIO.events) {
       eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
       // PD event
-      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
+      if (eventflags & moduleSsspEventflagPD()) {
         shutdown = AOS_SHUTDOWN_PASSIVE;
       } else {
 #if defined(MODULE_SSSP_STARTUP_1_3_GPIOEVENT_HOOK)
@@ -559,13 +569,13 @@ int main(void)
   }
 #else /* (AMIROOS_CFG_SSSP_MASTER == true) */
   if (shutdown == AOS_SHUTDOWN_NONE) {
-    aosSsspProceed(NULL, 0, 0, NULL);
+    aosSsspProceed(NULL, 0, NULL);
     aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_2_2);
   }
 #endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
 
   // proceed to startup stage 3 (MSI is enabled), or to operation phase (no MSI)
-  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
+  while ((shutdown == AOS_SHUTDOWN_NONE) && (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS)) {
     /*
      * This code is executed if the received event was not about a deactivation of the snychronization signal.
      * The received event could be caused by any listener.
@@ -574,7 +584,7 @@ int main(void)
     if (eventmask & _eventListenerGPIO.events) {
       eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
       // PD event
-      if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
+      if (eventflags & moduleSsspEventflagPD()) {
         shutdown = AOS_SHUTDOWN_PASSIVE;
       } else {
 #if defined(MODULE_SSSP_STARTUP_2_2_GPIOEVENT_HOOK)
@@ -596,7 +606,7 @@ int main(void)
   }
   if (shutdown == AOS_SHUTDOWN_NONE) {
 #if (AMIROOS_CFG_SSSP_MSI == true)
-    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1);
+    aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3);
 #else /* (AMIROOS_CFG_SSSP_MSI == true) */
     aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_OPERATION);
 #endif /* (AMIROOS_CFG_SSSP_MSI == true) */
@@ -607,8 +617,43 @@ int main(void)
    */
 
 #if (AMIROOS_CFG_SSSP_MSI == true)
-
-  //TODO: MSI
+  {
+    // initialize temporary MSI data
+    aos_ssspmsidata_t msidata;
+    aosSsspMsiInit(&msidata, EVENTMASK_SSSPDELAY, EVENTMASK_SSSPTIMEOUT, &_eventListenerGPIO);
+
+    // execute module stack initialization (MSI) but react to unrelated events as well
+    while ((shutdown == AOS_SHUTDOWN_NONE) && (aos.sssp.stage != AOS_SSSP_STAGE_OPERATION)) {
+      // execute MSI routine
+      aosSsspMsi(&msidata, &eventmask);
+      // handly event (if any)
+      if (eventmask) {
+        // GPIO event
+        if (eventmask & _eventListenerGPIO.events) {
+          eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
+          // PD event
+          if (eventflags & moduleSsspEventflagPD()) {
+            shutdown = AOS_SHUTDOWN_PASSIVE;
+          } else {
+  #if defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK)
+            MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK(eventmask, eventflags);
+  #else /* defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK) */
+            /* silently ignore any other GPIO events */
+  #endif /* defined(MODULE_SSSP_STARTUP_3_GPIOEVENT_HOOK) */
+          }
+        }
+        // OS event
+        else if (eventmask & _eventListenerOS.events) {
+          eventflags = chEvtGetAndClearFlags(&_eventListenerOS);
+          _unexpectedEventError(eventmask, eventflags);
+        }
+        // unknown event
+        else {
+          _unexpectedEventError(eventmask, 0);
+        }
+      }
+    }
+  }
 
 #if (HAL_USE_RTC == TRUE)
 
@@ -640,13 +685,13 @@ int main(void)
 
 #if (AMIROOS_CFG_SSSP_ENABLE == true)
   /* ignore all SSSP signal events, except for PD and configured events */
-  eventflags = MODULE_SSSP_EVENTFLAG_S;
+  eventflags = moduleSsspEventflagS();
 #if (AMIROOS_CFG_SSSP_MSI == true)
 #if (AMIROOS_CFG_SSSP_STACK_START != true)
-  eventflags |= MODULE_SSSP_EVENTFLAG_DN;
+  eventflags |= moduleSsspEventflagDN();
 #endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
 #if (AMIROOS_CFG_SSSP_STACK_END != true)
-  eventflags |= MODULE_SSSP_EVENTFLAG_UP;
+  eventflags |= moduleSsspEventflagUP();
 #endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
 #endif /* (AMIROOS_CFG_SSSP_MSI == true) */
   eventflags &= ~((eventflags_t)AMIROOS_CFG_MAIN_LOOP_GPIOEVENT_FLAGSMASK);
@@ -677,7 +722,7 @@ int main(void)
         eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
 #if (AMIROOS_CFG_SSSP_ENABLE == true)
         // PD event
-        if (eventflags & MODULE_SSSP_EVENTFLAG_PD) {
+        if (eventflags & moduleSsspEventflagPD()) {
           aosSsspShutdownInit(false);
           shutdown = AOS_SHUTDOWN_PASSIVE;
         }
@@ -742,7 +787,7 @@ int main(void)
      * Note that events for the optional signals UP and DN are not enabled as they are not utilized during SSSP shutdown phase.
      */
     chSysLock();
-    _eventListenerGPIO.wflags |= MODULE_SSSP_EVENTFLAG_S;
+    _eventListenerGPIO.wflags |= moduleSsspEventflagS();
     chSysUnlock();
 
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
@@ -816,7 +861,7 @@ int main(void)
 #if (AMIROOS_CFG_SSSP_ENABLE == true)
 
   // proceed to SSSP shutdown stage 1.3
-  aosSsspProceed(NULL, 0, 0, NULL);
+  aosSsspProceed(NULL, 0, NULL);
   aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_1_3);
 
 #if (AMIROOS_CFG_SSSP_SHUTDOWN == true)
@@ -828,7 +873,7 @@ int main(void)
    */
 
   // proceed to SSSP shutdown stage 2.1
-  while (aosSsspProceed(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS) {
+  while (aosSsspProceed(&_eventListenerGPIO, EVENTMASK_GPIO, &eventmask) != AOS_SUCCESS) {
     /*
      * This code is executed if the received event was not about a deactivation of the synchronization signal.
      * The received event could be caused by any listener.
@@ -855,7 +900,7 @@ int main(void)
   aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_1);
 
   // proceed to SSSP shutdown stage 2.2
-  aosSsspProceed(NULL, 0, 0, &eventmask);
+  aosSsspProceed(NULL, 0, &eventmask);
   aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_2);
   if (shutdown == AOS_SHUTDOWN_PASSIVE) {
     aosDbgPrintf("%s request received\n", eventmask ? "shutdown" : "restart");
@@ -875,7 +920,7 @@ int main(void)
     unsigned int identifier = 0;
 
     // receive the identifier, which specifies the type of shutdown/restart
-    while ((eventmask = aosSsspShutdownWaitForIdentifierPulse(&_eventListenerGPIO, MODULE_SSSP_EVENTFLAG_S, EVENTMASK_SSSPTIMER, &identifier)) != EVENTMASK_SSSPTIMER) {
+    while ((eventmask = aosSsspShutdownWaitForIdentifierPulse(&_eventListenerGPIO, moduleSsspEventflagS(), EVENTMASK_SSSPDELAY, &identifier)) != EVENTMASK_SSSPDELAY) {
       // GPIO event
       if (eventmask & _eventListenerGPIO.events) {
         eventflags = chEvtGetAndClearFlags(&_eventListenerGPIO);
@@ -901,7 +946,7 @@ int main(void)
   }
 
   // proceed to SSSP shutdown stage 2.3
-  aosSsspProceed(NULL, 0, 0, NULL);
+  aosSsspProceed(NULL, 0, NULL);
   aosDbgAssert(aos.sssp.stage == AOS_SSSP_STAGE_SHUTDOWN_2_3);
 
   /*
diff --git a/core/src/aos_sssp.c b/core/src/aos_sssp.c
index 8f82143..90ceab1 100644
--- a/core/src/aos_sssp.c
+++ b/core/src/aos_sssp.c
@@ -83,18 +83,19 @@ static float _syncskew;
 
 /**
  * @brief   A timer event based delays.
+ * @details This timer must not be an AMiRo-OS timer, since delays occurr before system is initialized.
  */
 static virtual_timer_t _delayTimer;
 
 /**
  * @brief   Event source for the delay timer.
  */
-static event_source_t _eventSourceDelay;
+static event_source_t _delayEventSource;
 
 /**
  * @brief   Event listener for the delay event.
  */
-static event_listener_t _eventListenerDelay;
+static event_listener_t _delayEventListener;
 
 /******************************************************************************/
 /* LOCAL FUNCTIONS                                                            */
@@ -103,7 +104,7 @@ static event_listener_t _eventListenerDelay;
 #if (AMIROOS_CFG_SSSP_MASTER != true) || defined(__DOXYGEN__)
 
 /**
- * @brief   Callback function for the Sync signal interrupt.
+ * @brief   Callback function for the S signal interrupt.
  *
  * @param[in] args   Pointer to the GPIO line identifier.
  */
@@ -119,7 +120,7 @@ static void _gpioCallbackSSignal(void *args)
   // if the system is in operation phase
   if (aos.sssp.stage == AOS_SSSP_STAGE_OPERATION) {
     // read signal S
-    apalControlGpioGet(&moduleSsspGpioS, &s);
+    apalControlGpioGet(moduleSsspSignalS(), &s);
     // if S was toggled from on to off
     if (s == APAL_GPIO_OFF) {
       // get current uptime
@@ -154,7 +155,7 @@ static void _gpioCallbackSSignal(void *args)
 
 /**
  * @brief   Periodic system synchronization callback function.
- * @details Toggles the SYS_SYNC signal and reconfigures the system synchronization timer.
+ * @details Toggles the S signal and reconfigures the system synchronization timer.
  *
  * @param[in] par   Unused parameters.
  */
@@ -162,19 +163,20 @@ static void _syncTimerCallback(void* par)
 {
   (void)par;
 
+  // local variables
   apalControlGpioState_t state;
   aos_timestamp_t uptime;
 
   chSysLockFromISR();
   // toggle and read signal S
-  apalGpioToggle(moduleSsspGpioS.gpio);
-  apalControlGpioGet(&moduleSsspGpioS, &state);
+  apalGpioToggle(moduleSsspSignalS()->gpio);
+  apalControlGpioGet(moduleSsspSignalS(), &state);
   // if S was toggled from off to on
   if (state == APAL_GPIO_ON) {
     // reconfigure the timer precisely, because the logically falling edge (next interrupt) snychronizes the system time
     _synctime += AMIROOS_CFG_SSSP_SYSSYNCPERIOD;
     aosSysGetUptimeX(&uptime);
-    chVTSetI(&_synctimer, chTimeUS2I(_synctime - uptime), _syncTimerCallback, NULL);
+    chVTSetI(&_synctimer, chTimeUS2I((time_usecs_t)(_synctime - uptime)), _syncTimerCallback, NULL);
   }
   // if S was toggled from on to off
   else /* if (state == APAL_GPIO_OFF) */ {
@@ -199,7 +201,7 @@ static inline void _syncTimerStartS(void)
   aos_timestamp_t t;
   aosSysGetUptimeX(&t);
   t = AMIROOS_CFG_SSSP_SYSSYNCPERIOD - (t % AMIROOS_CFG_SSSP_SYSSYNCPERIOD);
-  chVTSetI(&_synctimer, chTimeUS2I((t > (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2)) ? (t - (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2)) : (t + (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2))), _syncTimerCallback, NULL);
+  chVTSetI(&_synctimer, chTimeUS2I((time_usecs_t)((t > (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2)) ? (t - (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2)) : (t + (AMIROOS_CFG_SSSP_SYSSYNCPERIOD / 2)))), _syncTimerCallback, NULL);
 
   return;
 }
@@ -226,33 +228,41 @@ static void _timerCallback(void* par)
  * @brief   Waits for the S signal to switch to the desired state.
  *
  * @param[in]   listener      Pointer to the GPIO event listener to be used.
- * @param[in]   flags         Event flags to listen to by the event listener (indicating a S signal event).
  * @param[in]   signalstate   Desired state of the S signal ti be waited for.
  * @param[out]  received      Output variable to store the received event mask to.
  *
  * @return  Status, indicating whether the expected event was received.
  */
-static inline aos_status_t _waitForS(event_listener_t* listener, eventflags_t flags, apalControlGpioState_t signalstate, eventmask_t* received)
+static inline aos_status_t _waitForS(event_listener_t* listener, apalControlGpioState_t signalstate, eventmask_t* received)
 {
   aosDbgCheck(listener != NULL);
-  aosDbgCheck(flags != 0);
   aosDbgCheck(received != NULL);
 
+  // local variables
+  aos_status_t status = AOS_FAILURE;
+
   // wait for the next event (do not apply any filters in order not to miss any events)
   *received = chEvtWaitOne(ALL_EVENTS);
   // if the correct event was triggered
-  if (*received == listener->events) {
+  if (*received & listener->events) {
     apalControlGpioState_t s;
-    apalControlGpioGet(&moduleSsspGpioS, &s);
+    apalControlGpioGet(moduleSsspSignalS(), &s);
+    chSysLock();
     // only check for the expected event
-    if (flags & listener->flags && s == signalstate) {
+    if ((listener->flags & moduleSsspEventflagS()) && (s == signalstate)) {
       // unset the expected flags but keep any other ones
-      listener->flags &= ~flags;
-      return AOS_SUCCESS;
+      listener->flags &= ~moduleSsspEventflagS();
+      status = AOS_SUCCESS;
     }
+    // if no further flags are set
+    if (listener->flags == 0) {
+      // clear event
+      *received &= ~(listener->events);
+    }
+    chSysUnlock();
   }
 
-  return AOS_FAILURE;
+  return status;
 }
 
 /**
@@ -260,35 +270,159 @@ static inline aos_status_t _waitForS(event_listener_t* listener, eventflags_t fl
  *
  * @param[in]   dt          Delay time in microseconds to be set to the timer.
  * @param[in]   mask        Event mask to be used for the delay timer.
- * @param[in]   arm_timer   Flag to indicate whether the timer has to be armed yet (i.e. on first call of this function).
  * @param[out]  received    Output variable to store the received event mask to.
  *
  * @return  Status, indicating whether the expected event (delay timer) was received.
  */
-static inline aos_status_t _delay(uint32_t dt, eventmask_t mask, bool arm_timer, eventmask_t* received)
+static inline aos_status_t _delay(uint32_t dt, eventmask_t mask, eventmask_t* received)
 {
   aosDbgCheck(dt != TIME_IMMEDIATE);
   aosDbgCheck(mask != 0);
   aosDbgCheck(received != NULL);
 
   // arm the delay timer once
-  if (arm_timer) {
-    chEvtRegisterMask(&_eventSourceDelay, &_eventListenerDelay, mask);
-    chVTSet(&_delayTimer, chTimeUS2I(dt), _timerCallback, &_eventSourceDelay);
+  if (!chVTIsArmed(&_delayTimer)) {
+    chEvtRegisterMask(&_delayEventSource, &_delayEventListener, mask);
+    chVTSet(&_delayTimer, chTimeUS2I(dt), _timerCallback, &_delayEventSource);
   }
 
   // wait for any event to occur (do not apply any filters in order not to miss any events)
   *received = chEvtWaitOne(ALL_EVENTS);
 
   // if the timer event was received, cleanup
-  if (*received & _eventListenerDelay.events) {
-    chEvtUnregister(&_eventSourceDelay, &_eventListenerDelay);
+  if (*received & _delayEventListener.events) {
+    chEvtUnregister(&_delayEventSource, &_delayEventListener);
+    *received &= ~(_delayEventListener.events);
     return AOS_SUCCESS;
   }
 
   return AOS_FAILURE;
 }
 
+#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
+
+/**
+ * @brief   Serialize a BCB message.
+ * @details The individual primitives are serialized in big-endian fashion.
+ *
+ * @param[out]  buffer    Buffer to write the serialized message to.
+ * @param[in]   message   The message to be serialized.
+ */
+aos_status_t _serializeBcbMessage(uint8_t* buffer, aos_ssspbcbmessage_t message)
+{
+  aosDbgCheck(buffer != NULL);
+
+  // encode the message depending on its type
+  switch (message.type) {
+    case AOS_SSSP_BCBMESSAGE_MSIINIT:
+    case AOS_SSSP_BCBMESSAGE_MSIABORT:
+    {
+      buffer[0] = message.type;
+      return AOS_SUCCESS;
+    }
+    case AOS_SSSP_BCBMESSAGE_MSIID:
+    {
+      buffer[0] = message.type;
+      for (size_t byte = 0; byte < sizeof(aos_ssspmoduleid_t); ++byte) {
+        buffer[byte+1] = (message.payload.id >> (8 * (sizeof(aos_ssspmoduleid_t) - (byte+1)))) & 0xFF;
+      }
+      return AOS_SUCCESS;
+    }
+    default:
+    {
+      return AOS_FAILURE;
+    }
+  }
+}
+
+/**
+ * @brief   Deserialize a BCB message.
+ * @details The individual primitives must be serialized in big-endian fashion.
+ *
+ * @param[out]  message   Message object to be filled.
+ * @param[in]   buffer    Buffer holding the serialized message.
+ */
+aos_status_t _deserializeBcbMessage(aos_ssspbcbmessage_t* message, uint8_t* buffer)
+{
+  aosDbgCheck(message != NULL);
+  aosDbgCheck(buffer != NULL);
+
+  // only decode the first byte, which contains the message type
+  message->type = buffer[0];
+
+  // decode the message depedning on its type
+  switch (message->type) {
+    case AOS_SSSP_BCBMESSAGE_MSIINIT:
+    case AOS_SSSP_BCBMESSAGE_MSIABORT:
+    {
+      return AOS_SUCCESS;
+    }
+    case AOS_SSSP_BCBMESSAGE_MSIID:
+    {
+      message->payload.id = 0;
+      for (size_t byte = 0; byte < sizeof(aos_ssspmoduleid_t); ++byte) {
+        message->payload.id |= (aos_ssspmoduleid_t)(buffer[byte+1] << (8 * (sizeof(aos_ssspmoduleid_t) - (byte+1))));
+      }
+      return AOS_SUCCESS;
+    }
+    default:
+    {
+      message->type = AOS_SSSP_BCBMESSAGE_INVALID;
+      return AOS_FAILURE;
+    }
+  }
+}
+
+/**
+ * @brief   Common outro of the module stack initialization (MSI).
+ * @details This function must be called on failure, success and if MSI is skipped.
+ *
+ * @param[in] msidata   Pointer to the temporary data structure used during MSI.
+ */
+void _msiOutro(aos_ssspmsidata_t* msidata)
+{
+  aosDbgCheck(msidata != NULL);
+
+  // local variables
+  eventmask_t mask = 0;
+
+  // start the internal uptime aggregation
+  chSysLock();
+  aosSysStartUptimeS();
+#if (AMIROOS_CFG_SSSP_MASTER == true)
+  // start toggling S for system synchronization
+  _syncTimerStartS();
+#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
+  chSysUnlock();
+
+  // reset delay timer
+  chVTIsArmed(&_delayTimer);
+  // unregister delay events
+  mask |= _delayEventListener.events;
+  chEvtUnregister(&_delayEventSource, &_delayEventListener);
+
+#if (AMIROOS_CFG_SSSP_STACK_END != true)
+  // deactivate UP signal
+  apalControlGpioSet(moduleSsspSignalUP(), APAL_GPIO_OFF);
+#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
+
+  // reset timeout timer
+  chVTReset(&msidata->timeout.timer);
+  // unregister timeout events
+  mask |= msidata->timeout.eventlistener.events;
+  chEvtUnregister(&msidata->timeout.eventsource, &msidata->timeout.eventlistener);
+
+  // discard any pending timing events
+  chEvtWaitAnyTimeout(mask, TIME_IMMEDIATE);
+
+  // proceed to operation phase
+  aos.sssp.stage = AOS_SSSP_STAGE_OPERATION;
+
+  return;
+}
+
+#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+
 /******************************************************************************/
 /* EXPORTED FUNCTIONS                                                         */
 /******************************************************************************/
@@ -300,9 +434,6 @@ void aosSsspInit(aos_timestamp_t* system_uptime)
 {
   aosDbgCheck(system_uptime != NULL);
 
-  // local variables
-  apalControlGpioState_t state;
-
 #if (AMIROOS_CFG_SSSP_STARTUP == true)
   // AMiRo-OS has to perform the basic initialization
   aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_1_1;
@@ -311,26 +442,29 @@ void aosSsspInit(aos_timestamp_t* system_uptime)
   aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_2_1;
 #endif /* (AMIROOS_CFG_SSSP_STARTUP == true) */
 
+  // module ID is initialized as 'invalid'
+  aos.sssp.moduleId = AOS_SSSP_MODULEID_INVALID;
+
+#if (AMIROOS_CFG_DBG == true)
   // check all SSSP signals for correct state
-  apalControlGpioGet(&moduleSsspGpioS, &state);
-  aosDbgAssert(state == APAL_GPIO_ON);
-  apalControlGpioGet(&moduleSsspGpioPD, &state);
-  aosDbgAssert(state == APAL_GPIO_OFF);
+  {
+    apalControlGpioState_t state;
+    apalControlGpioGet(moduleSsspSignalS(), &state);
+    aosDbgAssert(state == APAL_GPIO_ON);
+    apalControlGpioGet(moduleSsspSignalPD(), &state);
+    aosDbgAssert(state == APAL_GPIO_OFF);
 #if (AMIROOS_CFG_SSSP_MSI == true)
-#if (AMIROOS_CFG_SSSP_STACK_END != true)
-  apalControlGpioGet(&moduleSsspGpioUP, &state);
-  aosDbgAssert(state == APAL_GPIO_OFF);
-#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
 #if (AMIROOS_CFG_SSSP_STACK_START != true)
-  apalControlGpioGet(&moduleSsspGpioDN, &state);
-  aosDbgAssert(state == APAL_GPIO_OFF);
+    apalControlGpioGet(moduleSsspSignalDN(), &state);
+    aosDbgAssert(state == APAL_GPIO_OFF);
 #endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
+#if (AMIROOS_CFG_SSSP_STACK_END != true)
+    apalControlGpioGet(moduleSsspSignalUP(), &state);
+    aosDbgAssert(state == APAL_GPIO_OFF);
+#endif /* (AMIROOS_CFG_SSSP_END_START != true) */
 #endif /* (AMIROOS_CFG_SSSP_MSI == true) */
-
-#if (AMIROOS_CFG_SSSP_MSI == true)
-  // module ID is initialized as 'invalid'
-  aos.sssp.moduleId = AOS_SSSP_MODULEID_INVALID;
-#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+  }
+#endif /* (AMIROOS_CFG_DBG == true) */
 
   // initialize static variables
   _uptime = system_uptime;
@@ -342,25 +476,25 @@ void aosSsspInit(aos_timestamp_t* system_uptime)
   _syncskew = 0.0f;
 #endif /* (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */
   chVTObjectInit(&_delayTimer);
-  chEvtObjectInit(&_eventSourceDelay);
+  chEvtObjectInit(&_delayEventSource);
 
   // signal interrupt setup
-  palSetLineCallback(moduleSsspGpioPD.gpio->line, aosSysGetStdGpioCallback(), &moduleSsspGpioPD.gpio->line);
-  palEnableLineEvent(moduleSsspGpioPD.gpio->line, APAL2CH_EDGE(moduleSsspGpioPD.meta.edge));
+  palSetLineCallback(moduleSsspSignalPD()->gpio->line, aosSysGetStdGpioCallback(), &moduleSsspSignalPD()->gpio->line);
+  palEnableLineEvent(moduleSsspSignalPD()->gpio->line, APAL2CH_EDGE(moduleSsspSignalPD()->meta.edge));
 #if (AMIROOS_CFG_SSSP_MASTER == true)
-  palSetLineCallback(moduleSsspGpioS.gpio->line, aosSysGetStdGpioCallback(), &moduleSsspGpioS.gpio->line);
+  palSetLineCallback(moduleSsspSignalS()->gpio->line, aosSysGetStdGpioCallback(), &moduleSsspSignalS()->gpio->line);
 #else /* (AMIROOS_CFG_SSSP_MASTER == true) */
-  palSetLineCallback(moduleSsspGpioS.gpio->line, _gpioCallbackSSignal, &moduleSsspGpioS.gpio->line);
+  palSetLineCallback(moduleSsspSignalS()->gpio->line, _gpioCallbackSSignal, &moduleSsspSignalS()->gpio->line);
 #endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
-  palEnableLineEvent(moduleSsspGpioS.gpio->line, APAL2CH_EDGE(moduleSsspGpioS.meta.edge));
+  palEnableLineEvent(moduleSsspSignalS()->gpio->line, APAL2CH_EDGE(moduleSsspSignalS()->meta.edge));
 #if (AMIROOS_CFG_SSSP_MSI == true)
 #if (AMIROOS_CFG_SSSP_STACK_START != true)
-  palSetLineCallback(moduleSsspGpioDN.gpio->line, aosSysGetStdGpioCallback(), &moduleSsspGpioDN.gpio->line);
-  palEnableLineEvent(moduleSsspGpioDN.gpio->line, APAL2CH_EDGE(moduleSsspGpioDN.meta.edge));
+  palSetLineCallback(moduleSsspSignalDN()->gpio->line, aosSysGetStdGpioCallback(), &moduleSsspSignalDN()->gpio->line);
+  palEnableLineEvent(moduleSsspSignalDN()->gpio->line, APAL2CH_EDGE(moduleSsspSignalDN()->meta.edge));
 #endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
 #if (AMIROOS_CFG_SSSP_STACK_END != true)
-  palSetLineCallback(moduleSsspGpioUP.gpio->line, aosSysGetStdGpioCallback(), &moduleSsspGpioUP.gpio->line);
-  palEnableLineEvent(moduleSsspGpioUP.gpio->line, APAL2CH_EDGE(moduleSsspGpioUP.meta.edge));
+  palSetLineCallback(moduleSsspSignalUP()->gpio->line, aosSysGetStdGpioCallback(), &moduleSsspSignalUP()->gpio->line);
+  palEnableLineEvent(moduleSsspSignalUP()->gpio->line, APAL2CH_EDGE(moduleSsspSignalUP()->meta.edge));
 #endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
 #endif /* (AMIROOS_CFG_SSSP_MSI == true) */
 
@@ -373,7 +507,6 @@ void aosSsspInit(aos_timestamp_t* system_uptime)
  *          The function aosSsspShutdownInit() must be used instead.
  *
  * @param[in]   listener  An optional listener, in case the system has to wait for a specific event.
- * @param[in]   flags     The relevant flags to wait for (mandatory if a listener is given).
  * @param[in]   mask      If the stage transition involves a timer event (handled internally by this function),
  *                        the given input value of this parameter defines the mask to be used for that event.
  *                        In case a listener was specified, the according mask is retrieved from the listener but this parameter is still used as input for sanity checks.
@@ -381,7 +514,7 @@ void aosSsspInit(aos_timestamp_t* system_uptime)
  *
  * @return  Status, indicating whether proceeding in the protocol was successful.
  */
-aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, eventmask_t mask, eventmask_t* received)
+aos_status_t aosSsspProceed(event_listener_t* listener, eventmask_t mask, eventmask_t* received)
 {
   // local variables
 #pragma GCC diagnostic push
@@ -402,23 +535,21 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     {
 #if (AMIROOS_CFG_SSSP_MASTER == true)
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask != 0);
       aosDbgCheck(received != NULL);
 
       // delay execution and deactivate the S signal on success
-      if (_delay(AOS_SSSP_DELAY, mask, (laststage != AOS_SSSP_STAGE_STARTUP_1_1), received) == AOS_SUCCESS) {
-        apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF);
+      if (_delay(AOS_SSSP_DELAY, mask, received) == AOS_SUCCESS) {
+        apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
         nextstage = AOS_SSSP_STAGE_STARTUP_1_2;
       }
 #else /* (AMIROOS_CFG_SSSP_MASTER == true) */
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask == 0);
       aosDbgCheck(received == NULL);
 
       // deactivate S signal and proceed
-      apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF);
+      apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
       nextstage = AOS_SSSP_STAGE_STARTUP_1_2;
 #endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
       break;
@@ -430,12 +561,11 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     case AOS_SSSP_STAGE_STARTUP_1_2:
     {
       aosDbgCheck(listener != NULL);
-      aosDbgCheck(flags != 0);
       aosDbgCheck(mask == listener->events);
       aosDbgCheck(received != NULL);
 
       // wait for the S signal to become inactive and proceed on success
-      if (_waitForS(listener, flags, APAL_GPIO_OFF, received) == AOS_SUCCESS) {
+      if (_waitForS(listener, APAL_GPIO_OFF, received) == AOS_SUCCESS) {
         nextstage = AOS_SSSP_STAGE_STARTUP_1_3;
       }
       break;
@@ -449,24 +579,22 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     {
 #if (AMIROOS_CFG_SSSP_MASTER == true)
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask != 0);
       aosDbgCheck(received != NULL);
 
       // delay execution and deactivate the S signal on success
-      if (_delay(AOS_SSSP_DELAY, mask, (laststage != AOS_SSSP_STAGE_STARTUP_1_3), received) == AOS_SUCCESS) {
-        apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON);
+      if (_delay(AOS_SSSP_DELAY, mask, received) == AOS_SUCCESS) {
+        apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_ON);
         nextstage = AOS_SSSP_STAGE_STARTUP_2_1;
       }
 #else /* (AMIROOS_CFG_SSSP_MASTER == true) */
       aosDbgCheck(listener != NULL);
-      aosDbgCheck(flags != 0);
       aosDbgCheck(mask == listener->events);
       aosDbgCheck(received != NULL);
 
       // wait for the S signal to become active and activate it as well and proceed on success
-      if (_waitForS(listener, flags, APAL_GPIO_ON, received) == AOS_SUCCESS) {
-        apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON);
+      if (_waitForS(listener, APAL_GPIO_ON, received) == AOS_SUCCESS) {
+        apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_ON);
         nextstage = AOS_SSSP_STAGE_STARTUP_2_1;
       }
 #endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
@@ -483,23 +611,23 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     {
 #if (AMIROOS_CFG_SSSP_MASTER == true)
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask != 0);
       aosDbgCheck(received != NULL);
 
       // delay execution and deactivate the S signal on success
-      if (_delay(AOS_SSSP_DELAY, mask, (laststage != AOS_SSSP_STAGE_STARTUP_2_1), received) == AOS_SUCCESS) {
-        apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF);
+      if (_delay(AOS_SSSP_DELAY, mask, received) == AOS_SUCCESS) {
+        apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
         nextstage = AOS_SSSP_STAGE_STARTUP_2_2;
+      } else {
+        aosprintf(".");
       }
 #else /* (AMIROOS_CFG_SSSP_MASTER == true) */
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask == 0);
       aosDbgCheck(received == NULL);
 
       // deactivate S signal and proceed
-      apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF);
+      apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
       nextstage = AOS_SSSP_STAGE_STARTUP_2_2;
       mask = 0;
 #endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
@@ -513,17 +641,16 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     case AOS_SSSP_STAGE_STARTUP_2_2:
     {
       aosDbgCheck(listener != NULL);
-      aosDbgCheck(flags != 0);
       aosDbgCheck(mask == listener->events);
       aosDbgCheck(received != NULL);
 
       // wait for the S signal to become inactive and proceed on success
-      if (_waitForS(listener, flags, APAL_GPIO_OFF, received) == AOS_SUCCESS) {
+      if (_waitForS(listener, APAL_GPIO_OFF, received) == AOS_SUCCESS) {
 #if (AMIROOS_CFG_SSSP_MSI == true)
         nextstage = AOS_SSSP_STAGE_STARTUP_3;
 #else /* (AMIROOS_CFG_SSSP_MSI == true) */
-        chSysLock();
         // start the internal uptime aggregation
+        chSysLock();
         aosSysStartUptimeS();
 #if (AMIROOS_CFG_SSSP_MASTER == true)
         // start toggling S for system synchronization
@@ -536,11 +663,10 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
       break;
     }
 
-#if (AMIROOS_CFG_SSSP_MSI == true)
-
-      //TODO
-
-#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+    /*
+     * PLEASE NOTE:
+     * Stage transitions during MSI are not hanlded by thins function but are executed in aosSsspMsi().
+     */
 
     /*
      * Invalid operation.
@@ -560,14 +686,13 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     case AOS_SSSP_STAGE_SHUTDOWN_1_2:
     {
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask == 0);
       aosDbgCheck(received == NULL);
 
       // delay execution
       aosThdUSleep(AOS_SSSP_DELAY);
       // deactivate S signal
-      apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF);
+      apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
       nextstage = AOS_SSSP_STAGE_SHUTDOWN_1_3;
       break;
     }
@@ -580,12 +705,11 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     case AOS_SSSP_STAGE_SHUTDOWN_1_3:
     {
       aosDbgCheck(listener != NULL);
-      aosDbgCheck(flags != 0);
       aosDbgCheck(mask == listener->events);
       aosDbgCheck(received != NULL);
 
       // wait for the S signal to become inactive and proceed on success
-      if (_waitForS(listener, flags, APAL_GPIO_OFF, received) == AOS_SUCCESS) {
+      if (_waitForS(listener, APAL_GPIO_OFF, received) == AOS_SUCCESS) {
         nextstage = AOS_SSSP_STAGE_SHUTDOWN_2_1;
       }
       break;
@@ -598,13 +722,12 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     case AOS_SSSP_STAGE_SHUTDOWN_2_1:
     {
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask == 0);
       aosDbgCheck(received != NULL);
 
       // evaluate PD signal
       apalControlGpioState_t pd;
-      apalControlGpioGet(&moduleSsspGpioPD, &pd);
+      apalControlGpioGet(moduleSsspSignalPD(), &pd);
       *received = (pd == APAL_GPIO_ON) ? (eventmask_t)~0 : 0;
       nextstage = AOS_SSSP_STAGE_SHUTDOWN_2_2;
       break;
@@ -616,7 +739,6 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
     case AOS_SSSP_STAGE_SHUTDOWN_2_2:
     {
       aosDbgCheck(listener == NULL);
-      aosDbgCheck(flags == 0);
       aosDbgCheck(mask == 0);
       aosDbgCheck(received == NULL);
 
@@ -642,6 +764,516 @@ aos_status_t aosSsspProceed(event_listener_t* listener, eventflags_t flags, even
   return status;
 }
 
+#if (AMIROOS_CFG_SSSP_MSI == true) || defined(__DOXYGEN__)
+
+/**
+ * @brief   Initialize MSI data structure.
+ *
+ * @param[out]  msidata       Pointer to the MSI data structure to be initialized.
+ * @param[in]   delayMask     Event maks used for delay events.
+ * @param[in]   timeoutMask   Event mask used for timeout events.
+ * @param[in]   gpioListener  Event listener for GPIO events.
+ */
+void aosSsspMsiInit(aos_ssspmsidata_t* msidata, eventmask_t delayMask, eventmask_t timeoutMask, event_listener_t* gpioListener)
+{
+  aosDbgCheck(msidata != NULL);
+  aosDbgCheck(gpioListener != NULL);
+
+  // register delay events
+  chEvtRegisterMask(&_delayEventSource, &_delayEventListener, delayMask);
+
+  // initialize timeout related data
+  chVTObjectInit(&msidata->timeout.timer);
+  chEvtObjectInit(&msidata->timeout.eventsource);
+  chEvtRegisterMask(&msidata->timeout.eventsource, &msidata->timeout.eventlistener, timeoutMask);
+
+  // set GPIO event information
+  msidata->signals.eventlistener = gpioListener;
+
+  // initialize BCB related data
+  msidata->bcb.lastid = AOS_SSSP_MODULEID_INVALID;
+
+  return;
+}
+
+/**
+ * @brief   Execute module stack initialization (MSI).
+ *
+ * @param[in]   msidata   Data required for MSI.
+ * @param[out]  received  Output variable to store the received event mask to.
+ */
+void aosSsspMsi(aos_ssspmsidata_t* msidata, eventmask_t* received)
+{
+  aosDbgCheck(msidata != NULL);
+  aosDbgCheck(received != NULL);
+
+  /*
+   * execute anything that does not depend on BCB messages or events
+   */
+  switch (aos.sssp.stage) {
+    case AOS_SSSP_STAGE_STARTUP_3:
+    case AOS_SSSP_STAGE_STARTUP_3_1:
+    {
+      aosDbgPrintf(">>> MSI init\n");
+      // setup timeout timer
+      chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+      // proceed
+#if (AMIROOS_CFG_SSSP_MASTER == true)
+      aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_1_BROADCASTINIT;
+#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
+      aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_1_WAITFORINIT;
+#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
+      break;
+    }
+
+#if (AMIROOS_CFG_SSSP_MASTER == true)
+    case AOS_SSSP_STAGE_STARTUP_3_1_BROADCASTINIT:
+    {
+      aosDbgPrintf("%u\tsend INIT\t", chVTGetSystemTime());
+      // send init command
+      msidata->bcb.message.type = AOS_SSSP_BCBMESSAGE_MSIINIT;
+      _serializeBcbMessage(msidata->bcb.buffer, msidata->bcb.message);
+      if (moduleSsspBcbTransmit(msidata->bcb.buffer, sizeof(aos_ssspbcbmessage_t)) == AOS_SSSP_BCB_SUCCESS) {
+        aosDbgPrintf("ok\tS+\t");
+        // activate S
+        apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_ON);
+        // restart timeout timer
+        chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+        // proceed
+#if (AMIROOS_CFG_SSSP_STACK_START == true)
+        aosDbgPrintf("->start\n");
+        aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_2;
+#else /* (AMIROOS_CFG_SSSP_STACK_START == true) */
+        aosDbgPrintf("->count\n");
+        aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT;
+#endif /* (AMIROOS_CFG_SSSP_STACK_START == true) */
+      } else {
+        aosDbgPrintf("fail\t->retry\n");
+        // retry in next iteration
+      }
+      break;
+    }
+#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
+
+#if (AMIROOS_CFG_SSSP_STACK_START == true)
+    case AOS_SSSP_STAGE_STARTUP_3_2:
+    {
+      aosDbgPrintf("%u\tstart\t", chVTGetSystemTime());
+      // set the own module ID
+      aos.sssp.moduleId = 1;
+      // broadcast the new ID
+      msidata->bcb.message.type = AOS_SSSP_BCBMESSAGE_MSIID;
+      msidata->bcb.message.payload.id = aos.sssp.moduleId;
+      aosDbgPrintf("bc ID (%u)\t", msidata->bcb.message.payload.id);
+      _serializeBcbMessage(msidata->bcb.buffer, msidata->bcb.message);
+      if (moduleSsspBcbTransmit(msidata->bcb.buffer, sizeof(aos_ssspbcbmessage_t)) == AOS_SSSP_BCB_SUCCESS) {
+        aosDbgPrintf("ok\t->count\n");
+        // restart timeout timer
+        chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+        // set delay timer so UP will be activated and S deactivated later
+        chVTSet(&_delayTimer, chTimeUS2I(AOS_SSSP_DELAY), _timerCallback, &_delayEventSource);
+        // store the transmitted ID
+        msidata->bcb.lastid = msidata->bcb.message.payload.id;
+        // proceed
+        aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT;
+      } else {
+        aosDbgPrintf("fail\t->retry\n");
+        // retry next iteration
+      }
+      break;
+    }
+#endif /* (AMIROOS_CFG_SSSP_STACK_START == true) */
+
+    case AOS_SSSP_STAGE_STARTUP_3_3_BROADCASTID:
+    {
+      // broadcast ID
+      msidata->bcb.message.type = AOS_SSSP_BCBMESSAGE_MSIID;
+      msidata->bcb.message.payload.id = aos.sssp.moduleId;
+      aosDbgPrintf("%u\tbc ID (%u)\t", chVTGetSystemTime(), msidata->bcb.message.payload.id);
+      _serializeBcbMessage(msidata->bcb.buffer, msidata->bcb.message);
+      if (moduleSsspBcbTransmit(msidata->bcb.buffer, sizeof(aos_ssspbcbmessage_t)) == AOS_SSSP_BCB_SUCCESS) {
+        aosDbgPrintf("ok->count\n");
+        // restart timeout timer
+        chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+        // set delay timer so UP will be activated and S deactivated later
+        chVTSet(&_delayTimer, chTimeUS2I(AOS_SSSP_DELAY), _timerCallback, &_delayEventSource);
+        // store the transmitted ID
+        msidata->bcb.lastid = msidata->bcb.message.payload.id;
+        // return to receiving
+        aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT;
+      } else {
+        aosDbgPrintf("fail\t->retry\n");
+        // retry next iteration
+      }
+      break;
+    }
+
+    case AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT:
+    {
+      aosDbgPrintf("%u\tabort\t", chVTGetSystemTime());
+      // reset timeout timer
+      chVTReset(&msidata->timeout.timer);
+      // transmit abort message
+      msidata->bcb.message.type = AOS_SSSP_BCBMESSAGE_MSIABORT;
+      _serializeBcbMessage(msidata->bcb.buffer, msidata->bcb.message);
+      if (moduleSsspBcbTransmit(msidata->bcb.buffer, sizeof(aos_ssspbcbmessage_t)) == AOS_SSSP_BCB_SUCCESS) {
+        aosDbgPrintf("ok\tS-\t->sync\n");
+        // deactivate S
+        apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
+        // proceed
+        aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_SYNC;
+      } else {
+        aosDbgPrintf("fail\t->retry\n");
+        // retry next iteration
+      }
+      break;
+    }
+
+    default:
+    {
+      // all other stages depend on events or BCB messages and are thus handled below
+      break;
+    }
+  }
+
+  /*
+   * handle BCB messages
+   */
+  msidata->bcb.status = moduleSsspBcbReceive(msidata->bcb.buffer, sizeof(aos_ssspbcbmessage_t));
+  switch (msidata->bcb.status) {
+
+    /* VALID BCB MESSAGE
+     * A message was received via BCB that seems to be plausible.
+     * The first BCB message initiates the sequence once.
+     * During MSI an arbitrary number of IDs will be received.
+     * Abort messages can be received at any time.
+     */
+    case AOS_SSSP_BCB_SUCCESS:
+    {
+      aosDbgPrintf("%u\tBCB\t", chVTGetSystemTime());
+      // deserialize message and handle types differently
+      _deserializeBcbMessage(&msidata->bcb.message, msidata->bcb.buffer);
+      switch (msidata->bcb.message.type) {
+        // initialization message
+        case AOS_SSSP_BCBMESSAGE_MSIINIT:
+        {
+#if (AMIROOS_CFG_SSSP_MASTER == true)
+          aosDbgPrintf("INIT\t->abort\n");
+          // initiate abortion
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+#else /* (AMIROOS_CFG_SSSP_MASTER == true) */
+          aosDbgPrintf("INIT\t");
+          // check for correct SSSP stage
+          if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1_WAITFORINIT) {
+            aosDbgPrintf("S+\t");
+            // activate S
+            apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_ON);
+            // restart timeout timer
+            chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+            // proceed
+#if (AMIROOS_CFG_SSSP_STACK_START == true)
+            aosDbgPrintf("->start\n");
+            aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_2;
+#else /* (AMIROOS_CFG_SSSP_STACK_START == true) */
+            aosDbgPrintf("->count\n");
+            aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT;
+#endif /* (AMIROOS_CFG_SSSP_STACK_START == true) */
+          } else {
+            aosDbgPrintf("->abort\n");
+            // initiate abortion
+            aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+          }
+#endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
+          break;
+        }
+        // ID message
+        case AOS_SSSP_BCBMESSAGE_MSIID:
+        {
+          aosDbgPrintf("ID (%u)\t", msidata->bcb.message.payload.id);
+          // check for correct stage and whether ID was increased
+          if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT &&
+              msidata->bcb.message.payload.id > msidata->bcb.lastid) {
+            aosDbgPrintf("ok\n");
+            // restart timeout timer
+            chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+            // store ID
+            msidata->bcb.lastid = msidata->bcb.message.payload.id;
+          } else {
+            aosDbgPrintf("fail\t->abort\n");
+            // initiate abortion
+            aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+          }
+          break;
+        }
+        // abort message
+        case AOS_SSSP_BCBMESSAGE_MSIABORT:
+        {
+          aosDbgPrintf("ABORT\tS-\t->sync\n");
+          // reset timeout timer
+          chVTReset(&msidata->timeout.timer);
+          // deactivate S
+          apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
+          // proceed to abort synchronization
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_SYNC;
+          break;
+        }
+        // invalid message
+        default:
+        {
+          aosDbgPrintf("invalid\t->abort\n");
+          // initiate abortion
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+          break;
+        }
+      }
+      return;
+    }
+
+    /* INVALID BCB MESSAGE
+     * An obviously invalid message was received via BCB.
+     */
+    case AOS_SSSP_BCB_INVALIDMSG:
+    {
+      // error but ignore
+      aosDbgPrintf("WARNING: unknown message received via BCB\n");
+      break;
+    }
+
+    /* NO BCB MESSAGE
+     * No message was received via BCB at all.
+     */
+    case AOS_SSSP_BCB_ERROR:
+    {
+      // do nothing and proceed
+      break;
+    }
+  }
+
+  /*
+   * handle events
+   */
+  *received = chEvtWaitOneTimeout(ALL_EVENTS, TIME_IMMEDIATE);
+  /* TIMEOUT EVENT
+   * Timeouts can occur at any time during MSI after they have been initialized.
+   * As soon as the module has made it to the 3.4 completion stage, there will be no more timeouts, though.
+   */
+  if (*received & msidata->timeout.eventlistener.events) {
+    aosDbgPrintf("%u\ttimeout\t", chVTGetSystemTime());
+    // special cases
+    if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1_WAITFORINIT ||
+        aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_4_COMPLETION) {
+      // master did not initiate the sequence
+      if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_1_WAITFORINIT) {
+        aosDbgPrintf("no init\t->operation\n");
+        // invalidate module ID
+        aos.sssp.moduleId = AOS_SSSP_MODULEID_INVALID;
+        aosDbgPrintf("<<< MSI skipped\n");
+      }
+      // no abort messages received after completion
+      else /* if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_4_COMPLETION) */ {
+        aosDbgPrintf("success\t->operation\n");
+        aosDbgPrintf("<<< MSI completed\n");
+      }
+      // cleanup and proceed to operation phase
+      _msiOutro(msidata);
+    }
+    // general timeout
+    else {
+      aosDbgPrintf("->abort\n");
+      // initiate active abort
+      aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+    }
+    // clear event
+    chEvtGetAndClearFlags(&msidata->timeout.eventlistener);
+    *received &= ~(msidata->timeout.eventlistener.events);
+  }
+  /* DELAY EVENT
+   * Delays are only used to toggle the UP signal.
+   */
+  else if (*received & _delayEventListener.events) {
+    aosDbgPrintf("%u\tdelay\t", chVTGetSystemTime());
+#if (AMIROOS_CFG_SSSP_STACK_END == true)
+    apalControlGpioState_t s;
+    aosDbgPrintf("S-\t");
+    // deactivate S
+    apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
+    // verify deactivation
+    apalControlGpioGet(moduleSsspSignalS(), &s);
+    if (s == APAL_GPIO_OFF) {
+      aosDbgPrintf("ok\t->done\n");
+      // set the timeout timer so no abort messages are missed
+      chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+      // proceed to the completion stage
+      aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_COMPLETION;
+    } else {
+      aosDbgPrintf("fail\t->abort\n");
+      // initiate active abort
+      aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+    }
+#else /* (AMIROOS_CFG_SSSP_STACK_END == true) */
+    apalControlGpioState_t s;
+    // read the current state of the UP signal
+    apalControlGpioGet(moduleSsspSignalUP(), &s);
+    if (s == APAL_GPIO_OFF) {
+      aosDbgPrintf("UP+ & S-\n");
+      // activate UP in order to trigger the next module
+      apalControlGpioSet(moduleSsspSignalUP(), APAL_GPIO_ON);
+      // deactivate S
+      apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
+      // set the delay timer so the UP signal will get deactivated again later
+      chVTSet(&_delayTimer, chTimeUS2I(AOS_SSSP_DELAY), _timerCallback, &_delayEventSource);
+    } else {
+      aosDbgPrintf("UP-\n");
+      // deactvate UP
+      apalControlGpioSet(moduleSsspSignalUP(), APAL_GPIO_OFF);
+    }
+#endif /* (AMIROOS_CFG_SSSP_STACK_END == true) */
+    // clear event
+    chEvtGetAndClearFlags(&_delayEventListener);
+    *received &= ~(_delayEventListener.events);
+  }
+  /* GPIO EVENT
+   * GPIO events can occurr at any time, but only DN and S events are expected.
+   * DN may be activated only once per module to trigger the counting process and is deactivated briefly after activation.
+   * S must only deactivate when MSI is comleted by the last module in the stack.
+   */
+  else if (*received & msidata->signals.eventlistener->events) {
+    aosDbgPrintf("%u\tGPIO\t", chVTGetSystemTime());
+    apalControlGpioState_t s;
+    // fetch event flags
+    eventflags_t flags = chEvtGetAndClearFlags(msidata->signals.eventlistener);
+#if (AMIROOS_CFG_SSSP_STACK_START != true)
+    // if the DN signal was triggered
+    if (flags & moduleSsspEventflagDN()) {
+      // read the signal state
+      apalControlGpioGet(moduleSsspSignalDN(), &s);
+      // rising edge
+      if (s == APAL_GPIO_ON) {
+        aosDbgPrintf("+DN\t");
+        // Correct SSSP stage and no ID assigned yet?
+        if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT &&
+            aos.sssp.moduleId == AOS_SSSP_MODULEID_INVALID) {
+          // set the own module ID
+          aos.sssp.moduleId = msidata->bcb.lastid + 1;
+          aosDbgPrintf("set ID (%u)\t->bc ID\n", aos.sssp.moduleId);
+          // proceed to broadcasting
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_3_BROADCASTID;
+        }
+        // incorrect SSSP stage or ID already assigned (triggered for a second time)
+        else {
+          aosDbgPrintf("->abort\n");
+          // initiate active abort
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+        }
+      }
+      // falling egde
+      else {
+        aosDbgPrintf("-DN\n");
+        // ignored
+      }
+      // clear DN flags
+      flags &= ~moduleSsspEventflagDN();
+    }
+#endif /* (AMIROOS_CFG_SSSP_STACK_START != true) */
+#if (AMIROOS_CFG_SSSP_STACK_END != true)
+    // if the UP signal was triggered
+    if (flags & moduleSsspEventflagUP()) {
+      /*
+       * The UP signal is acting as output only.
+       * Any events resulting from toggling the signal are thus ignored.
+       */
+      aosDbgPrintf("?UP\n");
+      // clear UP flags
+      flags &= ~moduleSsspEventflagUP();
+    }
+#endif /* (AMIROOS_CFG_SSSP_STACK_END != true) */
+    // if the S signal was triggered
+    if (flags & moduleSsspEventflagS()) {
+      // read the signal state
+      apalControlGpioGet(moduleSsspSignalS(), &s);
+      // rising edge
+      if (s == APAL_GPIO_ON) {
+        aosDbgPrintf("+S\n");
+        // ignored
+      }
+      // falling edge
+      else {
+        aosDbgPrintf("-S\t");
+        // special case
+        if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_SYNC) {
+          aosDbgPrintf("->operation\n");
+          // invalidate module ID
+          aos.sssp.moduleId = AOS_SSSP_MODULEID_INVALID;
+          // proceed
+          aosDbgPrintf("<<< MSI aborted\n");
+          _msiOutro(msidata);
+        }
+#if (AMIROOS_CFG_SSSP_STACK_END == true)
+        // Correct SSSP stage?
+        else if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_4_COMPLETION) {
+          aosDbgPrintf("ok\n");
+          // ignored
+        } else {
+          aosDbgPrintf("->abort\n");
+          // initialize abortion
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+        }
+#else /* (AMIROOS_CFG_SSSP_STACK_END == true) */
+        // Correct SSSP stage and ID assigned?
+        else if (aos.sssp.stage == AOS_SSSP_STAGE_STARTUP_3_3_WAIT4EVENT &&
+            aos.sssp.moduleId != AOS_SSSP_MODULEID_INVALID) {
+          aosDbgPrintf("->done\n");
+          // set the timeout timer so no abort messages are missed
+          chVTSet(&msidata->timeout.timer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &msidata->timeout.eventsource);
+          // proceed to the completion stage
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_COMPLETION;
+        } else {
+          aosDbgPrintf("->abort\n");
+          // initiate abortion
+          aos.sssp.stage = AOS_SSSP_STAGE_STARTUP_3_4_ABORTION_INIT;
+        }
+#endif /* (AMIROOS_CFG_SSSP_STACK_END == true) */
+      }
+      // clear S flags
+      flags &= ~moduleSsspEventflagS();
+    }
+    // any further flags set?
+    if (flags) {
+      aosDbgPrintf("0x%08X\n", flags);
+      // reassign remaining flags and do not clear event mask
+      msidata->signals.eventlistener->flags |= flags;
+    } else {
+      // clear event
+      *received &= ~(msidata->signals.eventlistener->events);
+    }
+  }
+  /* OTHER EVENT
+   * Any other events may occur as well but are not handled by this function
+   */
+  else if (*received != 0){
+    aosDbgPrintf("%u\tOTHER\t0x%08X\n", chVTGetSystemTime(), *received);
+    // do not clear the event mask
+  }
+
+  return;
+}
+
+#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
+
+#if ((AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__)
+
+/**
+ * @brief   Retreive the offset between local clock and system synchronization signal.
+ *
+ * @return
+ */
+inline float aosSsspGetSyncSkew(void)
+{
+  return _syncskew;
+}
+
+#endif /* (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */
+
 /**
  * @brief   Leave the operation pahse and initiate or acknowledge shutdown.
  *
@@ -656,7 +1288,7 @@ void aosSsspShutdownInit(bool active)
 
   // activate PD if this was an active shutdown initiation
   if (active) {
-    apalControlGpioSet(&moduleSsspGpioPD, APAL_GPIO_ON);
+    apalControlGpioSet(moduleSsspSignalPD(), APAL_GPIO_ON);
   }
 
 #if (AMIROOS_CFG_SSSP_MASTER == true)
@@ -665,7 +1297,7 @@ void aosSsspShutdownInit(bool active)
 #endif /* (AMIROOS_CFG_SSSP_MASTER == true) */
 
   // activate S
-  apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON);
+  apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_ON);
 
   // proceed in the shutdown phase
   aos.sssp.stage = AOS_SSSP_STAGE_SHUTDOWN_1_2;
@@ -690,9 +1322,9 @@ void aosSsspShutdownBroadcastIdentifier(unsigned int identifier)
       aosThdUSleep(AOS_SSSP_DELAY);
 
       // activate S for one AOS_SSSP_DELAY.
-      apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_ON);
+      apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_ON);
       aosThdUSleep(AOS_SSSP_DELAY);
-      apalControlGpioSet(&moduleSsspGpioS, APAL_GPIO_OFF);
+      apalControlGpioSet(moduleSsspSignalS(), APAL_GPIO_OFF);
     }
   }
 
@@ -728,8 +1360,8 @@ eventmask_t aosSsspShutdownWaitForIdentifierPulse(event_listener_t* gpiolistener
 
   // arm the timer once
   if (!chVTIsArmed(&_delayTimer)) {
-    chEvtRegisterMask(&_eventSourceDelay, &_eventListenerDelay, timermask);
-    chVTSet(&_delayTimer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &_eventSourceDelay);
+    chEvtRegisterMask(&_delayEventSource, &_delayEventListener, timermask);
+    chVtSet(&_delayTimer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &_delayEventSource);
   }
 
   // wait for any event to occur (do not apply any filters in order not to miss any events)
@@ -739,23 +1371,22 @@ eventmask_t aosSsspShutdownWaitForIdentifierPulse(event_listener_t* gpiolistener
   if (mask & gpiolistener->events) {
     // retreive flags without clearing them
     flags = gpiolistener->flags;
-    apalControlGpioGet(&moduleSsspGpioS, &sstate);
+    apalControlGpioGet(moduleSsspSignalS(), &sstate);
     if (flags == sflags) {
-      apalControlGpioGet(&moduleSsspGpioS, &sstate);
+      apalControlGpioGet(moduleSsspSignalS(), &sstate);
       // if this was the end of a pulse
       if (sstate == APAL_GPIO_OFF) {
         // restart the timer
-        chVTReset(&_delayTimer);
-        chVTSet(&_delayTimer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &_eventSourceDelay);
+        chVtSet(&_delayTimer, chTimeUS2I(AOS_SSSP_TIMEOUT), _timerCallback, &_delayEventSource);
         // increment the identifier
         ++(*identifier);
       }
     }
   }
   // timer event
-  else if (mask & _eventListenerDelay.events) {
+  else if (mask & _delayEventListener.events) {
     // unregister event
-    chEvtUnregister(&_eventSourceDelay, &_eventListenerDelay);
+    chEvtUnregister(&_delayEventSource, &_delayEventListener);
   }
   // any further events must be handled externally
 
@@ -764,20 +1395,6 @@ eventmask_t aosSsspShutdownWaitForIdentifierPulse(event_listener_t* gpiolistener
 
 #endif /* (AMIROOS_CFG_SSSP_SHUTDOWN == true) */
 
-#if ((AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true)) || defined(__DOXYGEN__)
-
-/**
- * @brief   Retreive the offset between local clock and system synchronization signal.
- *
- * @return
- */
-float aosSsspGetSyncSkew(void)
-{
-  return _syncskew;
-}
-
-#endif /* (AMIROOS_CFG_SSSP_MASTER != true) && (AMIROOS_CFG_PROFILE == true) */
-
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 
 /** @} */
diff --git a/core/src/aos_system.c b/core/src/aos_system.c
index 89b59e1..8a6b16a 100644
--- a/core/src/aos_system.c
+++ b/core/src/aos_system.c
@@ -276,15 +276,11 @@ static void _printSystemInfo(BaseSequentialStream* stream)
   // print dynamic information about the module
   _printSystemInfoSeparator(stream, '-', SYSTEM_INFO_WIDTH);
 #if (AMIROOS_CFG_SSSP_ENABLE == true)
-#if (AMIROOS_CFG_SSSP_MSI == true)
   if (aos.sssp.moduleId != 0) {
     _printSystemInfoLine(stream, "Module ID", SYSTEM_INFO_NAMEWIDTH, "%u", aos.sssp.moduleId);
   } else {
     _printSystemInfoLine(stream, "Module ID", SYSTEM_INFO_NAMEWIDTH, "not available");
   }
-#else /* (AMIROOS_CFG_SSSP_MSI == true) */
-  _printSystemInfoLine(stream, "Module ID", SYSTEM_INFO_NAMEWIDTH, "not available");
-#endif /* (AMIROOS_CFG_SSSP_MSI == true) */
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 #if (HAL_USE_RTC == TRUE)
   _printSystemInfoLine(stream, "Date", SYSTEM_INFO_NAMEWIDTH, "%04u-%02u-%02u (%s)",
diff --git a/modules/DiWheelDrive_1-1/aosconf.h b/modules/DiWheelDrive_1-1/aosconf.h
index fbac3a8..ba96e60 100644
--- a/modules/DiWheelDrive_1-1/aosconf.h
+++ b/modules/DiWheelDrive_1-1/aosconf.h
@@ -161,14 +161,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   In order to execute MSI, a broadcast bus (BCB) and according interfaces must be defined.
  */
 #if !defined(OS_CFG_SSSP_MSI)
-  #define AMIROOS_CFG_SSSP_MSI                  false
+  #define AMIROOS_CFG_SSSP_MSI                  true
 #else
   #define AMIROOS_CFG_SSSP_MSI                  OS_CFG_SSSP_MSI
 #endif
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/DiWheelDrive_1-1/module.c b/modules/DiWheelDrive_1-1/module.c
index b401687..9a7b912 100644
--- a/modules/DiWheelDrive_1-1/module.c
+++ b/modules/DiWheelDrive_1-1/module.c
@@ -24,7 +24,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
+
+#include <string.h>
 
 /*===========================================================================*/
 /**
@@ -352,6 +354,67 @@ ROMCONST char* moduleShellPrompt = "DiWheelDrive";
  */
 /*===========================================================================*/
 
+#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true)) || defined(__DOXYGEN__)
+
+/* some local definitions */
+// maximum number of bytes per CAN frame
+#define CAN_BYTES_PER_FRAME                     8
+// identifier (as dominant as possible)
+#define MSI_BCBMSG_CANID                        0
+
+aos_ssspbcbstatus_t moduleSsspBcbTransmit(const uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANTxFrame frame;
+
+  // setup the common parts of the message frame
+  frame.DLC = (uint8_t)length;
+  frame.RTR = CAN_RTR_DATA;
+  frame.IDE = CAN_IDE_STD;
+  frame.SID = MSI_BCBMSG_CANID;
+  memcpy(frame.data8, buffer, length);
+
+  // sent the frame and return
+  return (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) ? AOS_SSSP_BCB_SUCCESS : AOS_SSSP_BCB_ERROR;
+}
+
+aos_ssspbcbstatus_t moduleSsspBcbReceive(uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANRxFrame frame;
+
+  // receive a frame and check for errors
+  if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) {
+    // a correct frame was received
+    if (frame.DLC == length &&
+        frame.RTR == CAN_RTR_DATA &&
+        frame.IDE == CAN_IDE_STD &&
+        frame.SID == MSI_BCBMSG_CANID) {
+      // success: fetch the data and return
+      memcpy(buffer, frame.data8, length);
+      return AOS_SSSP_BCB_SUCCESS;
+    }
+    // an unexpected frame was received
+    else {
+      return AOS_SSSP_BCB_INVALIDMSG;
+    }
+  } else {
+    // failure: return with error
+    return AOS_SSSP_BCB_ERROR;
+  }
+}
+
+#undef MSI_BCBMSG_CANID
+#undef CAN_BYTES_PER_FRAME
+
+#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true) */
+
 /** @} */
 
 /*===========================================================================*/
diff --git a/modules/DiWheelDrive_1-1/module.h b/modules/DiWheelDrive_1-1/module.h
index efd3a02..0193b84 100644
--- a/modules/DiWheelDrive_1-1/module.h
+++ b/modules/DiWheelDrive_1-1/module.h
@@ -398,35 +398,14 @@ extern ROMCONST char* moduleShellPrompt;
  */
 /*===========================================================================*/
 
-/**
- * @brief   PD signal GPIO.
- */
-#define moduleSsspGpioPD                        moduleGpioSysPd
-
-/**
- * @brief   S signal GPIO.
- */
-#define moduleSsspGpioS                         moduleGpioSysSync
+#define moduleSsspSignalPD()                    (&moduleGpioSysPd)
+#define moduleSsspEventflagPD()                 MODULE_OS_GPIOEVENTFLAG_SYSPD
 
-/**
- * @brief   UP signal GPIO.
- */
-#define moduleSsspGpioUP                        moduleGpioSysUartUp
+#define moduleSsspSignalS()                     (&moduleGpioSysSync)
+#define moduleSsspEventflagS()                  MODULE_OS_GPIOEVENTFLAG_SYSSYNC
 
-/**
- * @brief   Event flag for PD signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_PD                MODULE_OS_GPIOEVENTFLAG_SYSPD
-
-/**
- * @brief   Event flag for S signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_S                 MODULE_OS_GPIOEVENTFLAG_SYSSYNC
-
-/**
- * @brief   Event flag for UP signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_UP                MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
+#define moduleSsspSignalUP()                    (&moduleGpioSysUartUp)
+#define moduleSsspEventflagUP()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
 
 /** @} */
 
diff --git a/modules/DiWheelDrive_1-2/aosconf.h b/modules/DiWheelDrive_1-2/aosconf.h
index 4d8765d..8bb97df 100644
--- a/modules/DiWheelDrive_1-2/aosconf.h
+++ b/modules/DiWheelDrive_1-2/aosconf.h
@@ -161,14 +161,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   In order to execute MSI, a broadcast bus (BCB) and according interfaces must be defined.
  */
 #if !defined(OS_CFG_SSSP_MSI)
-  #define AMIROOS_CFG_SSSP_MSI                  false
+  #define AMIROOS_CFG_SSSP_MSI                  true
 #else
   #define AMIROOS_CFG_SSSP_MSI                  OS_CFG_SSSP_MSI
 #endif
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/DiWheelDrive_1-2/module.c b/modules/DiWheelDrive_1-2/module.c
index 6cb2f6d..4242041 100644
--- a/modules/DiWheelDrive_1-2/module.c
+++ b/modules/DiWheelDrive_1-2/module.c
@@ -24,7 +24,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
+
+#include <string.h>
 
 /*===========================================================================*/
 /**
@@ -349,6 +351,67 @@ ROMCONST char* moduleShellPrompt = "DiWheelDrive";
  */
 /*===========================================================================*/
 
+#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true)) || defined(__DOXYGEN__)
+
+/* some local definitions */
+// maximum number of bytes per CAN frame
+#define CAN_BYTES_PER_FRAME                     8
+// identifier (as dominant as possible)
+#define MSI_BCBMSG_CANID                        0
+
+aos_ssspbcbstatus_t moduleSsspBcbTransmit(const uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANTxFrame frame;
+
+  // setup the common parts of the message frame
+  frame.DLC = (uint8_t)length;
+  frame.RTR = CAN_RTR_DATA;
+  frame.IDE = CAN_IDE_STD;
+  frame.SID = MSI_BCBMSG_CANID;
+  memcpy(frame.data8, buffer, length);
+
+  // sent the frame and return
+  return (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) ? AOS_SSSP_BCB_SUCCESS : AOS_SSSP_BCB_ERROR;
+}
+
+aos_ssspbcbstatus_t moduleSsspBcbReceive(uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANRxFrame frame;
+
+  // receive a frame and check for errors
+  if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) {
+    // a correct frame was received
+    if (frame.DLC == length &&
+        frame.RTR == CAN_RTR_DATA &&
+        frame.IDE == CAN_IDE_STD &&
+        frame.SID == MSI_BCBMSG_CANID) {
+      // success: fetch the data and return
+      memcpy(buffer, frame.data8, length);
+      return AOS_SSSP_BCB_SUCCESS;
+    }
+    // an unexpected frame was received
+    else {
+      return AOS_SSSP_BCB_INVALIDMSG;
+    }
+  } else {
+    // failure: return with error
+    return AOS_SSSP_BCB_ERROR;
+  }
+}
+
+#undef MSI_BCBMSG_CANID
+#undef CAN_BYTES_PER_FRAME
+
+#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true) */
+
 /** @} */
 
 /*===========================================================================*/
diff --git a/modules/DiWheelDrive_1-2/module.h b/modules/DiWheelDrive_1-2/module.h
index a40e0e3..ef09b62 100644
--- a/modules/DiWheelDrive_1-2/module.h
+++ b/modules/DiWheelDrive_1-2/module.h
@@ -368,35 +368,14 @@ extern ROMCONST char* moduleShellPrompt;
  */
 /*===========================================================================*/
 
-/**
- * @brief   PD signal GPIO.
- */
-#define moduleSsspGpioPD                        moduleGpioSysPd
-
-/**
- * @brief   S signal GPIO.
- */
-#define moduleSsspGpioS                         moduleGpioSysSync
+#define moduleSsspSignalPD()                    (&moduleGpioSysPd)
+#define moduleSsspEventflagPD()                 MODULE_OS_GPIOEVENTFLAG_SYSPD
 
-/**
- * @brief   UP signal GPIO.
- */
-#define moduleSsspGpioUP                        moduleGpioSysUartUp
+#define moduleSsspSignalS()                     (&moduleGpioSysSync)
+#define moduleSsspEventflagS()                  MODULE_OS_GPIOEVENTFLAG_SYSSYNC
 
-/**
- * @brief   Event flag for PD signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_PD                MODULE_OS_GPIOEVENTFLAG_SYSPD
-
-/**
- * @brief   Event flag for S signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_S                 MODULE_OS_GPIOEVENTFLAG_SYSSYNC
-
-/**
- * @brief   Event flag for UP signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_UP                MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
+#define moduleSsspSignalUP()                    (&moduleGpioSysUartUp)
+#define moduleSsspEventflagUP()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
 
 /** @} */
 
diff --git a/modules/LightRing_1-0/aosconf.h b/modules/LightRing_1-0/aosconf.h
index 4f1a7e7..747bb25 100644
--- a/modules/LightRing_1-0/aosconf.h
+++ b/modules/LightRing_1-0/aosconf.h
@@ -161,14 +161,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   In order to execute MSI, a broadcast bus (BCB) and according interfaces must be defined.
  */
 #if !defined(OS_CFG_SSSP_MSI)
-  #define AMIROOS_CFG_SSSP_MSI                  false
+  #define AMIROOS_CFG_SSSP_MSI                  true
 #else
   #define AMIROOS_CFG_SSSP_MSI                  OS_CFG_SSSP_MSI
 #endif
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/LightRing_1-0/module.c b/modules/LightRing_1-0/module.c
index 73c8281..1d91d2e 100644
--- a/modules/LightRing_1-0/module.c
+++ b/modules/LightRing_1-0/module.c
@@ -24,7 +24,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
+
+#include <string.h>
 
 /*===========================================================================*/
 /**
@@ -244,6 +246,67 @@ ROMCONST char* moduleShellPrompt = "LightRing";
  */
 /*===========================================================================*/
 
+#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true)) || defined(__DOXYGEN__)
+
+/* some local definitions */
+// maximum number of bytes per CAN frame
+#define CAN_BYTES_PER_FRAME                     8
+// identifier (as dominant as possible)
+#define MSI_BCBMSG_CANID                        0
+
+aos_ssspbcbstatus_t moduleSsspBcbTransmit(const uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANTxFrame frame;
+
+  // setup the common parts of the message frame
+  frame.DLC = (uint8_t)length;
+  frame.RTR = CAN_RTR_DATA;
+  frame.IDE = CAN_IDE_STD;
+  frame.SID = MSI_BCBMSG_CANID;
+  memcpy(frame.data8, buffer, length);
+
+  // sent the frame and return
+  return (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) ? AOS_SSSP_BCB_SUCCESS : AOS_SSSP_BCB_ERROR;
+}
+
+aos_ssspbcbstatus_t moduleSsspBcbReceive(uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANRxFrame frame;
+
+  // receive a frame and check for errors
+  if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) {
+    // a correct frame was received
+    if (frame.DLC == length &&
+        frame.RTR == CAN_RTR_DATA &&
+        frame.IDE == CAN_IDE_STD &&
+        frame.SID == MSI_BCBMSG_CANID) {
+      // success: fetch the data and return
+      memcpy(buffer, frame.data8, length);
+      return AOS_SSSP_BCB_SUCCESS;
+    }
+    // an unexpected frame was received
+    else {
+      return AOS_SSSP_BCB_INVALIDMSG;
+    }
+  } else {
+    // failure: return with error
+    return AOS_SSSP_BCB_ERROR;
+  }
+}
+
+#undef MSI_BCBMSG_CANID
+#undef CAN_BYTES_PER_FRAME
+
+#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true) */
+
 /** @} */
 
 /*===========================================================================*/
diff --git a/modules/LightRing_1-0/module.h b/modules/LightRing_1-0/module.h
index 91234b5..d633309 100644
--- a/modules/LightRing_1-0/module.h
+++ b/modules/LightRing_1-0/module.h
@@ -266,35 +266,14 @@ extern ROMCONST char* moduleShellPrompt;
  */
 /*===========================================================================*/
 
-/**
- * @brief   PD signal GPIO.
- */
-#define moduleSsspGpioPD                        moduleGpioSysPd
-
-/**
- * @brief   S signal GPIO.
- */
-#define moduleSsspGpioS                         moduleGpioSysSync
+#define moduleSsspSignalPD()                    (&moduleGpioSysPd)
+#define moduleSsspEventflagPD()                 MODULE_OS_GPIOEVENTFLAG_SYSPD
 
-/**
- * @brief   DN signal GPIO.
- */
-#define moduleSsspGpioDN                        moduleGpioSysUartDn
+#define moduleSsspSignalS()                     (&moduleGpioSysSync)
+#define moduleSsspEventflagS()                  MODULE_OS_GPIOEVENTFLAG_SYSSYNC
 
-/**
- * @brief   Event flag for PD signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_PD                MODULE_OS_GPIOEVENTFLAG_SYSPD
-
-/**
- * @brief   Event flag for S signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_S                 MODULE_OS_GPIOEVENTFLAG_SYSSYNC
-
-/**
- * @brief   Event flag for DN signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_DN                MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
+#define moduleSsspSignalDN()                    (&moduleGpioSysUartDn)
+#define moduleSsspEventflagDN()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
 
 /** @} */
 
diff --git a/modules/LightRing_1-2/aosconf.h b/modules/LightRing_1-2/aosconf.h
index af0db51..66eddd5 100644
--- a/modules/LightRing_1-2/aosconf.h
+++ b/modules/LightRing_1-2/aosconf.h
@@ -161,14 +161,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   In order to execute MSI, a broadcast bus (BCB) and according interfaces must be defined.
  */
 #if !defined(OS_CFG_SSSP_MSI)
-  #define AMIROOS_CFG_SSSP_MSI                  false
+  #define AMIROOS_CFG_SSSP_MSI                  true
 #else
   #define AMIROOS_CFG_SSSP_MSI                  OS_CFG_SSSP_MSI
 #endif
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/LightRing_1-2/module.c b/modules/LightRing_1-2/module.c
index d142636..afed4fb 100644
--- a/modules/LightRing_1-2/module.c
+++ b/modules/LightRing_1-2/module.c
@@ -24,7 +24,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
+
+#include <string.h>
 
 /*===========================================================================*/
 /**
@@ -522,6 +524,67 @@ ROMCONST char* moduleShellPrompt = "LightRing";
  */
 /*===========================================================================*/
 
+#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true)) || defined(__DOXYGEN__)
+
+/* some local definitions */
+// maximum number of bytes per CAN frame
+#define CAN_BYTES_PER_FRAME                     8
+// identifier (as dominant as possible)
+#define MSI_BCBMSG_CANID                        0
+
+aos_ssspbcbstatus_t moduleSsspBcbTransmit(const uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANTxFrame frame;
+
+  // setup the common parts of the message frame
+  frame.DLC = (uint8_t)length;
+  frame.RTR = CAN_RTR_DATA;
+  frame.IDE = CAN_IDE_STD;
+  frame.SID = MSI_BCBMSG_CANID;
+  memcpy(frame.data8, buffer, length);
+
+  // sent the frame and return
+  return (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) ? AOS_SSSP_BCB_SUCCESS : AOS_SSSP_BCB_ERROR;
+}
+
+aos_ssspbcbstatus_t moduleSsspBcbReceive(uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANRxFrame frame;
+
+  // receive a frame and check for errors
+  if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) {
+    // a correct frame was received
+    if (frame.DLC == length &&
+        frame.RTR == CAN_RTR_DATA &&
+        frame.IDE == CAN_IDE_STD &&
+        frame.SID == MSI_BCBMSG_CANID) {
+      // success: fetch the data and return
+      memcpy(buffer, frame.data8, length);
+      return AOS_SSSP_BCB_SUCCESS;
+    }
+    // an unexpected frame was received
+    else {
+      return AOS_SSSP_BCB_INVALIDMSG;
+    }
+  } else {
+    // failure: return with error
+    return AOS_SSSP_BCB_ERROR;
+  }
+}
+
+#undef MSI_BCBMSG_CANID
+#undef CAN_BYTES_PER_FRAME
+
+#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true) */
+
 /** @} */
 
 /*===========================================================================*/
diff --git a/modules/LightRing_1-2/module.h b/modules/LightRing_1-2/module.h
index ac44ae5..1c93cec 100644
--- a/modules/LightRing_1-2/module.h
+++ b/modules/LightRing_1-2/module.h
@@ -413,45 +413,14 @@ extern ROMCONST char* moduleShellPrompt;
  */
 /*===========================================================================*/
 
-/**
- * @brief   PD signal GPIO.
- */
-#define moduleSsspGpioPD                        moduleGpioSysPd
+#define moduleSsspSignalPD()                    (&moduleGpioSysPd)
+#define moduleSsspEventflagPD()                 MODULE_OS_GPIOEVENTFLAG_SYSPD
 
-/**
- * @brief   S signal GPIO.
- */
-#define moduleSsspGpioS                         moduleGpioSysSync
+#define moduleSsspSignalS()                     (&moduleGpioSysSync)
+#define moduleSsspEventflagS()                  MODULE_OS_GPIOEVENTFLAG_SYSSYNC
 
-/**
- * @brief   UP signal GPIO.
- */
-#define moduleSsspGpioUP                        moduleGpioSysUartUp
-
-/**
- * @brief   DN signal GPIO.
- */
-#define moduleSsspGpioDN                        moduleGpioSysUartDn
-
-/**
- * @brief   Event flag for PD signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_PD                MODULE_OS_GPIOEVENTFLAG_SYSPD
-
-/**
- * @brief   Event flag for S signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_S                 MODULE_OS_GPIOEVENTFLAG_SYSSYNC
-
-/**
- * @brief   Event flag for UP signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_UP                MODULE_OS_GPIOEVENTFLAGS_SYSUARTUP
-
-/**
- * @brief   Event flag for DN signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_DN                MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
+#define moduleSsspSignalDN()                    (&moduleGpioSysUartDn)
+#define moduleSsspEventflagDN()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
 
 /** @} */
 
diff --git a/modules/NUCLEO-F103RB/aosconf.h b/modules/NUCLEO-F103RB/aosconf.h
index 54e87ec..605f402 100644
--- a/modules/NUCLEO-F103RB/aosconf.h
+++ b/modules/NUCLEO-F103RB/aosconf.h
@@ -168,7 +168,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/NUCLEO-F103RB/module.h b/modules/NUCLEO-F103RB/module.h
index 89ce887..4a20151 100644
--- a/modules/NUCLEO-F103RB/module.h
+++ b/modules/NUCLEO-F103RB/module.h
@@ -275,9 +275,7 @@ extern ROMCONST char* moduleShellPrompt;
 /*===========================================================================*/
 
 #if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
-
-// SSSP is not yet supported on this module
-
+  #error "SSSP is not supported on this module."
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 
 /** @} */
diff --git a/modules/NUCLEO-F401RE/aosconf.h b/modules/NUCLEO-F401RE/aosconf.h
index 3ebcf04..b0729a7 100644
--- a/modules/NUCLEO-F401RE/aosconf.h
+++ b/modules/NUCLEO-F401RE/aosconf.h
@@ -168,7 +168,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/NUCLEO-F401RE/module.c b/modules/NUCLEO-F401RE/module.c
index bcc71fd..676b220 100644
--- a/modules/NUCLEO-F401RE/module.c
+++ b/modules/NUCLEO-F401RE/module.c
@@ -24,7 +24,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
 
 /*===========================================================================*/
 /**
diff --git a/modules/NUCLEO-F401RE/module.h b/modules/NUCLEO-F401RE/module.h
index a3d398c..db71744 100644
--- a/modules/NUCLEO-F401RE/module.h
+++ b/modules/NUCLEO-F401RE/module.h
@@ -152,9 +152,7 @@ extern ROMCONST char* moduleShellPrompt;
 /*===========================================================================*/
 
 #if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
-
-// SSSP is not yet supported on this module
-
+  #error "SSSP is not supported on this module."
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 
 /** @} */
diff --git a/modules/NUCLEO-F767ZI/aosconf.h b/modules/NUCLEO-F767ZI/aosconf.h
index 099f033..dec9743 100644
--- a/modules/NUCLEO-F767ZI/aosconf.h
+++ b/modules/NUCLEO-F767ZI/aosconf.h
@@ -168,7 +168,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/NUCLEO-F767ZI/module.h b/modules/NUCLEO-F767ZI/module.h
index 3cfec3c..e8fc975 100644
--- a/modules/NUCLEO-F767ZI/module.h
+++ b/modules/NUCLEO-F767ZI/module.h
@@ -164,9 +164,7 @@ extern ROMCONST char* moduleShellPrompt;
 /*===========================================================================*/
 
 #if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
-
-// SSSP is not yet supported on this module
-
+  #error "SSSP is not supported on this module."
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 
 /** @} */
diff --git a/modules/NUCLEO-L476RG/aosconf.h b/modules/NUCLEO-L476RG/aosconf.h
index 862a882..47031f4 100644
--- a/modules/NUCLEO-L476RG/aosconf.h
+++ b/modules/NUCLEO-L476RG/aosconf.h
@@ -168,7 +168,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/NUCLEO-L476RG/module.h b/modules/NUCLEO-L476RG/module.h
index 1c4b8bf..b58008e 100644
--- a/modules/NUCLEO-L476RG/module.h
+++ b/modules/NUCLEO-L476RG/module.h
@@ -207,9 +207,7 @@ extern ROMCONST char* moduleShellPrompt;
 /*===========================================================================*/
 
 #if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
-
-// SSSP is not yet supported on this module
-
+  #error "SSSP is not supported on this module."
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 
 /** @} */
diff --git a/modules/PowerManagement_1-1/aosconf.h b/modules/PowerManagement_1-1/aosconf.h
index caa6515..9e53959 100644
--- a/modules/PowerManagement_1-1/aosconf.h
+++ b/modules/PowerManagement_1-1/aosconf.h
@@ -161,14 +161,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   In order to execute MSI, a broadcast bus (BCB) and according interfaces must be defined.
  */
 #if !defined(OS_CFG_SSSP_MSI)
-  #define AMIROOS_CFG_SSSP_MSI                  false
+  #define AMIROOS_CFG_SSSP_MSI                  true
 #else
   #define AMIROOS_CFG_SSSP_MSI                  OS_CFG_SSSP_MSI
 #endif
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/PowerManagement_1-1/module.c b/modules/PowerManagement_1-1/module.c
index ad30a16..6246a6e 100644
--- a/modules/PowerManagement_1-1/module.c
+++ b/modules/PowerManagement_1-1/module.c
@@ -24,7 +24,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
+
+#include <string.h>
 
 /*===========================================================================*/
 /**
@@ -535,6 +537,67 @@ ROMCONST char* moduleShellPrompt = "PowerManagement";
  */
 /*===========================================================================*/
 
+#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true)) || defined(__DOXYGEN__)
+
+/* some local definitions */
+// maximum number of bytes per CAN frame
+#define CAN_BYTES_PER_FRAME                     8
+// identifier (as dominant as possible)
+#define MSI_BCBMSG_CANID                        0
+
+aos_ssspbcbstatus_t moduleSsspBcbTransmit(const uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANTxFrame frame;
+
+  // setup the common parts of the message frame
+  frame.DLC = (uint8_t)length;
+  frame.RTR = CAN_RTR_DATA;
+  frame.IDE = CAN_IDE_STD;
+  frame.SID = MSI_BCBMSG_CANID;
+  memcpy(frame.data8, buffer, length);
+
+  // sent the frame and return
+  return (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) ? AOS_SSSP_BCB_SUCCESS : AOS_SSSP_BCB_ERROR;
+}
+
+aos_ssspbcbstatus_t moduleSsspBcbReceive(uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANRxFrame frame;
+
+  // receive a frame and check for errors
+  if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) {
+    // a correct frame was received
+    if (frame.DLC == length &&
+        frame.RTR == CAN_RTR_DATA &&
+        frame.IDE == CAN_IDE_STD &&
+        frame.SID == MSI_BCBMSG_CANID) {
+      // success: fetch the data and return
+      memcpy(buffer, frame.data8, length);
+      return AOS_SSSP_BCB_SUCCESS;
+    }
+    // an unexpected frame was received
+    else {
+      return AOS_SSSP_BCB_INVALIDMSG;
+    }
+  } else {
+    // failure: return with error
+    return AOS_SSSP_BCB_ERROR;
+  }
+}
+
+#undef MSI_BCBMSG_CANID
+#undef CAN_BYTES_PER_FRAME
+
+#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true) */
+
 /** @} */
 
 /*===========================================================================*/
diff --git a/modules/PowerManagement_1-1/module.h b/modules/PowerManagement_1-1/module.h
index e33ba03..974a71b 100644
--- a/modules/PowerManagement_1-1/module.h
+++ b/modules/PowerManagement_1-1/module.h
@@ -542,45 +542,17 @@ extern ROMCONST char* moduleShellPrompt;
  */
 /*===========================================================================*/
 
-/**
- * @brief   PD signal GPIO.
- */
-#define moduleSsspGpioPD                        moduleGpioSysPd
-
-/**
- * @brief   S signal GPIO.
- */
-#define moduleSsspGpioS                         moduleGpioSysSync
-
-/**
- * @brief   DN signal GPIO.
- */
-#define moduleSsspGpioDN                        moduleGpioSysUartDn
-
-/**
- * @brief   UP signal GPIO.
- */
-#define moduleSsspGpioUP                        moduleGpioSysUartUp
+#define moduleSsspSignalPD()                    (&moduleGpioSysPd)
+#define moduleSsspEventflagPD()                 MODULE_OS_GPIOEVENTFLAG_SYSPD
 
-/**
- * @brief   Event flag for PD signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_PD                MODULE_OS_GPIOEVENTFLAG_SYSPD
-
-/**
- * @brief   Event flag for S signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_S                 MODULE_OS_GPIOEVENTFLAG_SYSSYNC
+#define moduleSsspSignalS()                     (&moduleGpioSysSync)
+#define moduleSsspEventflagS()                  MODULE_OS_GPIOEVENTFLAG_SYSSYNC
 
-/**
- * @brief   Event flag for UP signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_UP                MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
+#define moduleSsspSignalUP()                    (&moduleGpioSysUartUp)
+#define moduleSsspEventflagUP()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
 
-/**
- * @brief   Event flag for DN signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_DN                MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
+#define moduleSsspSignalDN()                    (&moduleGpioSysUartDn)
+#define moduleSsspEventflagDN()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
 
 /** @} */
 
diff --git a/modules/PowerManagement_1-2/aosconf.h b/modules/PowerManagement_1-2/aosconf.h
index 71bf84e..0b1fa46 100644
--- a/modules/PowerManagement_1-2/aosconf.h
+++ b/modules/PowerManagement_1-2/aosconf.h
@@ -161,14 +161,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @brief   In order to execute MSI, a broadcast bus (BCB) and according interfaces must be defined.
  */
 #if !defined(OS_CFG_SSSP_MSI)
-  #define AMIROOS_CFG_SSSP_MSI                  false
+  #define AMIROOS_CFG_SSSP_MSI                  true
 #else
   #define AMIROOS_CFG_SSSP_MSI                  OS_CFG_SSSP_MSI
 #endif
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/PowerManagement_1-2/module.c b/modules/PowerManagement_1-2/module.c
index e962413..7d46aa2 100644
--- a/modules/PowerManagement_1-2/module.c
+++ b/modules/PowerManagement_1-2/module.c
@@ -24,7 +24,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
+
+#include <string.h>
 
 /*===========================================================================*/
 /**
@@ -550,6 +552,67 @@ ROMCONST char* moduleShellPrompt = "PowerManagement";
  */
 /*===========================================================================*/
 
+#if ((AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true)) || defined(__DOXYGEN__)
+
+/* some local definitions */
+// maximum number of bytes per CAN frame
+#define CAN_BYTES_PER_FRAME                     8
+// identifier (as dominant as possible)
+#define MSI_BCBMSG_CANID                        0
+
+aos_ssspbcbstatus_t moduleSsspBcbTransmit(const uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANTxFrame frame;
+
+  // setup the common parts of the message frame
+  frame.DLC = (uint8_t)length;
+  frame.RTR = CAN_RTR_DATA;
+  frame.IDE = CAN_IDE_STD;
+  frame.SID = MSI_BCBMSG_CANID;
+  memcpy(frame.data8, buffer, length);
+
+  // sent the frame and return
+  return (canTransmitTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) ? AOS_SSSP_BCB_SUCCESS : AOS_SSSP_BCB_ERROR;
+}
+
+aos_ssspbcbstatus_t moduleSsspBcbReceive(uint8_t* buffer, size_t length)
+{
+  aosDbgCheck(buffer != NULL);
+  aosDbgCheck(length > 0 && length <= CAN_BYTES_PER_FRAME);
+
+  // local variables
+  CANRxFrame frame;
+
+  // receive a frame and check for errors
+  if (canReceiveTimeout(&MODULE_HAL_CAN, CAN_ANY_MAILBOX, &frame, TIME_IMMEDIATE) == MSG_OK) {
+    // a correct frame was received
+    if (frame.DLC == length &&
+        frame.RTR == CAN_RTR_DATA &&
+        frame.IDE == CAN_IDE_STD &&
+        frame.SID == MSI_BCBMSG_CANID) {
+      // success: fetch the data and return
+      memcpy(buffer, frame.data8, length);
+      return AOS_SSSP_BCB_SUCCESS;
+    }
+    // an unexpected frame was received
+    else {
+      return AOS_SSSP_BCB_INVALIDMSG;
+    }
+  } else {
+    // failure: return with error
+    return AOS_SSSP_BCB_ERROR;
+  }
+}
+
+#undef MSI_BCBMSG_CANID
+#undef CAN_BYTES_PER_FRAME
+
+#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) && (AMIROOS_CFG_SSSP_MSI == true) */
+
 /** @} */
 
 /*===========================================================================*/
diff --git a/modules/PowerManagement_1-2/module.h b/modules/PowerManagement_1-2/module.h
index bba083b..53185ac 100644
--- a/modules/PowerManagement_1-2/module.h
+++ b/modules/PowerManagement_1-2/module.h
@@ -547,45 +547,17 @@ extern ROMCONST char* moduleShellPrompt;
  */
 /*===========================================================================*/
 
-/**
- * @brief   PD signal GPIO.
- */
-#define moduleSsspGpioPD                        moduleGpioSysPd
-
-/**
- * @brief   S signal GPIO.
- */
-#define moduleSsspGpioS                         moduleGpioSysSync
-
-/**
- * @brief   UP signal GPIO.
- */
-#define moduleSsspGpioUP                        moduleGpioSysUartUp
-
-/**
- * @brief   DN signal GPIO.
- */
-#define moduleSsspGpioDN                        moduleGpioSysUartDn
+#define moduleSsspSignalPD()                    (&moduleGpioSysPd)
+#define moduleSsspEventflagPD()                 MODULE_OS_GPIOEVENTFLAG_SYSPD
 
-/**
- * @brief   Event flag for PD signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_PD                MODULE_OS_GPIOEVENTFLAG_SYSPD
-
-/**
- * @brief   Event flag for S signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_S                 MODULE_OS_GPIOEVENTFLAG_SYSSYNC
+#define moduleSsspSignalS()                     (&moduleGpioSysSync)
+#define moduleSsspEventflagS()                  MODULE_OS_GPIOEVENTFLAG_SYSSYNC
 
-/**
- * @brief   Event flag for UP signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_UP                MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
+#define moduleSsspSignalUP()                    (&moduleGpioSysUartUp)
+#define moduleSsspEventflagUP()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTUP
 
-/**
- * @brief   Event flag for DN signal events.
- */
-#define MODULE_SSSP_EVENTFLAG_DN                MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
+#define moduleSsspSignalDN()                    (&moduleGpioSysUartDn)
+#define moduleSsspEventflagDN()                 MODULE_OS_GPIOEVENTFLAG_SYSUARTDN
 
 /** @} */
 
diff --git a/modules/STM32F407G-DISC1/aosconf.h b/modules/STM32F407G-DISC1/aosconf.h
index 9f9cece..a7258c7 100644
--- a/modules/STM32F407G-DISC1/aosconf.h
+++ b/modules/STM32F407G-DISC1/aosconf.h
@@ -168,7 +168,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /**
  * @brief   Width of the @p aos_sssp_moduleid_t type.
- * @details Possible settings are 8, 16 and 32.
+ * @details Possible settings are 8, 16, 32 and 64.
  */
 #if !defined(OS_CFG_SSSP_MODULEIDWIDTH)
   #define AMIROOS_CFG_SSSP_MODULEIDWIDTH        16
diff --git a/modules/STM32F407G-DISC1/module.c b/modules/STM32F407G-DISC1/module.c
index 8949a9b..b30dcea 100644
--- a/modules/STM32F407G-DISC1/module.c
+++ b/modules/STM32F407G-DISC1/module.c
@@ -24,7 +24,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @{
  */
 
-#include "module.h"
+#include <amiroos.h>
 
 /*===========================================================================*/
 /**
diff --git a/modules/STM32F407G-DISC1/module.h b/modules/STM32F407G-DISC1/module.h
index 168719a..fbf2046 100644
--- a/modules/STM32F407G-DISC1/module.h
+++ b/modules/STM32F407G-DISC1/module.h
@@ -197,9 +197,7 @@ extern ROMCONST char* moduleShellPrompt;
 /*===========================================================================*/
 
 #if (AMIROOS_CFG_SSSP_ENABLE == true) || defined(__DOXYGEN__)
-
-// SSSP is not yet supported on this module
-
+  #error "SSSP is not supported on this module."
 #endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
 
 /** @} */
