commit 6d4ba7409b87a1f1bdb03c976f6487e32867f014
Author: Thomas Schöpping <tschoepp@cit-ec.uni-bielefeld.de>
Date:   Wed May 20 13:35:20 2020 +0200

    Overhaul to the new µRtWare interface.
    Rework of several settings and build chain.

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d6dd68a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,118 @@
+About & License
+===============
+
+AMiRo-Apps is a collection of applications and configurations for the Autonomous
+Mini Robot (AMiRo) [1]. It is tightly coupled to the AMiRo-OS and uRtWare
+projects, which provide a sophisticated operating system (based on ChibiOS) amd
+a real-time middleware for embedded devices.
+
+Copyright (C) 2018..2020  Thomas Schöpping et al.
+(a complete list of all authors is given below)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+This research/work was supported by the Cluster of Excellence
+Cognitive Interaction Technology 'CITEC' (EXC 277) at Bielefeld
+University, which is funded by the German Research Foundation (DFG).
+
+Authors:
+
+-   Thomas Schöpping          <tschoepp[at]cit-ec.uni-bielefeld.de>
+
+References:
+
+[1] S. Herbrechtsmeier, T. Korthals, T. Schopping and U. Rückert, "AMiRo: A
+    modular & customizable open-source mini robot platform," 2016 20th
+    International Conference on System Theory, Control and Computing (ICSTCC),
+    Sinaia, 2016, pp. 687-692.
+
+--------------------------------------------------------------------------------
+
+Contents
+========
+
+1.  Required Software
+2.  Folder Structure
+
+--------------------------------------------------------------------------------
+
+1 Required Software
+===================
+
+Since AMiRo-Apps depends on the AMiRo-OS and µRtWare projects, both are included
+as Git submodules. Use the provided ./setup.sh script to initialize those. When
+AMiRo-OS is fully configured, there is no additional software required by
+AMiRo-Apps. For further details about the initialization follow the instructions
+in the script and refer to the README.md file of AMiRo-OS and µRtWare
+respectively.
+
+
+2 Folder Structure
+==================
+
+At its root, the AMiRo-Apps project has seven folders to distiquish between the
+most fundamental parts:
+
+2.1 `apps/`
+-----------
+
+This folder includes individual applications, which can used by
+configigurations (see `configurations/`). Apps will usually be implemented
+as nodes for the middleware and provide according interfaces via some message
+type(s) (see `messagetypes/`).
+
+2.2 `configurations/`
+---------------------
+
+Each configuration combines multiple apps and distributes them among any
+supported modules. Furthermore, configurations may modify parameters for each
+module individually. Finally, each configuration should come with a Makefile, so
+a user can just use this to build and flash the whole setup.
+For better understanding, have a look at this example:
+
+-   module A: using apps 1, 2 and 3 with parameters X and Y.
+-   module B: using apps 1 and 4 with parameter X.
+-   module C: using apps 1, 5, 6 and 7 with parameters X and Z.
+-   Makefile: setup and build everything.
+
+Note that each configuration needs to explicitely support a module and that
+there can never be an implicit default configuration.
+
+2.3 `doc/`
+----------
+
+Any documentation related files are located in this directory.
+
+2.4 `messagetypes/`
+-------------------
+
+Apps shoud take advantage of the middleware and thus implement nodes, which
+communicate via messages and/or requests. Such messages/requests may have
+payloads of arbitrary types, which can be defined in this folder.
+
+2.5 `middleware/`
+-----------------
+
+This folder contains the µRtWare submodule and interface files.
+
+2.6 `os/`
+---------
+
+This folder contains the AMiRo-OS submodule and interface files.
+
+2.7 `tools/`
+------------
+
+Helpful tools can be found in this dirctory.
+
diff --git a/README.txt b/README.txt
deleted file mode 100644
index f820e4c..0000000
--- a/README.txt
+++ /dev/null
@@ -1,110 +0,0 @@
-AMiRo-Apps is a collection of applications and configurations for the Autonomous
-Mini Robot (AMiRo) [1]. It is tightly coupled to the AMiRo-OS and uRtWare
-projects, which provide a sophisticated operating system (based on ChibiOS) amd
-a real-time middleware for embedded devices.
-
-Copyright (C) 2018..2019  Thomas Schöpping et al.
-(a complete list of all authors is given below)
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or (at
-your option) any later version.
-
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-This research/work was supported by the Cluster of Excellence
-Cognitive Interaction Technology 'CITEC' (EXC 277) at Bielefeld
-University, which is funded by the German Research Foundation (DFG).
-
-Authors:
- - Thomas Schöpping          <tschoepp[at]cit-ec.uni-bielefeld.de>
- - Marc Rothmann
-
-References:
- [1] S. Herbrechtsmeier, T. Korthals, T. Schopping and U. Rückert, "AMiRo: A
-     modular & customizable open-source mini robot platform," 2016 20th
-     International Conference on System Theory, Control and Computing (ICSTCC),
-     Sinaia, 2016, pp. 687-692.
-
-
-
-################################################################################
-#                                                                              #
-#        RRRRRRRR   EEEEEEEE     AAA     DDDDDDDD   MM     MM  EEEEEEEE        #
-#        RR     RR  EE          AA AA    DD     DD  MMM   MMM  EE              #
-#        RR     RR  EE         AA   AA   DD     DD  MMMM MMMM  EE              #
-#        RRRRRRRR   EEEEEE    AA     AA  DD     DD  MM MMM MM  EEEEEE          #
-#        RR   RR    EE        AAAAAAAAA  DD     DD  MM     MM  EE              #
-#        RR    RR   EE        AA     AA  DD     DD  MM     MM  EE              #
-#        RR     RR  EEEEEEEE  AA     AA  DDDDDDDD   MM     MM  EEEEEEEE        #
-#                                                                              #
-################################################################################
-
-This file will help you to setup all required software on your system, compile
-the source code, and flash it to the AMiRo modules.
-
-================================================================================
-
-CONTENTS:
-
-  1  Required software
-  2  Folder structure
-
-================================================================================
-
-
-
-1 - REQUIRED SOFTWARE
----------------------
-
-Since AMiRo-Apps depends on the AMiRo-OS and uRtWare projects, both are included
-as Git submodules. Use the provided ./setup.sh script to initialize those. When
-AMiRo-OS is fully configured, there is no additional software required by
-AMiRo-Apps. For further details about the initialization follow the instructions
-in the script and refer to the README.txt file of AMiRo-OS and uRtWare
-respectively.
-
-
-
-2 - FOLDER STRUCTURE
---------------------
-
-At its root, the AMiRo-Apps projects has six folders to distiquish between the
-most fundamental parts:
-.
-├── apps
-│     This folder includes individual applications, which can used by
-│     configigurations. Apps will usually be implemented as nodes for the
-│     middleware and provide acording interfaces via some message type(s).
-├── configurations
-│     Each configuration combines multiple apps and distributes them among any
-│     supported modules. Furthermore, configurations may modify parameters for
-│     each module individually. Finally, each configuration should come with a
-│     makefile, so a user can just use this to build and flash the whole setup.
-│     For better understanding, have a look at this example:
-│       - module A: using apps 1, 2 and 3 with parameters X and Y.
-│       - module B: using apps 1 and 4 with parameter X.
-│       - module C: using apps 1, 5, 6 and 7 with parameters X and Z.
-│       - Makefile: set and build everything.
-│     Note that each configuration needs to explicitely support a module and
-│     that there can never be an implicit default configuration.
-├── messagetypes
-│     Apps shoud take advantage of the middleware and thus implement nodes,
-│     which communicate via messages. Such messages may have payloads of
-│     arbitrary types, which can be defined in this folder.
-├── middleware
-│     This folder contains the µRtWare submodule and interface files.
-├── os
-│     This folder contains the AMiRo-OS submodule and interface files.
-└── tools
-      Usable tools can be found in this dirctory.
-
-================================================================================
-
diff --git a/apps/HelloWorld/HelloWorld.mk b/apps/HelloWorld/HelloWorld.mk
index a2a64aa..3d70f92 100644
--- a/apps/HelloWorld/HelloWorld.mk
+++ b/apps/HelloWorld/HelloWorld.mk
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -26,6 +26,13 @@
 # absolue path to this directory
 HelloWorldAPP_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
 
+# middleware selection
+ifeq ($(CONFIG_MIDDLEWARE),)
+  CONFIG_MIDDLEWARE := "µRtWare"
+else ifneq ($(CONFIG_MIDDLEWARE),"µRtWare")
+  $(error incompatible middleware selected: $(CONFIG_MIDDLEWARE))
+endif
+
 # include path
 HelloWorldAPP_INC = $(HelloWorldAPP_DIR)
 
diff --git a/apps/HelloWorld/helloworld.c b/apps/HelloWorld/helloworld.c
index 39529e4..fa3a3c1 100644
--- a/apps/HelloWorld/helloworld.c
+++ b/apps/HelloWorld/helloworld.c
@@ -1,6 +1,6 @@
 /*
 AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -17,3 +17,5 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include <helloworld.h>
+
+#pragma message "Hello World! (.c)"
diff --git a/apps/HelloWorld/helloworld.h b/apps/HelloWorld/helloworld.h
index 69bb9ea..c008d46 100644
--- a/apps/HelloWorld/helloworld.h
+++ b/apps/HelloWorld/helloworld.h
@@ -1,6 +1,6 @@
 /*
 AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -16,7 +16,9 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef _HELLOWORLD_H_
-#define _HELLOWORLD_H_
+#ifndef HELLOWORLD_H
+#define HELLOWORLD_H
 
-#endif /* _HELLOWORLD_H_ */
+#pragma message "Hello World! (.h)"
+
+#endif /* HELLOWORLD_H */
diff --git a/configurations/HelloWorld/Makefile b/configurations/HelloWorld/Makefile
index f8dbb9a..8f5803a 100644
--- a/configurations/HelloWorld/Makefile
+++ b/configurations/HelloWorld/Makefile
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -26,21 +26,23 @@
 # absolue path to this directory
 HelloWorldCONF_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
 
-# list of available modules
-HelloWorldCONF_MODULES = $(patsubst $(HelloWorldCONF_DIR)/modules/%/,%,$(sort $(dir $(wildcard $(HelloWorldCONF_DIR)/modules/*/*))))
+# list of available/supported modules
+HelloWorldCONF_MODULES_DIR = $(HelloWorldCONF_DIR)/modules/
+HelloWorldCONF_MODULES = $(patsubst $(HelloWorldCONF_MODULES_DIR)%/,%,$(sort $(dir $(wildcard $(HelloWorldCONF_MODULES_DIR)*/*))))
 
-CLEANTRGS = $(HelloWorldCONF_MODULES:%=clean_%)
-FLASHTRGS = $(HelloWorldCONF_MODULES:%=flash_%)
+HelloWorldCONF_CLEANTRGS = $(HelloWorldCONF_MODULES:%=clean_%)
+HelloWorldCONF_FLASHTRGS = $(HelloWorldCONF_MODULES:%=flash_%)
 
-.PHONY: all $(MODULES) $(FLASHTRGS) clean $(CLEANTRGS)
+.PHONY: all $(HelloWorldCONF_MODULES) $(HelloWorldCONF_FLASHTRGS) clean $(HelloWorldCONF_CLEANTRGS)
 
 all: $(HelloWorldCONF_MODULES)
+
 $(HelloWorldCONF_MODULES):
-	$(MAKE) -C $(HelloWorldCONF_DIR)/modules/$@
+	$(MAKE) -C $(HelloWorldCONF_MODULES_DIR)/$@
 
-$(FLASHTRGS):
-	$(MAKE) -C $(HelloWorldCONF_DIR)/modules/$(@:flash_%=%) flash
+$(HelloWorldCONF_FLASHTRGS):
+	$(MAKE) -C $(HelloWorldCONF_MODULES_DIR)/$(@:flash_%=%) flash
 
-clean: $(CLEANTRGS)
-$(CLEANTRGS):
-	$(MAKE) -C $(HelloWorldCONF_DIR)/modules/$(@:clean_%=%) clean
+clean: $(HelloWorldCONF_CLEANTRGS)
+$(HelloWorldCONF_CLEANTRGS):
+	$(MAKE) -C $(HelloWorldCONF_MODULES_DIR)/$(@:clean_%=%) clean
diff --git a/configurations/HelloWorld/modules/DiWheelDrive_1-1/Makefile b/configurations/HelloWorld/modules/DiWheelDrive_1-1/Makefile
deleted file mode 100644
index 66e2873..0000000
--- a/configurations/HelloWorld/modules/DiWheelDrive_1-1/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-################################################################################
-# AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
-# (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
-#                                                                              #
-# This program is free software: you can redistribute it and/or modify         #
-# it under the terms of the GNU General Public License as published by         #
-# the Free Software Foundation, either version 3 of the License, or            #
-# (at your option) any later version.                                          #
-#                                                                              #
-# This program is distributed in the hope that it will be useful,              #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of               #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                #
-# GNU General Public License for more details.                                 #
-#                                                                              #
-# You should have received a copy of the GNU General Public License            #
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.        #
-#                                                                              #
-# This research/work was supported by the Cluster of Excellence Cognitive      #
-# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
-# funded by the German Research Foundation (DFG).                              #
-################################################################################
-
-
-
-# absolue path to this directory
-APPCONFIG_MODULE_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
-
-# environment setup
-include $(APPCONFIG_MODULE_DIR)/../modules.mk
-
-# include apps
-include $(APPS_DIR)/HelloWorld/HelloWorld.mk
-
-# include directories for configurations
-APPSINC += $(APPCONFIG_MODULE_DIR) \
-           $(HelloWorldAPP_INC)
-
-# C sources
-APPSCSRC += $(HelloWorldAPP_CSRC)
-
-# C++ sources
-APPSCPPSRC += $(HelloWorldAPP_CPPSRC)
-
-# call DiWHeelDrive Makefile module from OS
-all:
-	$(MAKE) -C $(OS_DIR)/AMiRo-OS/modules/DiWheelDrive_1-1/
-
-clean:
-	$(MAKE) -C $(OS_DIR)/AMiRo-OS/modules/DiWheelDrive_1-1/ clean
-
-flash:
-	$(MAKE) -C $(OS_DIR)/AMiRo-OS/modules/DiWheelDrive_1-1/ flash
-
diff --git a/configurations/HelloWorld/modules/DiWheelDrive_1-1/mainincludes.hpp b/configurations/HelloWorld/modules/DiWheelDrive_1-1/mainincludes.hpp
deleted file mode 100644
index 3d9baca..0000000
--- a/configurations/HelloWorld/modules/DiWheelDrive_1-1/mainincludes.hpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _MAININCLUDES_HPP_
-#define _MAININCLUDES_HPP_
-
-#include <urtware.h>
-
-#endif /* _MAININCLUDES_HPP_ */
diff --git a/configurations/HelloWorld/modules/DiWheelDrive_1-1/osconf.h b/configurations/HelloWorld/modules/DiWheelDrive_1-1/osconf.h
deleted file mode 100644
index cf3b6b9..0000000
--- a/configurations/HelloWorld/modules/DiWheelDrive_1-1/osconf.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _OSCONF_H_
-#define _OSCONF_H_
-
-#include <HelloWorld_osconf.h>
-
-#endif /* _OSCONF_H_ */
diff --git a/configurations/HelloWorld/modules/DiWheelDrive_1-1/urtwareconf.h b/configurations/HelloWorld/modules/DiWheelDrive_1-1/urtwareconf.h
deleted file mode 100644
index 3ab4dc3..0000000
--- a/configurations/HelloWorld/modules/DiWheelDrive_1-1/urtwareconf.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _URTWARECONF_H_
-#define _URTWARECONF_H_
-
-#include <HelloWorld_urtwareconf.h>
-
-#endif /* _URTWARECONF_H_ */
diff --git a/configurations/HelloWorld/modules/HelloWorld_osconf.h b/configurations/HelloWorld/modules/HelloWorld_osconf.h
index 0fd6c92..d1de308 100644
--- a/configurations/HelloWorld/modules/HelloWorld_osconf.h
+++ b/configurations/HelloWorld/modules/HelloWorld_osconf.h
@@ -1,6 +1,6 @@
 /*
 AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/configurations/HelloWorld/modules/HelloWorld_urtwareconf.h b/configurations/HelloWorld/modules/HelloWorld_urtwareconf.h
index 606c548..51deb0d 100644
--- a/configurations/HelloWorld/modules/HelloWorld_urtwareconf.h
+++ b/configurations/HelloWorld/modules/HelloWorld_urtwareconf.h
@@ -1,6 +1,6 @@
 /*
 AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -16,15 +16,17 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef _HELLOWORLD_URTWARECONF_H_
-#define _HELLOWORLD_URTWARECONF_H_
+#ifndef HELLOWORLD_URTWARECONF_H
+#define HELLOWORLD_URTWARECONF_H
 
 /*
  * compatibility guards
  */
 #define _URTWARE_CFG_
-#define URTWARE_CFG_VERSION_MAJOR     0
-#define URTWARE_CFG_VERSION_MINOR     1
+#define URTWARE_CFG_VERSION_MAJOR               0
+#define URTWARE_CFG_VERSION_MINOR               1
+
+#include <stdbool.h>
 
 /**
  * @brief   Width of the urt_delay_t data type.
@@ -32,25 +34,77 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * @details Possible values are 32 and 64 bits.
  *          By definition time is represented in microseconds.
  */
-#define URT_CFG_DELAY_WIDTH           32
+#define URT_CFG_DELAY_WIDTH                     32
+
+/**
+ * @brief   Width of the urt_nodestage_t data type.
+ *
+ * @details Possible values are 8, 16, 32, and 64 bits.
+ */
+#define URT_CFG_NODESTAGE_WIDTH                 16
+
+/**
+ * @brief   Debug enable flag.
+ */
+#define URT_CFG_DEBUG_ENABLED                   true
+
+/**
+ * @brief   Enable flag for the publish-subscribe system.
+ */
+#define URT_CFG_PUBSUB_ENABLED                  true
 
 /**
  * @brief   Width of the urt_topicid_t data type.
  *
  * @details Possible values are 8, 16, 32, and 64 bits.
  */
-#define URT_CFG_TOPICID_WIDTH         16
+#define URT_CFG_PUBSUB_TOPICID_WIDTH            16
 
 /**
- * @brief   Width of the urt_nodestage_t data type.
+ * @brief   Flag to enable profiling of the publish-subscribe system.
+ */
+#define URT_CFG_PUBSUB_PROFILING                true
+
+/**
+ * @brief   Flag to enable deadline QoS for the publish-subscribe system.
+ */
+#define URT_CFG_PUBSUB_QOS_DEADLINECHECKS       true
+
+/**
+ * @brief   Flag to enable rate QoS for the publish-subscribe system.
+ */
+#define URT_CFG_PUBSUB_QOS_RATECHECKS           true
+
+/**
+ * @brief   Flag to enable jitter QoS for the publish-subscribe system
+ */
+#define URT_CFG_PUBSUB_QOS_JITTERCHECKS         true
+
+/**
+ * @brief   Enable flag for remote procedure calls.
+ */
+#define URT_CFG_RPC_ENABLED                     true
+
+/**
+ * @brief   Width of the urt_serviceid_t data type.
  *
  * @details Possible values are 8, 16, 32, and 64 bits.
  */
-#define URT_CFG_NODESTAGE_WIDTH       16
+#define URT_CFG_RPC_SERVICEID_WIDTH             16
 
 /**
- * @brief   Debug enable flag.
+ * @brief   Flag to enable profiling of remote procedure calls.
+ */
+#define URT_CFG_RPC_PROFILING                   true
+
+/**
+ * @brief   Flag to enable deadline QoS for remote procedure calls.
+ */
+#define URT_CFG_RPC_QOS_DEADLINECHECKS          true
+
+/**
+ * @brief   Flag to enable jitter QoS for remote procedure calls.
  */
-#define URT_CFG_DEBUG                 true
+#define URT_CFG_RPC_QOS_JITTERCHECKS            true
 
-#endif /* _HELLOWORLD_URTWARECONF_H_ */
+#endif /* HELLOWORLD_URTWARECONF_H */
diff --git a/configurations/HelloWorld/modules/NUCLEO-L476RG/Makefile b/configurations/HelloWorld/modules/NUCLEO-L476RG/Makefile
new file mode 100644
index 0000000..2016248
--- /dev/null
+++ b/configurations/HelloWorld/modules/NUCLEO-L476RG/Makefile
@@ -0,0 +1,163 @@
+################################################################################
+# AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
+# (AMiRo) platform.                                                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
+#                                                                              #
+# This program is free software: you can redistribute it and/or modify         #
+# it under the terms of the GNU General Public License as published by         #
+# the Free Software Foundation, either version 3 of the License, or            #
+# (at your option) any later version.                                          #
+#                                                                              #
+# This program is distributed in the hope that it will be useful,              #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of               #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                #
+# GNU General Public License for more details.                                 #
+#                                                                              #
+# You should have received a copy of the GNU General Public License            #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.        #
+#                                                                              #
+# This research/work was supported by the Cluster of Excellence Cognitive      #
+# Interaction Technology 'CITEC' (EXC 277) at Bielefeld University, which is   #
+# funded by the German Research Foundation (DFG).                              #
+################################################################################
+
+
+
+################################################################################
+# Build global options                                                         #
+# NOTE: Can be overridden externally.                                          #
+#                                                                              #
+
+# Compiler options here.
+ifeq ($(USE_OPT),)
+  USE_OPT = -O2 -fomit-frame-pointer -falign-functions=16 -fstack-usage
+  export USE_OPT
+endif
+
+# C specific options here (added to USE_OPT).
+ifeq ($(USE_COPT),)
+  USE_COPT = -std=c11
+  export USE_COPT
+endif
+
+# C++ specific options here (added to USE_OPT).
+ifeq ($(USE_CPPOPT),)
+  USE_CPPOPT = -fno-rtti -std=c++17
+  export USE_CPPOPT
+endif
+
+# Enable this if you want the linker to remove unused code and data
+ifeq ($(USE_LINK_GC),)
+  USE_LINK_GC = yes
+ export USE_LINK_GC
+endif
+
+# Linker extra options here.
+ifeq ($(USE_LDOPT),)
+  USE_LDOPT =
+  export USE_LDOPT
+endif
+
+# Enable this if you want link time optimizations (LTO)
+ifeq ($(USE_LTO),)
+  USE_LTO = yes
+  export USE_LTO
+endif
+
+# If enabled, this option allows to compile the application in THUMB mode.
+ifeq ($(USE_THUMB),)
+  USE_THUMB = yes
+  export USE_THUMB
+endif
+
+# Enable this if you want to see the full log while compiling.
+ifeq ($(USE_VERBOSE_COMPILE),)
+  USE_VERBOSE_COMPILE = no
+  export USE_VERBOSE_COMPILE
+endif
+
+#                                                                              #
+# Build global options                                                         #
+################################################################################
+
+################################################################################
+# Sources and paths                                                            #
+#                                                                              #
+
+# environment setup
+include ../modules.mk
+
+# include apps
+include $(APPS_DIR)/HelloWorld/HelloWorld.mk
+
+# middleware setup
+include $(MIDDLEWARE_DIR)/middleware.mk
+
+# C sources
+APPS_CSRC += $(HelloWorldAPP_CSRC) \
+             $(MIDDLEWARE_CSRC)
+
+# C++ sources
+APPS_CPPSRC += $(HelloWorldAPP_CPPSRC) \
+               $(MIDDLEWARE_CPPSRC)
+
+# include directories for configurations
+APPS_INC += $(realpath .) \
+            $(HelloWorldAPP_INC) \
+            $(MIDDLEWARE_INC)
+
+#                                                                              #
+# Sources and paths                                                            #
+################################################################################
+
+################################################################################
+# Start of user section                                                        #
+#                                                                              #
+
+# List all user defines here
+UDEFS +=
+export UDEFS
+
+# List all ASM defines here
+UADEFS +=
+export UADEFS
+
+# List all user directories here
+UINCDIR +=
+export UINCDIR
+
+# List all directories to look for user libraries here
+ULIBDIR +=
+export ULIBDIR
+
+# List all user libraries here
+ULIBS +=
+export ULIBS
+
+#                                                                              #
+# End of user defines                                                          #
+################################################################################
+
+################################################################################
+# Start of targets section                                                     #
+# 
+
+# set the build directory
+ifeq ($(BUILDDIR),)
+  BUILDDIR = $(realpath .)/build
+endif
+export BUILDDIR
+
+# call Makefile from OS
+all:
+	$(MAKE) -C $(OS_DIR)/AMiRo-OS/modules/NUCLEO-L476RG/
+
+clean:
+	$(MAKE) -C $(OS_DIR)/AMiRo-OS/modules/NUCLEO-L476RG/ clean
+
+flash:
+	$(MAKE) -C $(OS_DIR)/AMiRo-OS/modules/NUCLEO-L476RG/ flash
+
+#                                                                              #
+# End of targets section                                                       #
+################################################################################
diff --git a/configurations/HelloWorld/modules/NUCLEO-L476RG/mainincludes.hpp b/configurations/HelloWorld/modules/NUCLEO-L476RG/mainincludes.hpp
new file mode 100644
index 0000000..e0723c5
--- /dev/null
+++ b/configurations/HelloWorld/modules/NUCLEO-L476RG/mainincludes.hpp
@@ -0,0 +1,24 @@
+/*
+AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef MAININCLUDES_HPP
+#define MAININCLUDES_HPP
+
+#include <urtware.h>
+
+#endif /* MAININCLUDES_HPP */
diff --git a/configurations/HelloWorld/modules/NUCLEO-L476RG/osconf.h b/configurations/HelloWorld/modules/NUCLEO-L476RG/osconf.h
new file mode 100644
index 0000000..139da2a
--- /dev/null
+++ b/configurations/HelloWorld/modules/NUCLEO-L476RG/osconf.h
@@ -0,0 +1,28 @@
+/*
+AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef OSCONF_H
+#define OSCONF_H
+
+#include <HelloWorld_osconf.h>
+
+#define OS_CFG_TESTS_ENABLE                     false
+
+#define OS_CFG_SSSP_ENABLE                      false
+
+#endif /* OSCONF_H */
diff --git a/configurations/HelloWorld/modules/NUCLEO-L476RG/urtwareconf.h b/configurations/HelloWorld/modules/NUCLEO-L476RG/urtwareconf.h
new file mode 100644
index 0000000..c116526
--- /dev/null
+++ b/configurations/HelloWorld/modules/NUCLEO-L476RG/urtwareconf.h
@@ -0,0 +1,24 @@
+/*
+AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef URTWARECONF_H
+#define URTWARECONF_H
+
+#include <HelloWorld_urtwareconf.h>
+
+#endif /* URTWARECONF_H */
diff --git a/configurations/HelloWorld/modules/modules.mk b/configurations/HelloWorld/modules/modules.mk
index 4a33cad..ecf9c0e 100644
--- a/configurations/HelloWorld/modules/modules.mk
+++ b/configurations/HelloWorld/modules/modules.mk
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -27,14 +27,11 @@
 APPCONFIG_MODULES_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
 
 # environment setup
-CONFIG_USE_MIDDLEWARE = true
 include $(APPCONFIG_MODULES_DIR)/../../apps.mk
 
-# include directories for configurations
-APPSINC += $(APPCONFIG_MODULES_DIR)
+# include paths
+APPS_INC += $(APPCONFIG_MODULES_DIR)
+
+# C source files
+APPS_CSRC +=
 
-# set the build directory
-ifeq ($(BUILDDIR),)
-  BUILDDIR = $(APPCONFIG_MODULE_DIR)/build
-endif
-export BUILDDIR
diff --git a/configurations/apps.mk b/configurations/apps.mk
index 1a8c1a4..16759fb 100644
--- a/configurations/apps.mk
+++ b/configurations/apps.mk
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -29,17 +29,9 @@ APPSCONFIG_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
 # absolute path to the applications directory
 APPS_DIR := $(APPSCONFIG_DIR)/../apps
 
+# aboslute path to the middleware directory
+MIDDLEWARE_DIR := $(APPSCONFIG_DIR)/../middleware
+
 # operating system setup
 include $(APPSCONFIG_DIR)/../os/os.mk
 
-# middleware setup
-ifneq ($(CONFIG_USE_MIDDLEWARE),)
-  $(info middleware enabled)
-  include $(APPSCONFIG_DIR)/../middleware/middleware.mk
-  APPSINC += $(MIDDLEWAREINC)
-  APPSCSRC += $(MIDDLEWARECSRC)
-  APPSCPPSRC += $(MIDDLEWARECPPSRC)
-else
-  $(info middleware disabled)
-endif
-
diff --git a/doc/AMiRo-Apps.uml b/doc/AMiRo-Apps.uml
index 55e3897..2a3be58 100644
--- a/doc/AMiRo-Apps.uml
+++ b/doc/AMiRo-Apps.uml
@@ -1,6 +1,6 @@
 /'
 AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/middleware/apps_urtosal.c b/middleware/apps_urtosal.c
new file mode 100644
index 0000000..5d574b8
--- /dev/null
+++ b/middleware/apps_urtosal.c
@@ -0,0 +1,198 @@
+/*
+AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <urtware.h>
+
+/*============================================================================*/
+/* DEPENDENCIES                                                               */
+/*============================================================================*/
+
+/*============================================================================*/
+/* DEBUG                                                                      */
+/*============================================================================*/
+
+/*============================================================================*/
+/* MUTEX                                                                      */
+/*============================================================================*/
+
+/*============================================================================*/
+/* CONDITION VARIABLE                                                         */
+/*============================================================================*/
+
+/**
+ * @details Due to limitations of ChibiOS, the 'mutex' argument is ignored in
+ *          this implementation. Instead, the mutex, which was locked by the
+ *          calling thread most recently is used.
+ *          In debug builds, however, the argument is still checked to be
+ *          identical to implicitely selected mutex.
+ */
+urt_osCondvarWaitStatus_t urtCondvarWait(urt_osCondvar_t* condvar, urt_osMutex_t* mutex, urt_delay_t timeout)
+{
+  aosDbgCheck(condvar != NULL);
+  aosDbgCheck(mutex != NULL);
+  aosDbgCheck(chMtxGetNextMutexX() == mutex); // due to limitation of ChibiOS
+
+  (void)mutex;
+
+  switch (chCondWaitTimeout(condvar, timeout)) {
+    case MSG_OK:
+      return URT_CONDVAR_WAITSTATUS_SIGNAL;
+    case MSG_RESET:
+      return URT_CONDVAR_WAITSTATUS_BROADCAST;
+    case MSG_TIMEOUT:
+      return URT_CONDVAR_WAITSTATUS_TIMEOUT;
+    default:
+      chSysHalt(__func__);
+      return URT_CONDVAR_WAITSTATUS_TIMEOUT;
+  }
+}
+
+/*============================================================================*/
+/* EVENTS                                                                     */
+/*============================================================================*/
+
+urt_osEventMask_t urtEventWait(urt_osEventMask_t mask, urt_osEventWait_t type, urt_delay_t timeout)
+{
+  switch (type) {
+    case URT_EVENT_WAIT_ONE:
+      return chEvtWaitOneTimeout(mask, timeout);
+    case URT_EVENT_WAIT_ANY:
+      return chEvtWaitAnyTimeout(mask, timeout);
+    case URT_EVENT_WAIT_ALL:
+      return chEvtWaitAllTimeout(mask, timeout);
+    default:
+      return 0;
+  }
+}
+
+/*============================================================================*/
+/* STREAMS                                                                    */
+/*============================================================================*/
+
+/*============================================================================*/
+/* TIME                                                                       */
+/*============================================================================*/
+
+urt_osTime_t urtTimeNow(void)
+{
+  urt_osTime_t time;
+  aosSysGetUptime(&time);
+  return time;
+}
+
+/*============================================================================*/
+/* THREAD                                                                     */
+/*============================================================================*/
+
+urt_osThread_t* urtThreadInit(void* memory, size_t size, urt_osThreadPrio_t prio, urt_osThreadFunction_t func, void* arg)
+{
+  aosDbgCheck(memory != NULL);
+  aosDbgCheck(size != 0);
+  aosDbgCheck(prio >= URT_THREAD_PRIO_LOW_MIN && prio <= URT_THREAD_PRIO_RT_MAX);
+  aosDbgCheck(func != NULL);
+
+  const thread_descriptor_t descriptor = {
+    /* name                         */ "",
+    /* pointer to working area base */ (stkalign_t*)memory,
+    /* end of the working area      */ &((stkalign_t*)memory)[size / sizeof(stkalign_t)],
+    /* thread priority              */ prio,
+    /* thread function pointer      */ func,
+    /* thread argument              */ arg,
+    /* pointer to the parent thread */ chThdGetSelfX(),
+  };
+
+  return chThdCreateSuspended(&descriptor);
+}
+
+void urtThreadTerminate(urt_osThread_t* thread, urt_osThreadTerminateSignal_t sig)
+{
+  aosDbgCheck(thread != NULL);
+
+  switch (sig) {
+    case URT_THREAD_TERMINATE_REQUEST:
+      chThdTerminate(thread);
+      return;
+    case URT_THREAD_TERMINATE_KILL:
+      /*
+       * TODO: implement kill functionality
+       */
+      chThdTerminate(thread);
+      return;
+  }
+}
+
+urt_osThreadState_t urtThreadGetState(urt_osThread_t* thread)
+{
+  aosDbgCheck(thread != NULL);
+
+  switch (thread->state) {
+    case CH_STATE_CURRENT:
+      return URT_THREAD_STATE_RUNNING;
+    case CH_STATE_READY:
+      return URT_THREAD_STATE_READY;
+    case CH_STATE_SLEEPING:
+      return URT_THREAD_STATE_SLEEPING;
+    case CH_STATE_WTSTART:
+    case CH_STATE_SUSPENDED:
+      return URT_THREAD_STATE_SUSPENDED;
+    case CH_STATE_FINAL:
+      return URT_THREAD_STATE_TERMINATED;
+    case CH_STATE_QUEUED:
+    case CH_STATE_WTSEM:
+    case CH_STATE_WTMTX:
+    case CH_STATE_WTCOND:
+    case CH_STATE_WTEXIT:
+    case CH_STATE_WTOREVT:
+    case CH_STATE_WTANDEVT:
+    case CH_STATE_SNDMSGQ:
+    case CH_STATE_SNDMSG:
+    case CH_STATE_WTMSG:
+    default:
+      return URT_THREAD_STATE_WAITING;
+  }
+}
+
+/*============================================================================*/
+/* TIMER                                                                      */
+/*============================================================================*/
+
+void urtTimerSet(urt_osTimer_t* timer, urt_delay_t delay, urt_osTimerCallback_t callback, void* cbparams)
+{
+  aosDbgCheck(timer != NULL);
+  aosDbgCheck(callback != NULL);
+
+  if (sizeof(urt_delay_t) > sizeof(aos_interval_t)) {
+    aosTimerSetLongInterval(timer, (aos_longinterval_t)delay, callback, cbparams);
+  } else {
+    aosTimerSetInterval(timer, delay, callback, cbparams);
+  }
+  return;
+}
+
+void urtTimerSetPeriodic(urt_osTimer_t* timer, urt_delay_t period, urt_osTimerCallback_t callback, void* cbparams)
+{
+  aosDbgCheck(timer != NULL);
+  aosDbgCheck(callback != NULL);
+
+  if (sizeof(urt_delay_t) > sizeof(aos_interval_t)) {
+    aosTimerPeriodicLongInterval(timer, (aos_longinterval_t)period, callback, cbparams);
+  } else {
+    aosTimerPeriodicInterval(timer, period, callback, cbparams);
+  }
+  return;
+}
diff --git a/middleware/apps_urtosal.h b/middleware/apps_urtosal.h
new file mode 100644
index 0000000..b7d2dda
--- /dev/null
+++ b/middleware/apps_urtosal.h
@@ -0,0 +1,264 @@
+/*
+AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
+Copyright (C) 2018..2020  Thomas Schöpping et al.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef APPS_URTOSAL_H
+#define APPS_URTOSAL_H
+
+/*============================================================================*/
+/* DEPENDENCIES                                                               */
+/*============================================================================*/
+
+#include <amiroos.h>
+
+/*============================================================================*/
+/* DEBUG                                                                      */
+/*============================================================================*/
+
+#define urtDebugAssert(condition)               aosDbgAssert(condition)
+
+/*============================================================================*/
+/* MUTEX                                                                      */
+/*============================================================================*/
+
+/**
+ * @brief   Mutex lock type.
+ */
+typedef mutex_t urt_osMutex_t;
+
+#define urtMutexInit(mutex)                     chMtxObjectInit(mutex)
+
+#define urtMutexLock(mutex)                     chMtxLock(mutex)
+
+#define urtMutexTryLock(mutex)                  chMtxTryLock(mutex)
+
+#define urtMutexUnlock(mutex)                   chMtxUnlock(mutex)
+
+/*============================================================================*/
+/* CONDITION VARIABLE                                                         */
+/*============================================================================*/
+
+/**
+ * @brief   Condition variable type.
+ */
+typedef condition_variable_t urt_osCondvar_t;
+
+#define urtCondvarInit(condvar)                 chCondObjectInit(condvar)
+
+#define urtCondvarSignal(condvar)               chCondSignal(condvar)
+
+#define urtCondvarBroadcast condvar)            chCondBroadcast(condvar)
+
+/*============================================================================*/
+/* EVENTS                                                                     */
+/*============================================================================*/
+
+/**
+ * @brief   Type representing an event source object.
+ */
+typedef event_source_t urt_osEventSource_t;
+
+/**
+ * @brief   Type representing an event listener object.
+ */
+typedef event_listener_t urt_osEventListener_t;
+
+/**
+ * @brief   Type representing event masks.
+ * @details Event masks can be used to distinguish and filter events.
+ */
+typedef eventmask_t urt_osEventMask_t;
+
+/**
+ * @brief   Type representing event flags.
+ * @details Event flags can be used to represent rudimentary metadata or to filter events.
+ */
+typedef eventflags_t urt_osEventFlags_t;
+
+/**
+ * @brief   Event mask, which is handles with highest priority.
+ */
+#define URT_EVENTMASK_MAXPRIO                   EVENT_MASK(0)
+
+#define urtEventSourceInit(source)              chEvtObjectInit(source)
+
+#define urtEventSourceBroadcast(source, flags)  chEvtBroadcastFlags(source, flags)
+
+#define urtEventListenerInit(listener)          (void)listener
+
+#define urtEventListenerGetFlags(listener)      (urt_osEventFlags_t)(listener->flags)
+
+#define urtEventListenerClearFlags(listener)    (urt_osEventFlags_t)chEvtGetAndClearFlags(listener)
+
+#define urtEventRegister(source, listener, mask, flags) chEvtRegisterMaskWithFlags(source, listener, mask, flags)
+
+#define urtEventUnregister(source, listener)    chEvtUnregister(source, listener)
+
+/*============================================================================*/
+/* STREAMS                                                                    */
+/*============================================================================*/
+
+#define urtPrintf(fmt, ...)                     aosprintf(fmt, ##__VA_ARGS__)
+
+#define urtErrPrintf(fmt, ...)                  aosprintf(fmt, ##__VA_ARGS__)
+
+/*============================================================================*/
+/* TIME                                                                       */
+/*============================================================================*/
+
+/**
+ * @brief   The urt_osTime_t represents time at an arbitrary precision.
+ */
+typedef aos_timestamp_t urt_osTime_t;
+
+#define urtTime2Us(time)                      (*((urt_osTime_t*)time))
+
+#define urtTimeAddUs(time, offset)            (*((urt_osTime_t*)time) + offset)
+
+/*============================================================================*/
+/* THREAD                                                                     */
+/*============================================================================*/
+
+/**
+ * @brief   Thread object type.
+ */
+typedef thread_t urt_osThread_t;
+
+/**
+ * @brief   Thread priority data type.
+ */
+typedef tprio_t urt_osThreadPrio_t;
+
+/**
+ * @brief   Minimum thread priority.
+ */
+#define URT_THREAD_PRIO_LOW_MIN                 AOS_THD_LOWPRIO_MIN
+
+/**
+ * @brief   Maximum thread priority for low priority class threads.
+ */
+#define URT_THREAD_PRIO_LOW_MAX                 AOS_THD_LOWPRIO_MAX
+
+/**
+ * @brief   Minimum thread priority for normal priority class threads.
+ */
+#define URT_THREAD_PRIO_NORMAL_MIN              AOS_THD_NORMALPRIO_MIN
+
+/**
+ * @brief   Maximum thread priority for normal priority class threads.
+ */
+#define URT_THREAD_PRIO_NORMAL_MAX              AOS_THD_NORMALPRIO_MAX
+
+/**
+ * @brief   Minimum thread priority for high priority class threads.
+ */
+#define URT_THREAD_PRIO_HIGH_MIN                AOS_THD_HIGHPRIO_MIN
+
+/**
+ * @brief   Maximum thread priority for high priority class threads.
+ */
+#define URT_THREAD_PRIO_HIGH_MAX                AOS_THD_HIGHPRIO_MAX
+
+/**
+ * @brief   Minimum thread priority for real-time class threads.
+ */
+#define URT_THREAD_PRIO_RT_MIN                  AOS_THD_RTPRIO_MIN
+
+/**
+ * @brief   maximum thread priority for real-time class threads.
+ */
+#define URT_THREAD_PRIO_RT_MAX                  AOS_THD_RTPRIO_MAX
+
+/**
+ * @brief   Maximum number of seconds a thread can sleep.
+ */
+#define URT_THREAD_SLEEP_MAX                    (float)AOS_THD_MAX_SLEEP_S
+
+/**
+ * @brief   Maximum number of seconds a thread can sleep.
+ */
+#define URT_THREAD_SSLEEP_MAX                   (unsigned int)AOS_THD_MAX_SLEEP_S
+
+/**
+ * @brief   Maximum number of milliseconds a thread can sleep.
+ */
+#define URT_THREAD_MSLEEP_MAX                   (unsigned int)AOS_THD_MAX_SLEEP_MS
+
+/**
+ * @brief   Maximum number of microseconds a thread can sleep.
+ */
+#define URT_THREAD_USLEEP_MAX                   (urt_delay_t)AOS_THD_MAX_SLEEP_US
+
+/**
+ * @brief   Macro function to layout a thread memory.
+ * @details The overall memory required for a thread usually is a combination of the stack and some further data (i.e. the thread object itself).
+ *          The layout in memory as well as the metadata may differ between kernels and event hardware ports.
+ *
+ * @param[in]   varname     The name of the resulting buffer variable.
+ * @param[in]   stacksize   The size of the thread's stack.
+ */
+#define URT_THREAD_MEMORY(varname, stacksize)   THD_WORKING_AREA(varname, stacksize)
+
+#define urtThreadStart(thread)                  chThdStart(thread)
+
+#define urtThreadYield()                        chThdYield()
+
+#define urtThreadGetPriority()                  chThdGetPriorityX()
+
+#define urtThreadSetPriority(prio) {                                              \
+  aosDbgCheck(prio >= URT_THREAD_PRIO_LOW_MIN && prio <= URT_THREAD_PRIO_RT_MAX)  \
+  chThdSetPriority(prio);                                                         \
+}
+
+#define urtThreadSleep(seconds)                 aosThdSleep(seconds)
+
+#define urtThreadSSleep(seconds)                aosThdSSleep(seconds)
+
+#define urtThreadMSleep(seconds)                aosThdMSleep(seconds)
+
+#define urtThreadUSleep(seconds)                aosThdUSleep(seconds)
+
+#define urtThreadSleepUntil(time)               aosThdSleepUntil(time)
+
+#define urtThreadExit()                         chThdExit(MSG_OK)
+
+#define urtThreadJoin(thread)                   (void)chThdWait(thread)
+
+#define urtThreadGetSelf()                      chThdGetSelfX()
+
+#define urtThreadGetChildren(thread)            (thread->children)
+
+#define urtThreadGetSibling(thread)             (thread->sibling)
+
+#define urtThreadGetParent(thread)              (thread->parent)
+
+/*============================================================================*/
+/* TIMER                                                                      */
+/*============================================================================*/
+
+/**
+ * @brief   Timer object type.
+ */
+typedef aos_timer_t urt_osTimer_t;
+
+#define urtTimerInit(timer)                     aosTimerInit(timer)
+
+#define urtTimerReset(timer)                    aosTimerReset(timer)
+
+#define urtTimerIsArmeed(timer)                 aosTimerIsArmed(timer)
+
+#endif /* APPS_URTOSAL_H */
diff --git a/middleware/middleware.mk b/middleware/middleware.mk
index 0a80050..16d5942 100644
--- a/middleware/middleware.mk
+++ b/middleware/middleware.mk
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -26,17 +26,29 @@
 # absolute path to this directory
 MIDDLEWARE_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
 
-include $(MIDDLEWARE_DIR)/uRtWare/Makefile
+# middleware setup
+ifeq ($(CONFIG_MIDDLEWARE),"µRtWare")
+  $(info >>> MIDDLEWARE: µRtWare)
 
-# include paths
-MIDDLEWAREINC = $(URTWARE_INC) \
-                $(MIDDLEWARE_DIR)
+  include $(MIDDLEWARE_DIR)/uRtWare/Makefile
 
-# C source files
-MIDDLEWARECSRC = $(URTWARE_CSRC)
+  # include paths
+  MIDDLEWARE_INC = $(URTWARE_INC) \
+                   $(MIDDLEWARE_DIR)
 
-# C++ source files
-MIDDLEWARECPPSRC = $(URTWARE_CPPSRC)
+  # C source files
+  MIDDLEWARE_CSRC = $(URTWARE_CSRC) \
+                    $(MIDDLEWARE_DIR)/apps_urtosal.c
 
+  # C++ source files
+  MIDDLEWARE_CPPSRC = $(URTWARE_CPPSRC)
 
+  # URT-OSAL implementation header file
+  UDEFS += -DURT_CFG_OSAL_HEADER=\"apps_urtosal.h\"
+
+else ifeq ($(CONFIG_MIDDLEWARE),)
+  $(info >>> MIDDLEWARE: none)
+else
+  $(error >>> MIDDLEWARE: unknown/unsupported middleware selected: $(CONFIG_MIDDLEWARE))
+endif
 
diff --git a/middleware/middlewaresetup.sh b/middleware/middlewaresetup.sh
index fdae2fb..dcbd19d 100755
--- a/middleware/middlewaresetup.sh
+++ b/middleware/middlewaresetup.sh
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -40,7 +40,7 @@ function printWelcomeText {
   printf "#                                                                    #\n"
   printf "######################################################################\n"
   printf "#                                                                    #\n"
-  printf "# Copyright (c) 2018..2019  Thomas Schöpping                         #\n"
+  printf "# Copyright (c) 2018..2020  Thomas Schöpping                         #\n"
   printf "#                                                                    #\n"
   printf "# This is free software; see the source for copying conditions.      #\n"
   printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
diff --git a/middleware/uRtWare b/middleware/uRtWare
index 2d31587..4647148 160000
--- a/middleware/uRtWare
+++ b/middleware/uRtWare
@@ -1 +1 @@
-Subproject commit 2d31587003068f754f1c662c620964cbdd99750f
+Subproject commit 46471486302efadc59bfbde603a5238a41eb6a74
diff --git a/middleware/urt_osal.h b/middleware/urt_osal.h
deleted file mode 100644
index 728672b..0000000
--- a/middleware/urt_osal.h
+++ /dev/null
@@ -1,850 +0,0 @@
-/*
-AMiRo-Apps is a collection of applications for the Autonomous Mini Robot (AMiRo) platform.
-Copyright (C) 2018..2019  Thomas Schöpping et al.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef _URT_OSAL_H_
-#define _URT_OSAL_H_
-
-/*============================================================================*/
-/* VERSION                                                                    */
-/*============================================================================*/
-
-/**
- * @brief   The µRtWare operating system abstraction layer interface major version.
- * @note    Changes of the major version imply incompatibilities.
- */
-#define URT_OSAL_VERSION_MAJOR                  0
-
-/**
- * @brief   The µRtWare operating system abstraction layer interface minor version.
- * @note    A higher minor version implies new functionalty, but all old interfaces are still available.
- */
-#define URT_OSAL_VERSION_MINOR                  1
-
-/*============================================================================*/
-/* DEPENDENCIES                                                               */
-/*============================================================================*/
-
-#include <urt_types.h>
-#include <amiroos.h>
-
-/*============================================================================*/
-/* TIME                                                                       */
-/*============================================================================*/
-
-/**
- * @brief   The urt_osTime_t represents time at an arbitrary precision.
- */
-typedef aos_timestamp_t urt_osTime_t;
-
-/**
- * @brief   Convert an urt_osTime_t to microseconds.
- *
- * @param[in]   time    The urt_osTime_t object to convert.
- *
- * @return  The time at microsecond precision.
- */
-static inline uint64_t urtTime2Us(urt_osTime_t* time)
-{
-  aosDbgCheck(time != NULL);
-
-  return *time;
-}
-
-/**
- * @brief   Retrieve the current system time.
- *
- * @return  The current system time.
- */
-static inline urt_osTime_t urtTimeNow(void)
-{
-  urt_osTime_t time;
-  aosSysGetUptime(&time);
-  return time;
-}
-
-/*============================================================================*/
-/* TIMER                                                                      */
-/*============================================================================*/
-
-/**
- * @brief   A timer type.
- */
-typedef aos_timer_t urt_osTimer_t;
-
-/**
- * @brief   Initialize a timer object.
- *
- * @param[in]   timer   The timer object to initialize.
- */
-static inline void urtTimerInit(urt_osTimer_t* timer)
-{
-  aosDbgCheck(timer != NULL);
-
-  aosTimerInit(timer);
-}
-
-/**
- * @brief   Set a timer to fire after a specified delay and execute the callback function.
- *
- * @param[in]   timer       The timer object.
- * @param[in]   delay       A delay after which the timer shall fire.
- * @param[in]   callback    The callback to be executed by the timer.
- * @param[in]   parameter   Optional parameters to the callback function.
- *
- * @return  Satus indicating whether execution was successful.
- */
-static inline urt_status_t urtTimerSet(urt_osTimer_t* timer, urt_delay_t delay, urt_osTimerCallback callback, void* parameter)
-{
-  aosDbgCheck(timer != NULL);
-  aosDbgCheck(callback != NULL);
-
-  if (sizeof(urt_delay_t) > sizeof(aos_interval_t)) {
-    aos_longinterval_t interval = delay;
-    aosTimerSetLongInterval(timer, &interval, callback, parameter);
-  } else {
-    aosTimerSetInterval(timer, delay, callback, parameter);
-  }
-  return URT_STATUS_OK;
-}
-
-/**
- * @brief   Reset a timer.
- *
- * @param[in]   timer   The timer to reset.
- *
- * @return  Status indicating whether execution was successful.
- */
-static inline urt_status_t urtTimerReset(urt_osTimer_t* timer)
-{
-  aosDbgCheck(timer != NULL);
-
-  aosTimerReset(timer);
-  return URT_STATUS_OK;
-}
-
-/**
- * @brief   Retrieve whether a timer is currently armed.
- *
- * @param[in]   timer   The timer to check.
- *
- * @return  Indicator whether the timer is armed.
- */
-static inline bool urtTimerIsArmed(urt_osTimer_t* timer)
-{
-  aosDbgCheck(timer != NULL);
-
-  return aosTimerIsArmed(timer);
-}
-
-/*============================================================================*/
-/* STREAMS                                                                    */
-/*============================================================================*/
-
-/**
- * @brief   Prints a formatted string to standard output.
- * @note    Behaves like standard C printf().
- *
- * @param[in] fmt   Formatted string to print.
- */
-#define urtPrintf(fmt, ...)                     aosprintf(fmt, ##__VA_ARGS__)
-
-/**
- * @brief   Prints a formatted string to error output.
- * @note    Behaves like to standard C printf().
- *
- * @param[in] fmt   Formatted string to print.
- */
-#define urtErrPrintf(fmt, ...)                  aosprintf(fmt, ##__VA_ARGS__)
-
-/*============================================================================*/
-/* EVENTS                                                                     */
-/*============================================================================*/
-
-/**
- * @brief   Type representing event masks.
- * @details Event masks can be used to distinguish and filter events.
- */
-typedef eventmask_t urt_osEventMask_t;
-
-/**
- * @brief   The event mask that is served by the kernel with highest priority.
- * @details It is assumed to be one of three values:
- *          * 1   Lower bits have higher priority.
- *          * -1  Higher bits have higher priority.
- *          * 0   Thekernel does not implement any priorities.
- */
-#define URT_EVENTMASK_MAXPRIO     (urt_osEventMask_t)1
-
-/**
- * @brief   Type representing event flags.
- * @details Event flags can be used to represent rudiemntary metadata or filter events.
- */
-typedef eventflags_t urt_osEventFlags_t;
-
-/**
- * @brief   Event source type.
- */
-typedef event_source_t urt_osEventSource_t;
-
-/**
- * @brief   Initialize an event source object.
- *
- * @param[in]   source    The event source object to initialize.
- */
-static inline void urtEventSourceInit(urt_osEventSource_t* source)
-{
-  aosDbgCheck(source != NULL);
-
-  chEvtObjectInit(source);
-}
-
-/**
- * @brief   Broadcast an event via the source.
- *
- * @param[in]   source    The event source to use for broadcasting.
- * @param[in]   flags     Flags to be broadcasted along with the event.
- */
-static inline void urtEventSourceBroadcast(urt_osEventSource_t* source, urt_osEventFlags_t flags)
-{
-  aosDbgCheck(source != NULL);
-
-  chEvtBroadcastFlags(source, flags);
-}
-
-/**
- * @brief   Event listener type.
- */
-typedef event_listener_t urt_osEventListener_t;
-
-/**
- * @brief   Initialize an event listener object.
- *
- * @param[in]   listener    The vent listener object to initialize.
- */
-static inline void urtEventListenerInit(urt_osEventListener_t* listener)
-{
-  aosDbgCheck(listener != NULL);
-
-  (void)listener;
-  return;
-}
-
-/**
- * @brief   Retrieve the flags of a listener.
- *
- * @param[in]   listener    Event listener to retrieve the flags from.
- *
- * @return  The flag mask of the event listener.
- */
-static inline urt_osEventFlags_t urtEventListenerGetFlags(urt_osEventListener_t* listener)
-{
-  aosDbgCheck(listener != NULL);
-
-  return listener->flags;
-}
-
-/**
- * @brief   Retrieve and clear the flags of listener.
- *
- * @param[in]   listener    Event listener to retrieve and clear the flags from.
- *
- * @return    The flag mask of the event listener before it was cleared.
- */
-static inline urt_osEventFlags_t urtEventListenerGetAndClearFlags(urt_osEventListener_t* listener)
-{
-  aosDbgCheck(listener != NULL);
-
-  return chEvtGetAndClearFlags(listener);
-}
-
-/**
- * @brief   Register an event source and listener with an individual event nask.
- *
- * @param[in]   source      The event source to register.
- * @param[in]   listener    The event listener to register.
- * @param[in]   mask        Individual event mask to idetify these evente.
- *
- * @return  Status indicating whether registration was successful.
- */
-static inline urt_status_t urtEventRegister(urt_osEventSource_t* source, urt_osEventListener_t* listener, urt_osEventMask_t mask)
-{
-  aosDbgCheck(source!= NULL);
-  aosDbgCheck(listener != NULL);
-
-  chEvtRegisterMask(source, listener, mask);
-  return URT_STATUS_OK;
-}
-
-/**
- * @brief   Unregister an event source and listener.
- *
- * @param[in]   source      The event source to unregister.
- * @param[in]   listener    The event listener to unregister.
- *
- * @return  Status indicating whether unregistration was successful.
- */
-static inline urt_status_t urtEventUnregister(urt_osEventSource_t* source, urt_osEventListener_t* listener)
-{
-  aosDbgCheck(source != NULL);
-  aosDbgCheck(listener != NULL);
-
-  chEvtUnregister(source, listener);
-  return URT_STATUS_OK;
-}
-
-/**
- * @brief   Wait for one, any or all specified events to occur.
- *
- * @param[in]   mask      An event mask for filtering events.
- * @param[in]   type      Specifier to define how to wait for one or multiple events.
- * @param[in]   timeout   Timeout after which the function will return.
- *
- * @return  The ORed event mask of all received events.
- *          In case of a timeout it will be zero.
- */
-static inline urt_osEventMask_t urtEventWait(urt_osEventMask_t mask, urt_osEventWaitType_t type, urt_delay_t timeout)
-{
-  switch (type) {
-    case URT_EVENT_WAIT_ONE:
-      return chEvtWaitOneTimeout(mask, timeout);
-    case URT_EVENT_WAIT_ANY:
-      return chEvtWaitAnyTimeout(mask, timeout);
-    case URT_EVENT_WAIT_ALL:
-      return chEvtWaitAllTimeout(mask, timeout);
-  }
-}
-
-/*============================================================================*/
-/* MUTEX LOCK                                                                 */
-/*============================================================================*/
-
-/**
- * @brief   Mutex lock type.
- */
-typedef mutex_t urt_osMutex_t;
-
-/**
- * @brief   Initialization of a mutex lock object.
- *
- * @param[in]   mutex   The mutex lock object to initialize.
- */
-static inline void urtMutexInit(urt_osMutex_t* mutex)
-{
-  aosDbgCheck(mutex != NULL);
-
-  chMtxObjectInit(mutex);
-}
-
-/**
- * @brief   Lock a mutex lock (blocking).
- * @details If the specified mutex is curently locked, the function will block until it could be acquired.
- *
- * @param[in]   mutex   The mutex lock to lock.
- */
-static inline void urtMutexLock(urt_osMutex_t* mutex)
-{
-  aosDbgCheck(mutex != NULL);
-
-  chMtxLock(mutex);
-}
-
-/**
- * @brief   Try to lock a mutex lock (unblocking)
- * @details If the mutex lock is currently locked, the function will return immediately.
- *
- * @param[in]   mutex   The mutex lock to lock.
- *
- * @return  Status indicating whether the mutex lock could be acquired.
- */
-static inline bool urtMutexTryLock(urt_osMutex_t* mutex)
-{
-  aosDbgCheck(mutex != NULL);
-
-  return chMtxTryLock(mutex);
-}
-
-/**
- * @brief   Unlock an owned mutex lock.
- *
- * @param[in]   mutex   The mutex lock to unlock.
- */
-static inline void urtMutexUnlock(urt_osMutex_t* mutex)
-{
-  aosDbgCheck(mutex != NULL);
-
-  chMtxUnlock(mutex);
-}
-
-/*============================================================================*/
-/* CONDITION VARIABLE                                                         */
-/*============================================================================*/
-
-/**
- * @brief   Condition variable type.
- */
-typedef condition_variable_t urt_osCondvar_t;
-
-/**
- * @brief   Initialize a condition variable object.
- *
- * @param[in]   condvar   The condition variable object to initualize.
- */
-static inline void urtCondvarInit(urt_osCondvar_t* condvar)
-{
-  aosDbgCheck(condvar != NULL);
-
-  chCondObjectInit(condvar);
-}
-
-/**
- * @brief   Signal a condition variable.
- *
- * @param[in]   condvar   The condition variable to be signaled.
- */
-static inline void urtCondvarSignal(urt_osCondvar_t* condvar)
-{
-  aosDbgCheck(condvar != NULL);
-
-  chCondSignal(condvar);
-}
-
-/**
- * @brief   Broadcast a condition variable.
- *
- * @param[in]   condvar   The condition variable to be broadcasted.
- */
-static inline void urtCondvarBroadcast(urt_osCondvar_t* condvar)
-{
-  aosDbgCheck(condvar != NULL);
-
-  chCondBroadcast(condvar);
-}
-
-/**
- * @brief   Wait for a condition variable.
- *
- * @param[in]   condvar   The condition variable to wait for.
- * @param[in]   mutex     A priviously acquired mutex lock.
- * @param[in]   timeout   A timeout when the function will return.
- *
- * @return  Status indicating how the condition variable was signaled or whether a timeout occurred.
- */
-static inline urt_condvarStatus_t urtCondvarWait(urt_osCondvar_t* condvar, urt_osMutex_t* mutex, urt_delay_t timeout)
-{
-  aosDbgCheck(condvar != NULL);
-  aosDbgCheck(mutex != NULL);
-
-  (void)mutex;
-
-  switch (chCondWaitTimeout(condvar, timeout)) {
-    case MSG_OK:
-      return URT_CONDVAR_STATUS_SIGNAL;
-    case MSG_RESET:
-      return URT_CONDVAR_STATUS_BROADCAST;
-    case MSG_TIMEOUT:
-      return URT_CONDVAR_STATUS_TIMEOUT;
-    default:
-      chSysHalt(__func__);
-      return URT_CONDVAR_STATUS_TIMEOUT;
-  }
-}
-
-/*============================================================================*/
-/* THREAD                                                                     */
-/*============================================================================*/
-
-/**
- * @brief   Thread priority data type.
- */
-typedef tprio_t urt_osThreadPrio_t;
-
-/**
- * @brief   Minimum thread priority.
- */
-#define URT_THREAD_PRIO_LOW_MIN                 AOS_THD_LOWPRIO_MIN
-
-/**
- * @brief   Maximum thread priority for low priority class threads.
- */
-#define URT_THREAD_PRIO_LOW_MAX                 AOS_THD_LOWPRIO_MAX
-
-/**
- * @brief   Minimum thread priority for normal priority class threads.
- */
-#define URT_THREAD_PRIO_NORMAL_MIN              AOS_THD_NORMALPRIO_MIN
-
-/**
- * @brief   Maximum thread priority for normal priority class threads.
- */
-#define URT_THREAD_PRIO_NORMAL_MAX              AOS_THD_NORMALPRIO_MAX
-
-/**
- * @brief   Minimum thread priority for high priority class threads.
- */
-#define URT_THREAD_PRIO_HIGH_MIN                AOS_THD_HIGHPRIO_MIN
-
-/**
- * @brief   Maximum thread priority for high priority class threads.
- */
-#define URT_THREAD_PRIO_HIGH_MAX                AOS_THD_HIGHPRIO_MAX
-
-/**
- * @brief   Minimum thread priority for real-time class threads.
- */
-#define URT_THREAD_PRIO_RT_MIN                  AOS_THD_RTPRIO_MIN
-
-/**
- * @brief   maximum thread priority for real-time class threads.
- */
-#define URT_THREAD_PRIO_RT_MAX                  AOS_THD_RTPRIO_MAX
-
-/**
- * @brief   Thread data type.
- */
-typedef thread_t urt_osThread_t;
-
-/**
- * @brief   Maximum number of seconds a thread can sleep.
- */
-#define URT_THREAD_SLEEP_MAX                    (float)AOS_THD_MAX_SLEEP_S
-
-/**
- * @brief   Maximum number of seconds a thread can sleep.
- */
-#define URT_THREAD_SSLEEP_MAX                   (unsigned int)AOS_THD_MAX_SLEEP_S
-
-/**
- * @brief   Maximum number of milliseconds a thread can sleep.
- */
-#define URT_THREAD_MSLEEP_MAX                   (unsigned int)AOS_THD_MAX_SLEEP_MS
-
-/**
- * @brief   Maximum number of microseconds a thread can sleep.
- */
-#define URT_THREAD_USLEEP_MAX                   (urt_delay_t)AOS_THD_MAX_SLEEP_US
-
-/**
- * @brief   Macro function to layout a thread memory.
- * @details The overall memory required for a thread usually is a combination of the stack and some further data (i.e. the thread object itself).
- *          The layout in memory as well as the metadata may differ between kernels and event hardware ports.
- *
- * @param[in]   varname     The name of the resulting buffer variable.
- * @param[in]   stacksize   The size of the thread's stack.
- */
-#define URT_THREAD_MEMORY(varname, stacksize)   THD_WORKING_AREA(varname, stacksize)
-
-/**
- * @brief   Initialize a thread object.
- * @details The thread is created but not started yet.
- *
- * @param[in]   memory    The thread memory to use (see @p URT_THREAD_MEMORY)
- * @param[in]   size      Size of the thread memory in bytes.
- * @param[in]   func      The thread main function to execute.
- *
- * @return  Pointer to the created thread object.
- */
-static inline urt_osThread_t* urtThreadInit(void* memory, size_t size, urt_osThreadFunction_t func)
-{
-  aosDbgCheck(memory != NULL);
-  aosDbgCheck(size != 0);
-  aosDbgCheck(func != NULL);
-
-  const thread_descriptor_t descriptor = {
-    /* name                         */ "",
-    /* pointer to working area base */ (stkalign_t*)memory,
-    /* end of the working area      */ &((stkalign_t*)memory)[size / sizeof(stkalign_t)],
-    /* thread priority              */ URT_THREAD_PRIO_LOW_MIN,
-    /* thread function pointer      */ func,
-    /* thread argument              */ NULL,
-    /* pointer to the parent thread */ chThdGetSelfX(),
-  };
-
-  urt_osThread_t* thread = chThdCreateSuspended(&descriptor);
-
-  // store the function pointer in the stack (required for urtThreadStart())
-  *((urt_osThreadFunction_t*)thread->wabase) = func;
-
-  return thread;
-}
-
-/**
- * @brief   Start a previously initialized thread.
- *
- * @param[in]   thread    Pointer to the thread to start.
- * @param[in]   prio      Priority to set for the thread.
- * @param[in]   arg       Optional arguments for the thread function.
- */
-static inline void urtThreadStart(urt_osThread_t* thread, urt_osThreadPrio_t prio, void* arg)
-{
-  aosDbgCheck(thread != NULL);
-  aosDbgCheck(prio >= URT_THREAD_PRIO_LOW_MIN && prio <= URT_THREAD_PRIO_RT_MAX);
-
-  PORT_SETUP_CONTEXT(thread, thread->wabase, thread, *(urt_osThreadFunction_t*)thread->wabase, arg);
-  chThdSetPriority(prio);
-  chThdStart(thread);
-}
-
-/**
- * @brief   The calling thread yields execution until it is scheduled again.
- */
-static inline void urtThreadYield(void)
-{
-  chThdYield();
-}
-
-/**
- * @brief   Retrieve the currently set priority of the calling thread.
- * @return
- */
-static inline urt_osThreadPrio_t urtThreadGetPriority(void)
-{
-  return chThdGetPriorityX();
-}
-
-/**
- * @brief   Set a new priority for the calling thread.
- *
- * @param[in]   prio    The new priority to set.
- */
-static inline void urtThreadSetPriority(urt_osThreadPrio_t prio)
-{
-  aosDbgCheck(prio >= URT_THREAD_PRIO_LOW_MIN && prio <= URT_THREAD_PRIO_RT_MAX);
-
-  chThdSetPriority(prio);
-}
-
-/**
- * @brief   suspend execution of the calling thread.
- */
-static inline void urtThreadSuspend()
-{
-  thread_reference_t ref = chThdGetSelfX();
-
-  chSysLock();
-  chThdSuspendS(&ref);
-  chSysUnlock();
-}
-
-/**
- * @brief   Resume a suspended thread.
- *
- * @param[in]   thread    The suspended thread to be resumed.
- *
- * @return  Status indicating whether resuming the thread was successful.
- */
-static inline urt_status_t urtThreadResume(urt_osThread_t* thread)
-{
-  aosDbgCheck(thread != NULL);
-
-  thread_reference_t ref = thread;
-
-  chSysLock();
-  chThdResumeS(&ref, thread->u.rdymsg);
-  chSysUnlock();
-
-  return URT_STATUS_OK;
-}
-
-/**
- * @brief   The calling thread sleeps for the specified amount of time (seconds).
- *
- * @param[in]   seconds   The duration to sleep in seconds.
- */
-static inline void urtThreadSleep(float seconds)
-{
-  aosDbgCheck(seconds <= URT_THREAD_SLEEP_MAX);
-
-  aosThdSleep(seconds);
-}
-
-/**
- * @brief   The calling thread sleeps for the specified amount of time (seconds).
- *
- * @param[in]   seconds   The duration to sleep in seconds.
- */
-static inline void urtThreadSSleep(unsigned int seconds)
-{
-  aosDbgCheck(seconds <= URT_THREAD_SSLEEP_MAX);
-
-  aosThdSSleep(seconds);
-}
-
-/**
- * @brief   The calling thread sleeps for the specified amount of time (milliseconds).
- *
- * @param[in]   milliseconds    The duration to sleep in milliseconds.
- */
-static inline void urtThreadMSleep(unsigned int milliseconds)
-{
-  aosDbgCheck(milliseconds <= URT_THREAD_MSLEEP_MAX);
-
-  aosThdMSleep(milliseconds);
-}
-
-/**
- * @brief   The calling thread sleeps for the specified amount of time (microseconds).
- *
- * @param[in]   microseconds    The duration to sleep in microseconds.
- */
-static inline void urtThreadUSleep(unsigned int microseconds)
-{
-  aosDbgCheck(microseconds <= URT_THREAD_USLEEP_MAX);
-
-  aosThdUSleep(microseconds);
-}
-
-/**
- * @brief   The calling thread sleeps until the specified system time.
- *
- * @param[in]   time    The system time to wake up again.
- */
-static inline void urtThreadSleepUntil(urt_osTime_t time)
-{
-  aosThdSleepUntil(&time);
-}
-
-/**
- * @brief   The calling thread terminates and ends execution.
- */
-static inline void urtThreadExit(void)
-{
-  chThdExit(MSG_OK);
-}
-
-/**
- * @brief   Make a thread terminate.
- *
- * @param[in]   thread    The thread to be terminated.
- * @param[in]   sig       The signal value how to terminate the thread.
- */
-static inline void urtThreadTerminate(urt_osThread_t* thread, urt_osThreadTerminateSignal_t sig)
-{
-  aosDbgCheck(thread != NULL);
-
-  /*
-   * TODO: implement kill functionality.
-   */
-  (void)sig;
-  chThdTerminate(thread);
-}
-
-/**
- * @brief   Wait for a thread to terminate.
- *
- * @param[in]   thread    The thread to wait for.
- *
- * @return  Status value of the terminated thread (0 = success).
- */
-static inline int urtThreadJoin(urt_osThread_t* thread)
-{
-  aosDbgCheck(thread != NULL);
-
-  return chThdWait(thread);
-}
-
-/**
- * @brief   Retrieve the current execution state of a thread.
- *
- * @param[in]   thread    Thread to retrieve the execution state from.
- *
- * @return  Execution state of the specified thread.
- */
-static inline urt_osThreadState_t urtThreadGetState(urt_osThread_t* thread)
-{
-  aosDbgCheck(thread != NULL);
-
-  switch (thread->state) {
-    case CH_STATE_CURRENT:
-      return URT_THREAD_STATE_RUNNING;
-    case CH_STATE_READY:
-      return URT_THREAD_STATE_READY;
-    case CH_STATE_SLEEPING:
-      return URT_THREAD_STATE_SLEEPING;
-    case CH_STATE_WTSTART:
-    case CH_STATE_SUSPENDED:
-      return URT_THREAD_STATE_SUSPENDED;
-    case CH_STATE_FINAL:
-      return URT_THREAD_STATE_TERMINATED;
-    case CH_STATE_QUEUED:
-    case CH_STATE_WTSEM:
-    case CH_STATE_WTMTX:
-    case CH_STATE_WTCOND:
-    case CH_STATE_WTEXIT:
-    case CH_STATE_WTOREVT:
-    case CH_STATE_WTANDEVT:
-    case CH_STATE_SNDMSGQ:
-    case CH_STATE_SNDMSG:
-    case CH_STATE_WTMSG:
-    default:
-      return URT_THREAD_STATE_WAITING;
-  }
-}
-
-/**
- * @brief   The calling thread retrieves a pointer to itself.
- *
- * @return  Pointer to the calling thread object.
- */
-static inline urt_osThread_t* urtThreadGetSelf(void)
-{
-  return chThdGetSelfX();
-}
-
-/**
- * @brief   Retrieve the first child of a thread.
- *
- * @param[in]   thread    Thread to retrieve the children from.
- *
- * @return  Pointer to the first child or @p NULL if the thread has no children.
- */
-static inline urt_osThread_t* urtThreadGetChildren(urt_osThread_t* thread)
-{
-  aosDbgCheck(thread != NULL);
-
-  return thread->children;
-}
-
-/**
- * @brief   Retrieve a sibling of a thread.
- *
- * @param[in]   thread    Thread to retrieve the siblsing from.
- *
- * @return  Pointer to the sibling thread or @p NULL if there are no further siblings.
- */
-static inline urt_osThread_t* urtThreadGetSibling(urt_osThread_t* thread)
-{
-  aosDbgCheck(thread != NULL);
-
-  return thread->sibling;
-}
-
-/**
- * @brief   Retrieve the parent of a thread.
- *
- * @param[in]   thread    Thread to retrieve the parent from.
- *
- * @return  Pointer to the parent thread or @p NULL if there is nor parent.
- */
-static inline urt_osThread_t* urtThreadGetParent(urt_osThread_t* thread)
-{
-  aosDbgCheck(thread != NULL);
-
-  return thread->parent;
-}
-
-#endif /* _URT_OSAL_H_ */
diff --git a/os/os.mk b/os/os.mk
index 33b6588..8281772 100644
--- a/os/os.mk
+++ b/os/os.mk
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
diff --git a/os/ossetup.sh b/os/ossetup.sh
index 9cdc9d7..be2020d 100755
--- a/os/ossetup.sh
+++ b/os/ossetup.sh
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -40,7 +40,7 @@ function printWelcomeText {
   printf "#                                                                    #\n"
   printf "######################################################################\n"
   printf "#                                                                    #\n"
-  printf "# Copyright (c) 2018..2019  Thomas Schöpping                         #\n"
+  printf "# Copyright (c) 2018..2020  Thomas Schöpping                         #\n"
   printf "#                                                                    #\n"
   printf "# This is free software; see the source for copying conditions.      #\n"
   printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
diff --git a/setup.sh b/setup.sh
index e5c1aa9..0fdcc3c 100755
--- a/setup.sh
+++ b/setup.sh
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications for the Autonomous Mini Robot     #
 # (AMiRo) platform.                                                            #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -40,7 +40,7 @@ function printWelcomeText {
   printf "#                                                                    #\n"
   printf "######################################################################\n"
   printf "#                                                                    #\n"
-  printf "# Copyright (c) 2018..2019  Thomas Schöpping                         #\n"
+  printf "# Copyright (c) 2018..2020  Thomas Schöpping                         #\n"
   printf "#                                                                    #\n"
   printf "# This is free software; see the source for copying conditions.      #\n"
   printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
diff --git a/tools/ide/QtCreator/QtCreatorSetup.sh b/tools/ide/QtCreator/QtCreatorSetup.sh
index eefc922..75e1cff 100755
--- a/tools/ide/QtCreator/QtCreatorSetup.sh
+++ b/tools/ide/QtCreator/QtCreatorSetup.sh
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications and configurations for the        #
 # Autonomous Mini Robot (AMiRo).                                               #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -40,7 +40,7 @@ function printWelcomeText {
   printf "#                                                                    #\n"
   printf "######################################################################\n"
   printf "#                                                                    #\n"
-  printf "# Copyright (c) 2018..2019  Thomas Schöpping                         #\n"
+  printf "# Copyright (c) 2018..2020  Thomas Schöpping                         #\n"
   printf "#                                                                    #\n"
   printf "# This is free software; see the source for copying conditions.      #\n"
   printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
diff --git a/tools/ide/idesetup.sh b/tools/ide/idesetup.sh
index bc1894e..64dcf7f 100755
--- a/tools/ide/idesetup.sh
+++ b/tools/ide/idesetup.sh
@@ -1,7 +1,7 @@
 ################################################################################
 # AMiRo-Apps is a collection of applications and configurations for the        #
 # Autonomous Mini Robot (AMiRo).                                               #
-# Copyright (C) 2018..2019  Thomas Schöpping et al.                            #
+# Copyright (C) 2018..2020  Thomas Schöpping et al.                            #
 #                                                                              #
 # This program is free software: you can redistribute it and/or modify         #
 # it under the terms of the GNU General Public License as published by         #
@@ -40,7 +40,7 @@ function printWelcomeText {
   printf "#                                                                    #\n"
   printf "######################################################################\n"
   printf "#                                                                    #\n"
-  printf "# Copyright (c) 2018..2019  Thomas Schöpping                         #\n"
+  printf "# Copyright (c) 2018..2020  Thomas Schöpping                         #\n"
   printf "#                                                                    #\n"
   printf "# This is free software; see the source for copying conditions.      #\n"
   printf "# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR  #\n"
